Форум: "Начинающим";
Текущий архив: 2009.05.17;
Скачать: [xml.tar.bz2];
ВнизИмпорт записей в главную и подчиненную таблицы из файла Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c