Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Импорт записей в главную и подчиненную таблицы из файла


bobwild ©   (2009-04-02 11:06:00) 

Добрый день!

Делаю базу данных на СУБД Firebird, проект на Delphi 7 + FIBPlus компоненты.

Столкнулся вот с такой проблемкой:
Есть файл с данными, которые нужно импортировать в базу.
Данные в файле четко структурированы.
Операция разбора файла выделяет данные для занесения в таблицу.
Мы должны последовательно занести данные в таблицы: сначала в главнуюю затем, узнав ID записи в главной таблице, занести в дочернии.

Вот как узнать ID записи в главной таблице?????

вот простенький код вставки записей из цикла обработки файла импорта:...

{занесение записи в главную таблицу Main}
MainDataModule.pFIBDataSetMain.Insert();
MainDataModule.pFIBDataSetMainFIELD1. AsString := Str1;
MainDataModule.pFIBDataSetMainFIELD2. AsString := Str2;
MainDataModule.pFIBDataSetMain.Post();

{занесение записив дочернюю таблицу Slave}
MainDataModule.pFIBDataSetSlave.Insert();
MainDataModule.pFIBDataSetSlaveFK. AsInteger := ??????? ID записи из главной таблицы?????
MainDataModule.pFIBDataSetRolesFIELD3. AsString := Str3;
MainDataModule.pFIBDataSetSlave.Post();

Заранее спасибо.


Игорь Шевченко   (2009-04-02 14:20:00) [1]

Дикая фасоль   (02.04.09 11:15) [2]
Одичавший горошек   (02.04.09 12:10) [4]
Горошек в трусочек   (02.04.09 13:33) [7]

Читаем правила форума, не удивляемся


Сергей М.   (2009-04-02 13:43:00) [2]


> способ с Select Gen_Id(Gen_name,X) будет работать в однопользовательском
> режиме а-ля "монопольный режим 1С" или же для Firebird embedded-
> версии


С чего бы вдруг ?
Генераторы в IB/FB/YA работают вне контекстов транзакций.


Sergey13   (2009-04-02 13:42:00) [3]

> [7] Горошек в трусочек   (02.04.09 13:33)
> Я о том - что этот способ с Select Gen_Id(Gen_name,X) будет
> работать в однопользовательском режиме

С чего бы это?


Горошек в трусочек   (2009-04-02 13:33:00) [4]


> Sergey13 ©   (02.04.09 13:18) [6]
> Это ты про то что вычитать нужно Х-1? Так это не плавающая ощибка а постоянная. 8-)

Я о том - что этот способ с Select Gen_Id(Gen_name,X) будет работать в однопользовательском режиме а-ля "монопольный режим 1С" или же для Firebird embedded-версии.

А из вопроса непонятно - будет ли эта операция единоразовой под контролем программиста или же это будет работать с кучей юзеров одновременно...

Мне кажеться, что всётаки лучше удет организовать код вставки и получения ID отдельной ранимой процедурой :)


Sergey13   (2009-04-02 13:18:00) [5]

> [4] Одичавший горошек   (02.04.09 12:10)

Это ты про то что вычитать нужно Х-1? Так это не плавающая ощибка а постоянная. 8-)
С другой стороны я ведь не код для копипаста написал, а идею.


Sergey13   (2009-04-02 12:52:00) [6]

> [4] Одичавший горошек   (02.04.09 12:10)

Обоснуй.


Одичавший горошек   (2009-04-02 12:10:00) [7]


> Sergey13 ©   (02.04.09 11:34) [3]
> Получишь Id - последней записи. Вычти их него Х и получишь Id первой...

... и потенциальный источник плавающих ошибок :)


Sergey13   (2009-04-02 11:34:00) [8]

> [0] bobwild   (02.04.09 11:06)
> Вот как узнать ID записи в главной таблице?????

Select Gen_Id(Gen_name,X) from rdb$database
где X - количество вставляемых записей.
Получишь Id - последнейзаписи. Вычти их него Х и получишь Id первой. Далее в цикле наращивай Id на 1.
Естественно в тригере нужно загасить генерацию при заранее известном new.Id.


Дикая фасоль   (2009-04-02 11:15:00) [9]

Хранимая процедура + query спасёт отца русской демократии...


Сергей М.   (2009-04-02 11:12:00) [10]


> узнав ID записи в главной таблице


Она , очевидно, в триггере формируется обращением к соотв.генератору ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо