|
Удаление из связанных таблиц
|
|||
---|---|---|---|
#18+
Добрый день! Суть вопроса в следующем. Есть табличка с платежами (payment_doc). В ней хранятся суммы платежей и остатков от него(payment_sum,payment_rest) клиента. Изначально они равны. Платежами закрываются разные начисления,соответстенно остаток от платежа уменьшается или увеличивается (если надо отменить закрытие). Данные об этих телодвижениях ложаться в табличку billpayment(поле bp_payment_sum). На billpayment висят триггера, которые отслеживают баланс клиента, меняя его в зависимости от операции и меняя остаток от платежа payment_rest в payment_doc. Проблема возникает, когда надо полностью удалить платеж! Надо удалить и строку из payment_doc и все, что связано с этим платежом в billpayment с корректной отработкой баланса клиента. Висел триггер на удаление для payment_doc в котором удалялся billpayment, но понятно, что он натыкается на рекурсию. Rule на удаление не действует. Как вариант - хранить остаток payment_rest в отдельной табличке? Как быть? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2011, 13:13 |
|
Удаление из связанных таблиц
|
|||
---|---|---|---|
#18+
Я так понимаю, что схема примерно следующая. Платеж -> Сопоставление <- Начисление Т.е. есть две отдельные таблицы: Платежи и Начисления и дополнительная таблица-посредник, которая связывает эти две таблицы. При такой схеме самое простое - это запретить удаление платежа, если он хотя бы частично сопоставлен с начислением. Предварительно надо выполнить операцию "рассопоставления". И только если несопоставленный остаток равен сумме платежа разрешать удаление. Другими словами, разрешать удалять платеж, если на него нет ни одной ссылки в таблице сопоставлений. Тогда рекурсии не появится. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2011, 14:57 |
|
Удаление из связанных таблиц
|
|||
---|---|---|---|
#18+
Собственно, так оно и было, точнее есть. В триггере на удаление платежа стоит проверка: - есть операциии с этим платежом, никаких корректировок. Только в случае отката покрытий, когда payment_sum = payment_rest платеж можно было удалить. Но фишка в том, что платежей много и импортируются они из клиент-банка. Оператор накуролесил с покрытием начислений и ручками откатывать каждый платеж... Поэтому хотелось бы предусмотреть возможность групповых операций. Типа - откатить платежи за такой-то период. Видимо придется - таки к табличке payment_doc вязать дополнительную. Не Оракловые триггеры, не Оракловые.... :( Вы как выходите из положения? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2011, 15:25 |
|
Удаление из связанных таблиц
|
|||
---|---|---|---|
#18+
Ну, если опустить тот факт, что Вы ищите себе ну очень большие приключения, то кто Вам мешает, собственно, сначала отменить все сопоставления за определенный период, а потом поудалять все платежи в этом же периоде? Не надо бизнес-логику "зашивать" в структуру базы данных. Ничего хорошего из этого не выйдет. Если "по правильному", то как поштучно накуролесил, так пускай поштучно и разбирается. В следующий раз будет внимательнее. А то, что Вы хотите сделать, так это нажал кнопочку и программист крайний. Как Вы докажите, что пользователь что-то там делал. Все ведь удалилось. С деньгами поосторожнее надо как-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2011, 16:57 |
|
Удаление из связанных таблиц
|
|||
---|---|---|---|
#18+
Надо все взвесить... Собственно кнопку кроме меня пока никто не нажмет, ибо пункт меню недоступен будет кому ни попадя. Да и сейчас по принципу payment_sum <> payment_rest кнопка "Удалить" залочена. Зачем лишний раз триггера напрягать... :) Спасибо. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2011, 19:03 |
|
|
start [/forum/topic.php?fid=41&fpage=65&tid=1583996]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 135ms |
0 / 0 |