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

Вниз

Fib+ ClientDataSet + MasterDetail = Key Violation   Найти похожие ветки 

 
Девушка   (2008-09-18 23:27) [0]

Использую FIB+ (СУБД Firebird 2.0)

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

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

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

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

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

p.s. после 5-ти часовых попыток исправить мысли могут выражены мутновато.


 
Johnmen ©   (2008-09-18 23:29) [1]

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


 
Девушка   (2008-09-18 23:34) [2]


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

Он является Detail - датасетом. А в чем крамола?


 
Johnmen ©   (2008-09-18 23:42) [3]

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


 
Девушка   (2008-09-19 06:01) [4]


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

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


 
Девушка   (2008-09-19 07:13) [5]


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

Механизм найден путем гугления... однако, исходная проблема осталась. Если использовать клиентдатасет имеем "Key Violation"


 
Sergey13 ©   (2008-09-19 08:31) [6]

> [4] Девушка   (19.09.08 06:01)
> 1) С целью исключения блокировок

Каких?

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


 
Девушка   (2008-09-19 08:37) [7]


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

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

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


> Даже если нет "пропертисов" есть всегда событие onAfterScroll
> у мастер-датасета, в котором можно переоткрыть детайл с
> нужным параметром.
Подробное описание "как это сделать" тут http://klog.h17.ru/interbase/chapter2/1.html#29


 
Sergey13 ©   (2008-09-19 09:04) [8]

> [7] Девушка   (19.09.08 08:37)
> Кто последний закоммитил, тот и прав.

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

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


 
Johnmen ©   (2008-09-19 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+ с целью освоения механизма реализации М-Д.


 
Девушка   (2008-09-19 10:39) [10]


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

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

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

Отсюда получаем плюс в скорости.


 
Sergey13 ©   (2008-09-19 10:43) [11]

> [10] Девушка   (19.09.08 10:39)
> Перефильтровывается все локально.

Ну и перефильтровывай вместо переоткрытия. Кто мешает?
Только не забудь, что для того что бы что-то отфильтровать надо это что-то закачать на локаль полностью. Готова к этому?


 
Девушка   (2008-09-19 11:04) [12]


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

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

Кстати, вопрос с мастер-детаил на клиентдатасете остается открытым...


 
Sergey13 ©   (2008-09-19 11:19) [13]

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

ИМХО еще не закрыт вопрос о целесообразности использования CDS-а. 8-)



Страницы: 1 вся ветка

Текущий архив: 2009.05.31;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
2-1239701746
mnj
2009-04-14 13:35
2009.05.31
Распознавание Sender


4-1190046757
Bora.ru
2007-09-17 20:32
2009.05.31
Снимок частично закрытого окна


15-1238128193
Ламо777
2009-03-27 07:29
2009.05.31
Установка SVN-сервера на Windows


2-1240201355
Zalum
2009-04-20 08:22
2009.05.31
Запустить одно приложение их другого


2-1239808180
ksevelyar
2009-04-15 19:09
2009.05.31
Погрешность метода Рунге-Кутта