Главная страница
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.026 c
4-1103123827
-=SS=-
2004-12-15 18:17
2005.02.06
Можно ли по ID просесса узнать хендл окна этого просесса ?


14-1106094680
TButton
2005-01-19 03:31
2005.02.06
Starting, where the story ending...


6-1100601123
Alex_Petr
2004-11-16 13:32
2005.02.06
TidSMTP. Ошибка: failed to run checks


6-1101395412
Txst
2004-11-25 18:10
2005.02.06
Загрузка страницы HTTPS через Indy


11-1085667916
Kubr
2004-05-27 18:25
2005.02.06
KOL не ставится на Delphi 2