Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Fib+ ClientDataSet + MasterDetail = Key Violation [D7]


Девушка ©   (2008-09-18 23:27:00) 

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

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

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

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

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

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

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


Sergey13   (2008-09-19 11:19:00) [1]

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

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


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


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

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

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


Sergey13   (2008-09-19 10:43:00) [3]

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

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


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


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

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

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

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


Johnmen   (2008-09-19 09:16:00) [5]


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

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


Sergey13   (2008-09-19 09:04:00) [6]

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

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

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


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


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

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

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


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


Sergey13   (2008-09-19 08:31:00) [8]

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

Каких?

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


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


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

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


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


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

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


Johnmen   (2008-09-18 23:42:00) [11]

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


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


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

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


Johnmen   (2008-09-18 23:29:00) [13]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо