Страница 1 из 1

IBDataSet, MasterData&DetData проблема с добавить запись

Добавлено: 06 июн 2008, 13:19
Moto
Привет всем. Честно поискал в поиске, не пинайте если проглядел, затупил, никак не могу разобраться, плиз хелп???

Вопрос вот какой.

Есть MasterData (IBDataSet1 + IBTranzaction1 + OraDataSource1 + DBGrid1). Табилца имеет структуру TABLE1(ID, DATA).
Есть DetailedData, для таблицы TABLE2(ID_T2, ID_T1, DATA). ID_T1 - это ключ TABLE1.ID.
ID и ID_T2 - проставляются триггером (генераторами).
В IBDataSet2:
1. DataSourse = OraDataSource1
2. SelectSQL = 'SELECT * FROM TABLE2 WHERE ID_T1 = :ID'
на форме когда я перехожу по записям в DBGrid1 в DBGrid2 отображаются те которые надо(TABLE2.ID_T1=TABLE1.ID), т.е. Select работает корректно. Проблемы начинаются при попытке ввода новой записи в DBGrid2. В IBDataSet2 GEneratorField я поставил, поле ID_T2 значение проставляется.
Ругается на то, что значение ID_T1 null :( Что за ерунда не понимаю, InsertSQL = 'INSERT INTO TABLE2 (ID_T1, DATA) VALUES(:ID, :DATA)'. Если руками подставлять значение ID_T1 d событии BeforePost - ругается на нарушение целостности ключа....

Re: IBDataSet, MasterData&DetData проблема с добавить за

Добавлено: 06 июн 2008, 13:54
Antoxa
Moto писал(а):Привет всем. Честно поискал в поиске, не пинайте если проглядел, затупил, никак не могу разобраться, плиз хелп???

Вопрос вот какой.

Есть MasterData (IBDataSet1 + IBTranzaction1 + OraDataSource1 + ...

Видимо неизвестно ID_T1 на этот момент. Проверь. Может необходимо обновить данные по записи, чтобы компонент получил число созданное сервером с помошью связки Триггер -Генератор

Добавлено: 07 июн 2008, 02:04
Moto
Стоп - стоп, как так неизвестно ID_T1? Вот это то срабатывает: 'SELECT * FROM TABLE2 WHERE ID_T1 = :ID' ! И при переходе по записям в Master гриде Detail грид правильные записи отображает, т.е. СЕЛЕКТ отрабатывается правильно...
И потом, MasterData у меня только read only, никаких изменений не делается там, только отображение существующей инфорации, так что ID не генерируется, уже сгенерировано и есть....

Добавлено: 07 июн 2008, 03:11
Moto
В общем то правильно говорят всегда: "читайте книжки" :) да времени нет. Вопрос решается следующим образом. На IBDataSet Detailed OnNewRecord пишем:

IBDataSet2.FieldByName('IDT1').AsInt := IBDataSet1.FielByName('ID').AsInt;

вот тогда получается, что второй дата сет будет знать значение IDT1.
Как-то странно, перед селектом не надо явно указывать ничего, нужно чтобы имя параметра совпадало с именем необходимого столбца в мастер дата, а в Инсерте не проканывает :evil: