Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.11.14;
Скачать: CL | DM;

Вниз

Параметры в 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.009 c
2-1282306183
подмастерье
2010-08-20 16:09
2010.11.14
Создание своей формы


2-1282059473
2expres
2010-08-17 19:37
2010.11.14
Mediaplayer и .wav


4-1241257034
AHTOLLlKA
2009-05-02 13:37
2010.11.14
как сохранить ветку реестра???


2-1282150418
Ярослав
2010-08-18 20:53
2010.11.14
Иконка приложения


10-1170009942
makaronX
2007-01-28 21:45
2010.11.14
разметить страницу в Excel