Конференция "Базы" » Fib+ ClientDataSet + MasterDetail = Key Violation [D7]
 
  • Девушка (18.09.08 23:27) [0]
    Использую FIB+ (СУБД Firebird 2.0)

    На форме лежит датасет Man (люди), с привязаным датасорсом, к которому привязан грид. Все запросы прописаны, люди добавляются, убираются, редактируются и т.д.

    Далее на форме лежит связка
    Датасет-Провайдер-КлиентДатасет-Датасорс-Грид, которые открывают таблицу, связанную внешним ключем с таблицей Man (внешний ключ прописан в БД)

    В клиентдатасете настроен Мастерсорс, Мастерфилд и ИндексФиелдНейм таким образом, что при смене текущего человека (если двигаем курсор по Man) меняется содержимое связного датасета.

    Все замечательно работает, если для каждого человека есть связные записи. Но если у какого-то человека связных записей нет - идут ошибки "Key Violation" и разнообразные глюки. Так, записи в detail таблице могут множится, если двигаться курсором по master таблице.

    1) Как это лечится?
    2) Есть ли ссылка популярно объясняющаяя как на FIB-х сделать master-detail (найденные яндексом документы не помогли)?

    p.s. после 5-ти часовых попыток исправить мысли могут выражены мутновато.
  • Johnmen © (18.09.08 23:29) [1]
    Можно поинтересоваться, зачем здесь клиентдатасет?
  • Девушка (18.09.08 23:34) [2]

    > Можно поинтересоваться, зачем здесь клиентдатасет?

    Он является Detail - датасетом. А в чем крамола?
  • Johnmen © (18.09.08 23:42) [3]
    Так почему же именно клиентдатасет???
  • Девушка (19.09.08 06:01) [4]

    > Так почему же именно клиентдатасет???

    1) С целью исключения блокировок (схема, подобная описаной тут http://ibase.ru/devinfo/dbexpress.htm)
    2) Пропертисов, типа мастер_филд у обычного ФИБ-датасета не найдено (если есть -ткните пальцем плз.)
  • Девушка (19.09.08 07:13) [5]

    > Девушка   (19.09.08 06:01) [4]
    >
    > 2) Пропертисов, типа мастер_филд у обычного ФИБ-датасета
    > не найдено (если есть -ткните пальцем плз.)
    >

    Механизм найден путем гугления... однако, исходная проблема осталась. Если использовать клиентдатасет имеем "Key Violation"
  • Sergey13 © (19.09.08 08:31) [6]
    > [4] Девушка   (19.09.08 06:01)
    > 1) С целью исключения блокировок

    Каких?

    > 2) Пропертисов, типа мастер_филд у обычного ФИБ-датасета не найдено (если есть -ткните пальцем плз.)
    Даже если нет "пропертисов" есть всегда событие onAfterScroll у мастер-датасета, в котором можно переоткрыть детайл с нужным параметром.
  • Девушка (19.09.08 08:37) [7]

    > > 1) С целью исключения блокировок
    > Каких?

    Если запускается два клиента и связка Датасет-Провайдер-КлиентДатасет-Датасорс-Грид то оба могут редактировать запись одновременно. Кто последний закоммитил, тот и прав.

    Да и вообще так как то шустрее работает что ли... Это субъективное впечатление.


    > Даже если нет "пропертисов" есть всегда событие onAfterScroll
    > у мастер-датасета, в котором можно переоткрыть детайл с
    > нужным параметром.
    Подробное описание "как это сделать" тут http://klog.h17.ru/interbase/chapter2/1.html#29
  • Sergey13 © (19.09.08 09:04) [8]
    > [7] Девушка   (19.09.08 08:37)
    > Кто последний закоммитил, тот и прав.

    Это проблема более организационная нежели программная. Если уж надо заблокировать записи, то вполне можно написать for update в запросе (вроде это работает в ФБ). Хотя я бы не советовал этим злоупотреблять.

    > Подробное описание "как это сделать" тут http://klog.h17.ru/interbase/chapter2/1.html#29
    Да я в общем то догадываюсь как это делать, т.к. уже лет 10 пользуюсь "своим" методом из [6] и практически не пользуюсь "пропертисами" М-Д.
  • Johnmen © (19.09.08 09:16) [9]

    > Девушка   (19.09.08 06:01) [4]
    > 1) С целью исключения блокировок (схема, подобная описаной тут http://ibase.ru/devinfo/dbexpress.htm)
    2) Пропертисов, типа мастер_филд у обычного ФИБ-датасета не найдено (если есть -ткните пальцем плз.)

    1.
    рекомендуется к прочтению http://www.ibase.ru/devinfo/ibtrans.htm
    и др.материалы про конкурирующие транзакции.
    2.
    реккомендуется к прочтению хелп по FIB+ с целью освоения механизма реализации М-Д.
  • Девушка (19.09.08 10:39) [10]

    > Даже если нет "пропертисов" есть всегда событие onAfterScroll
    > у мастер-датасета, в котором можно переоткрыть детайл с
    > нужным параметром.

    Переоткрыть, означает заново закачать с сервера. Кстати, тут http://ibase.ru/devinfo/dbexpress.htm тоже каждый раз с сервера закачивается.

    А КлиентДатаСет с мастер-детейл, так понимаю, сервер не дергает при смене текущей записи на мастере. Перефильтровывается все локально.

    Отсюда получаем плюс в скорости.
  • Sergey13 © (19.09.08 10:43) [11]
    > [10] Девушка   (19.09.08 10:39)
    > Перефильтровывается все локально.

    Ну и перефильтровывай вместо переоткрытия. Кто мешает?
    Только не забудь, что для того что бы что-то отфильтровать надо это что-то закачать на локаль полностью. Готова к этому?
  • Девушка (19.09.08 11:04) [12]

    > Ну и перефильтровывай вместо переоткрытия. Кто мешает?

    Ага... и еще предусмотреть что бы на фильтр-он фильтр-офф в гриде все это не отображалось...
    Зачем руками писать мастер-детаил, когда он уже написан, более умными людьми?

    Кстати, вопрос с мастер-детаил на клиентдатасете остается открытым...
  • Sergey13 © (19.09.08 11:19) [13]
    > [12] Девушка   (19.09.08 11:04)
    > Кстати, вопрос с мастер-детаил на клиентдатасете остается открытым...

    ИМХО еще не закрыт вопрос о целесообразности использования CDS-а. 8-)
 
Конференция "Базы" » Fib+ ClientDataSet + MasterDetail = Key Violation [D7]
Есть новые Нет новых   [134435   +34][b:0][p:0]