Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.17;
Скачать: CL | DM;

Вниз

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

 
bobwild   (2009-04-02 11:06) [0]

Добрый день!

Делаю базу данных на СУБД 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 11:12) [1]


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


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


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

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


 
Sergey13 ©   (2009-04-02 11:34) [3]

> [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 12:10) [4]


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

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


 
Sergey13 ©   (2009-04-02 12:52) [5]

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

Обоснуй.


 
Sergey13 ©   (2009-04-02 13:18) [6]

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

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


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


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

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

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

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


 
Sergey13 ©   (2009-04-02 13:42) [8]

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

С чего бы это?


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


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


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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2009.05.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.008 c
2-1238898035
Cabyrc
2009-04-05 06:20
2009.05.17
OpenDialog


2-1238676821
f3nd3r
2009-04-02 16:53
2009.05.17
С++ DLL в Delphi


15-1237121039
anton773
2009-03-15 15:43
2009.05.17
webbrowser и dll


11-1200515589
Vinum
2008-01-16 23:33
2009.05.17
как скопировать текст в буфер


15-1237292509
Unknown user
2009-03-17 15:21
2009.05.17
Просмотр связей между модулями в проектах Delphi