Конференция "Базы" » Параметры в InsertSQL дочернего TIBDataset [Firebird 1_5]
 
  • _drug_ (16.07.09 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 (16.07.09 08:33) [1]
    у дочернего DataSet укажите свойство DataSource родительского DataSet
  • _drug_ (16.07.09 09:31) [2]
    Указано. Просто навигация по записям работает отлично, т.е. SelectSQL дочернего НД связан с родительским, проблема возникает при добавлении записей в InsertSQL. Впечатление, что связь между родительским и дочерним НД через свойство DataSource дочернего НД работает только для SelectSQL.
  • VitGun (16.07.09 10:40) [3]
    а запись добавляешь как? IBDataSet.Insert? Если да, то вручную указывай CLIENT_ID
  • _drug_ (16.07.09 11:11) [4]
    запись добавляю с помощью InsertSQL, больше ничего не делаю. запись добавляется, но поле CLIENT_ID или равно null и тогда ругается БД, либо равно 0.
  • VitGun (16.07.09 11:14) [5]
    а зачем? чем не устраивает код вставки который генерирует сама IDE?
  • Вариант (16.07.09 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 (точнее какого клиента ему выбрать).  Как он выбирает клиента?
  • OnNewRecord поможет отцу русской демократии.. я с IBX не работал, с ФИБами.. в ФИБах мастер подставляется, если подкорректировать малость InsertSQL(добавляешь впереди параметра на вставку префикс MAS_) возможно, в IBX так же... если нет, то первый вариант 100%
  • PEAKTOP © (16.07.09 12:19) [8]
    > возможно, в IBX так же...

    Не-а.

    >если нет, то первый вариант 100%
    Вот именно. В IBX он и только он: OnNewRecord
  • _drug_ (16.07.09 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_ (16.07.09 12:32) [10]

    > >если нет, то первый вариант 100%
    > Вот именно. В IBX он и только он: OnNewRecord

    Т.е. в TIBDataset параметры можно использовать только в свойстве SelectSQL?
  • Вариант (16.07.09 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_ (16.07.09 15:05) [12]

    > Виталий Панасенко(дом)


    > PEAKTOP

    благодарю за подсказку, про фибы и префикс mas_ в курсе, про то, что он не работает в IBX тоже. :)
    Реализовал все как вы и посоветовали через OnNewRecord, есс-но работает.


    > Вариант  

    спасибо что помог мои предположения сделать уверенностью :)

    З.Ы. Насчет DBGrid - у меня не сложное приложение, юзаю его я единолично, пока DBGrid устраивает. К тому же у меня множество записей с парой-тройкой полей, селект из одной таблицы - DBGrid удобен. Когда пойдет обработка сложных записей из нескольких таблиц, тогда модальная форма будет удобней. Пока я думаю так.
 
Конференция "Базы" » Параметры в InsertSQL дочернего TIBDataset [Firebird 1_5]
Есть новые Нет новых   [134474   +34][b:0][p:0]