Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.004 c
15-1280953799
Юрий
2010-08-05 00:29
2010.11.14
С днем рождения ! 5 августа 2010 четверг


15-1280694604
Юрий
2010-08-02 00:30
2010.11.14
С днем рождения ! 2 августа 2010 понедельник


11-1226388197
Максим
2008-11-11 10:23
2010.11.14
Ошибка в последнем дистрибутиве KOL MCK!


2-1282162174
Kinnermann
2010-08-19 00:09
2010.11.14
Отслеживание изменения экрана


2-1281961993
12
2010-08-16 16:33
2010.11.14
как AnsiUpperCase для одного символа на русском?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский