Форум: "Базы";
Текущий архив: 2009.05.31;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c