-
использую два TIBDataset связанные отношением master-detail. Родительский НД(набор данных): SelectSQL - select client_id, client from tclients order by client
Дочерний НД: SelectSQL - select id, client_id, info from tcontacts where client = :client_id
Все великолепно работает если просто просматривать записи. Для добавления записей я создал в дочернем НД следующий запрос:
insert into TCONTACTS (CLIENT_ID, INFO) values(:CLIENT_ID, :INFO)
в надежде, что вместо :CLIENT_ID будет подставлено значение из родительского датасета, info берется из DBGrid'а (id генерится триггером). Но при выполнении вылетает ошибка, что значение CLIENT_ID равно NULL. Получается он берет его тоже из DBGrid'а? Как мне сослаться на родительский НД в таком случае?
-
у дочернего DataSet укажите свойство DataSource родительского DataSet
-
Указано. Просто навигация по записям работает отлично, т.е. SelectSQL дочернего НД связан с родительским, проблема возникает при добавлении записей в InsertSQL. Впечатление, что связь между родительским и дочерним НД через свойство DataSource дочернего НД работает только для SelectSQL.
-
а запись добавляешь как? IBDataSet.Insert? Если да, то вручную указывай CLIENT_ID
-
запись добавляю с помощью InsertSQL, больше ничего не делаю. запись добавляется, но поле CLIENT_ID или равно null и тогда ругается БД, либо равно 0.
-
а зачем? чем не устраивает код вставки который генерирует сама IDE?
-
> _drug_ (16.07.09 11:11) [4]
> запись добавляю с помощью InsertSQL, больше ничего не делаю. > запись добавляется, но поле CLIENT_ID или равно null и > тогда ругается БД, либо равно 0
.
InsertSQL -это только совйство, в которое мы записываем SQL команду, для вставки записи. Вопрос в [3] верный, а вот ответ в [4] не понятен. А что приводит к вставке записи? Вызов метода инсерт, перемещение за последнюю строку в DBGrid, нажатие кнопки в DBNavigator?
И еще следующий вопрос - откуда взять CLIENT_ID? Ты вставил новую запись (после вставки поля в записи незаполнены), юзер еще не решил, чему равно CLIENT_ID (точнее какого клиента ему выбрать). Как он выбирает клиента?
-
OnNewRecord поможет отцу русской демократии.. я с IBX не работал, с ФИБами.. в ФИБах мастер подставляется, если подкорректировать малость InsertSQL(добавляешь впереди параметра на вставку префикс MAS_) возможно, в IBX так же... если нет, то первый вариант 100%
-
> возможно, в IBX так же...
Не-а.
>если нет, то первый вариант 100% Вот именно. В IBX он и только он: OnNewRecord
-
> InsertSQL -это только совйство, в которое мы записываем > SQL команду, для вставки записи. Вопрос в [3] верный, а > вот ответ в [4] не понятен. А что приводит к вставке записи? > Вызов метода инсерт, перемещение за последнюю строку в > DBGrid, нажатие кнопки в DBNavigator? > > И еще следующий вопрос - откуда взять CLIENT_ID? Ты вставил > новую запись (после вставки поля в записи незаполнены), > юзер еще не решил, чему равно CLIENT_ID (точнее какого клиента > ему выбрать). Как он выбирает клиента?
Начну с конца. Выбор клиента происходит в родительском НД. В свойстве SelectSQL дочернего TIBDataset'а есть параметр :CLIENT_ID. Поэтому когда просто просматриваю записи (и когда используется SelectSQL) все отлично, параметр :CLIENT_ID равен значению родительского датасета. А вот когда делаю вставку (либо через дбнавигатор, либо при смене строки в дбгрид), используется свойство InsertSQL и в этом случает значение параметра :CLIENT_ID или 0, или NULL.
-
> >если нет, то первый вариант 100% > Вот именно. В IBX он и только он: OnNewRecord
Т.е. в TIBDataset параметры можно использовать только в свойстве SelectSQL?
-
> _drug_ (16.07.09 12:30) [9]
> А вот когда делаю вставку (либо через дбнавигатор, либо > при смене строки в дбгрид), используется свойство InsertSQL > и в этом случает значение параметра :CLIENT_ID или 0, или > NULL.
И это правильно. Если вернуться к
> _drug_ (16.07.09 09:31) [2]
> Впечатление, что связь между родительским и дочерним НД > через свойство DataSource дочернего НД работает только для > SelectSQL.
Можно сказать впечатление в данном случае верное , ибо связи после вызова метода Insert нет.
При select у тебя есть соотвествие между полями связи tclients.client_id (таблица справочник) и TCONTACTS.client_id. И поэтому ты можешь например вместо поля TCONTACTS.client_id показать юзеру tclients.client. Записи в tclients позиционируются в соотвествии с TCONTACTS.client_id=tclients.client_id Теперь ты делаешь вставку в TCONTACTS, поле TCONTACTS.client_id равно NULL, и если ты его значение не заполнишь ручками ли (своим кодом), и/или из каких-либо компонентов типа DBLookUpComboBox или других, то иначе откуда ему взяться? И справочник сам тебе не подставит значение только потому, что он указан в связке мастер - детаил, ибо поле связи после вызова метода insert равно NULL. И совет - не делай редактирование записей в DBGRID, проблем больше чем плюсов от редактирования. Вызови отдельную модальную форму редактирования... мне кажется так лучше.
-
> Виталий Панасенко(дом)
> PEAKTOP
благодарю за подсказку, про фибы и префикс mas_ в курсе, про то, что он не работает в IBX тоже. :) Реализовал все как вы и посоветовали через OnNewRecord, есс-но работает.
> Вариант
спасибо что помог мои предположения сделать уверенностью :)
З.Ы. Насчет DBGrid - у меня не сложное приложение, юзаю его я единолично, пока DBGrid устраивает. К тому же у меня множество записей с парой-тройкой полей, селект из одной таблицы - DBGrid удобен. Когда пойдет обработка сложных записей из нескольких таблиц, тогда модальная форма будет удобней. Пока я думаю так.
|