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

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
Moto
Сообщения: 6
Зарегистрирован: 06 июн 2008, 12:59

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

Сообщение Moto » 06 июн 2008, 13:19

Привет всем. Честно поискал в поиске, не пинайте если проглядел, затупил, никак не могу разобраться, плиз хелп???

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

Есть 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 - ругается на нарушение целостности ключа....

Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

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

Сообщение Antoxa » 06 июн 2008, 13:54

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

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

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

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

Moto
Сообщения: 6
Зарегистрирован: 06 июн 2008, 12:59

Сообщение Moto » 07 июн 2008, 02:04

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

Moto
Сообщения: 6
Зарегистрирован: 06 июн 2008, 12:59

Сообщение Moto » 07 июн 2008, 03:11

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

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

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

Ответить