Форум: "Базы";
Текущий архив: 2010.11.14;
Скачать: [xml.tar.bz2];
ВнизПараметры в InsertSQL дочернего TIBDataset Найти похожие ветки
← →
_drug_ (2009-07-16 08:06) [0]использую два 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"а? Как мне сослаться на родительский НД в таком случае?
← →
Vitgun (2009-07-16 08:33) [1]у дочернего DataSet укажите свойство DataSource родительского DataSet
← →
_drug_ (2009-07-16 09:31) [2]Указано. Просто навигация по записям работает отлично, т.е. SelectSQL дочернего НД связан с родительским, проблема возникает при добавлении записей в InsertSQL. Впечатление, что связь между родительским и дочерним НД через свойство DataSource дочернего НД работает только для SelectSQL.
← →
VitGun (2009-07-16 10:40) [3]а запись добавляешь как? IBDataSet.Insert? Если да, то вручную указывай CLIENT_ID
← →
_drug_ (2009-07-16 11:11) [4]запись добавляю с помощью InsertSQL, больше ничего не делаю. запись добавляется, но поле CLIENT_ID или равно null и тогда ругается БД, либо равно 0.
← →
VitGun (2009-07-16 11:14) [5]а зачем? чем не устраивает код вставки который генерирует сама IDE?
← →
Вариант (2009-07-16 11:56) [6]
> _drug_ (16.07.09 11:11) [4]
> запись добавляю с помощью InsertSQL, больше ничего не делаю.
> запись добавляется, но поле CLIENT_ID или равно null и
> тогда ругается БД, либо равно 0
.
InsertSQL -это только совйство, в которое мы записываем SQL команду, для вставки записи. Вопрос в [3] верный, а вот ответ в [4] не понятен. А что приводит к вставке записи? Вызов метода инсерт, перемещение за последнюю строку в DBGrid, нажатие кнопки в DBNavigator?
И еще следующий вопрос - откуда взять CLIENT_ID? Ты вставил новую запись (после вставки поля в записи незаполнены), юзер еще не решил, чему равно CLIENT_ID (точнее какого клиента ему выбрать). Как он выбирает клиента?
← →
Виталий Панасенко(дом) (2009-07-16 11:58) [7]OnNewRecord поможет отцу русской демократии.. я с IBX не работал, с ФИБами.. в ФИБах мастер подставляется, если подкорректировать малость InsertSQL(добавляешь впереди параметра на вставку префикс MAS_) возможно, в IBX так же... если нет, то первый вариант 100%
← →
PEAKTOP © (2009-07-16 12:19) [8]> возможно, в IBX так же...
Не-а.
>если нет, то первый вариант 100%
Вот именно. В IBX он и только он: OnNewRecord
← →
_drug_ (2009-07-16 12:30) [9]
> InsertSQL -это только совйство, в которое мы записываем
> SQL команду, для вставки записи. Вопрос в [3] верный, а
> вот ответ в [4] не понятен. А что приводит к вставке записи?
> Вызов метода инсерт, перемещение за последнюю строку в
> DBGrid, нажатие кнопки в DBNavigator?
>
> И еще следующий вопрос - откуда взять CLIENT_ID? Ты вставил
> новую запись (после вставки поля в записи незаполнены),
> юзер еще не решил, чему равно CLIENT_ID (точнее какого клиента
> ему выбрать). Как он выбирает клиента?
Начну с конца. Выбор клиента происходит в родительском НД. В свойстве SelectSQL дочернего TIBDataset"а есть параметр :CLIENT_ID. Поэтому когда просто просматриваю записи (и когда используется SelectSQL) все отлично, параметр :CLIENT_ID равен значению родительского датасета. А вот когда делаю вставку (либо через дбнавигатор, либо при смене строки в дбгрид), используется свойство InsertSQL и в этом случает значение параметра :CLIENT_ID или 0, или NULL.
← →
_drug_ (2009-07-16 12:32) [10]
> >если нет, то первый вариант 100%
> Вот именно. В IBX он и только он: OnNewRecord
Т.е. в TIBDataset параметры можно использовать только в свойстве SelectSQL?
← →
Вариант (2009-07-16 13:21) [11]
> _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, проблем больше чем плюсов от редактирования. Вызови отдельную модальную форму редактирования... мне кажется так лучше.
← →
_drug_ (2009-07-16 15:05) [12]
> Виталий Панасенко(дом)
> PEAKTOP
благодарю за подсказку, про фибы и префикс mas_ в курсе, про то, что он не работает в IBX тоже. :)
Реализовал все как вы и посоветовали через OnNewRecord, есс-но работает.
> Вариант
спасибо что помог мои предположения сделать уверенностью :)
З.Ы. Насчет DBGrid - у меня не сложное приложение, юзаю его я единолично, пока DBGrid устраивает. К тому же у меня множество записей с парой-тройкой полей, селект из одной таблицы - DBGrid удобен. Когда пойдет обработка сложных записей из нескольких таблиц, тогда модальная форма будет удобней. Пока я думаю так.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2010.11.14;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.003 c