![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Импорт записей в главную и подчиненную таблицы из файла
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 записи в главной таблице
Она , очевидно, в триггере формируется обращением к соотв.генератору ?