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

Вниз

Как перехватить значение с GeneratorField   Найти похожие ветки 

 
Yurisimus   (2005-01-07 09:07) [0]

Ситуация такая : Есть две таблицы, которые нужно связать по одному ID(допустим шапка сделки и сам список к этой сделке). При создании новой записи в шапке сделки нужно перехватить ID сделки и присвоить его списку сделки.
А теперь сам вопрос : Как это можно осуществить при помощи IBDataSet и его свойства GeneratorField, т.е. как перехватывать его значение , если можно - пример.


 
P.N.P. ©   (2005-01-07 09:25) [1]

У IBDataSet есть события AfterPost, BeforePost - вот там и перехватывай.
например


procedure TForm1.IBDataSet1AfterPost(DataSet: TDataSet);
begin
SpisokSdelkiID:=IBDataSet1.FieldByName("ID").AsInteger;
end;


 
kaif ©   (2005-01-07 15:47) [2]

Можно (я обычно так и делаю) для компонента TField поля ID в подчиненном DataSet установить значение Required := False и в событии BeforePost подчиненного датасета присваивать значение полю, беря его из "главного" датасета так же, как показал P.N.P.
Можно в событии AfterInsert подчиненного датасета делать это. Тогда Required можно оставить True. Но при работе в сетке я бы не рекомендовал этот подход, так как после присвоения ID полю в только что вставленной записи подчиненный датасет уже будет пытаться делать Post после того как юзер пытается "уйти" с пока пустой для него строки.
------------
Важно помнить лишь, что значение генератора запрашивается IBDataSet-ом в его методе Post. Так что если используется механизм GeneratorField, то не вызвавPost, получить значение генератора невозможно. Если нужно избежать Post во что бы то ни стало, то следует реализовать запрос очередного значения генератора вручную (отдельным запросом).
------------
Наилучшим мне кажется решение, в котором оба запроса подключены к одной транзакции, которая подтверждается/откатывается впоследствии. Можно не беспокоясь делать Post в главном датасете, получать ID и уже потом делать INSERT в младшем датасете, "зная" это значение, как уже "явное значение" поля ID главного датасета. Генератор щелкнет в любом случае (он работает вне контекста транзакции), а вот оба добавления можно будет отменить, откатив общую транзакцию.
Я в базе данных всегда декларирую еще и внешний ключ (FOREIGN KEY) подчиненной таблицы на главную, чтобы ни в коем случае не получить ID в подчиненной таблице, который не соответствовал бы никакой записи в главной.



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

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

Наверх




Память: 0.47 MB
Время: 0.056 c
4-1103012818
ПЛОВ
2004-12-14 11:26
2005.02.06
CreateProcessWithLogonW


1-1106322651
redlord
2005-01-21 18:50
2005.02.06
проблемы после переустановки делфи


4-1103552114
berezne
2004-12-20 17:15
2005.02.06
Как програмно выключить компьютер?


14-1105711357
klyg
2005-01-14 17:02
2005.02.06
Выбор темы для дипломного проекта


14-1105887304
Grief
2005-01-16 17:55
2005.02.06
КАК?