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

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

2 датасета и ApplyUpdates


juice ©   (2006-07-13 19:42:00) 

Есть 2 датасета что соответствуют двум связаным мастер-детэйл таблицам. Возникает проблема с тем, в какой последовательности вызывать ApplyUpdates ?
Ситуация 1: добавляется запись в главный н.д. и соотв. запись в подчиненный. В таком случае нужно вызвать первым ApplyUpdates главного.
Ситуация 2: удаляется запись в главном и конечно соотв. запись в подчиненном. В таком случае сначало нужно візвать ApplyUpdates подчиненного.
Если так не делать то получаю "violation of foreign KEY".

Я правильно рассуждаю?
Как решить эту проблему, ведь я не могу анализировать чего там пользователь и когда добавил или удалил, да и вообще, он может удалить, затем добавить а потом еще что-нибудь удалить и т.д. Как быть?


Juice   (2006-07-14 17:19:00) [1]


> Может, я чего не понимаю, но в случае Exception в ApplyUpdates
> вся обработка летит в другую сторону, а не на следующую
> строку кода.

При возникновении ошибок ApplyUpdates только возвращает количество таковых и вызывает OnReconcile, исключения не происходит.


> Стандартные ситуации решаются стандартными идеологическими
> методами.
> В данном случае я почти уверен, что это не так...

Я и спрашивал о стандартном решении, ведь казалось бы ситуация д.б. очень популярной. Но как выяснилось нет такового.


Desdechado   (2006-07-14 16:05:00) [2]

> Дойдет. Почему нет ?
Может, я чего не понимаю, но в случае Exception в ApplyUpdates вся обработка летит в другую сторону, а не на следующую строку кода.


Johnmen   (2006-07-14 14:01:00) [3]


> А какая тут идеалогия может быть ? Стандартная ситуация
> - 1master/1detail, и все, нет идеологии.


Стандартные ситуации решаются стандартными идеологическими методами.
В данном случае я почти уверен, что это не так...


Juice   (2006-07-14 13:46:00) [4]


> Если на первом проходе будет ошибка, то до второго дело
> просто не дойдет

Дойдет. Почему нет ?


> Кроме того, даже если дойдет, то в случае наличия комбинированных
> изменений (add/edit/del) будет еще более интересная реакция.
>

После первого остаются только проблемные записи, что решается ApplyUpdates детэйла при втором проходе. Другого быть не может.


> У меня такое ощущение, что вообще ВСЁ не так, ВСЁ неправильно
> идеологически...

А какая тут идеалогия может быть ? Стандартная ситуация - 1master/1detail, и все, нет идеологии.


Desdechado   (2006-07-14 12:02:00) [5]

Если на первом проходе будет ошибка, то до второго дело просто не дойдет.
Кроме того, даже если дойдет, то в случае наличия комбинированных изменений (add/edit/del) будет еще более интересная реакция.


Johnmen   (2006-07-14 11:49:00) [6]

У меня такое ощущение, что вообще ВСЁ не так, ВСЁ неправильно идеологически...


Juice   (2006-07-14 11:17:00) [7]

Сделал так, может кому-то пригодится:

if cdsPortfMng.ChangeCount>0 then cdsPortfMng.ApplyUpdates(-1);
if sdsDetailsMng.ChangeCount>0 then sdsDetailsMng.ApplyUpdates(-1);
if cdsPortfMng.ChangeCount>0 then cdsPortfMng.ApplyUpdates(-1);
if sdsDetailsMng.ChangeCount>0 then sdsDetailsMng.ApplyUpdates(-1);

Просто в два прохода, если при первом вылетает эксепшн то при втором он "сгладится".


Desdechado   (2006-07-14 11:03:00) [8]

можно, например, в BeforeUpdateRecord для первого датасета проверять и делать каскадное удаление


Juice   (2006-07-14 10:46:00) [9]


> А что, foreign KEY без каскадного удаления?

Да.


Johnmen   (2006-07-13 21:04:00) [10]

А что, foreign KEY без каскадного удаления?


Наверх

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