Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
2-1240085511
VoznikVopros
2009-04-19 00:11
2009.05.31
Как ограничить Trace-режим ТОЛЬКО файлами проекта?


2-1239867280
zz14
2009-04-16 11:34
2009.05.31
позиция символа в TEdit


2-1240133756
dplz
2009-04-19 13:35
2009.05.31
constant expression expected в операторе case


2-1239776086
Лёша
2009-04-15 10:14
2009.05.31
Как сделать фильтр по Calculated полю?


15-1238103365
Юрий
2009-03-27 00:36
2009.05.31
С днем рождения ! 27 марта 2009 пятница





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский