|
after and before UPDATE триггера
|
|||
---|---|---|---|
#18+
Добрый день! Собственно вопрос не новый, но решения не нашел. Задача следующая: Клиент(таблица customer с полями customer_id,customer_name,balance) платит(таблица payment_doc с полями customer_id,payment_sum) и тратит(bill и customer_id,bill_amount), следовательно его баланс = разнице между суммами этих величин. Сейчас при сохранении формы ввода начисления или платежа вызываю функцию типа: PROCEDURE get_balance PARAMETERS lnCusomerId select sum(payment_sum) from payment_doc where customer_id = lnCusomerId into array aPay select sum(bill_amount) from bill where customer_id = lnCusomerId into array aBill UPDATE customer set balance = aPay(1,1)+aBill(1,1) where customer_id = customer.customer_id ENDPROC Хотелось бы реализовать данную функционал на уровне базы данных. Попытки вставить функцию в хранимую процедуру и в Rule прописать в таблицах вызов get_balance(customer_id) для payment_doc и bill ничего не дали. Данные не обновляются. Точнее обновляются предыдущими значениями. Как обойти? Фокс, к сожалению, не Оракл. :( ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2011, 17:12 |
|
after and before UPDATE триггера
|
|||
---|---|---|---|
#18+
Во-первых, это надо писать не в RULE, а в триггерах. Во всех трех типах INSERT/UPDATE/DELETE. Поскольку RULE - это еще не окончательное значение. Может быть изменено. Во-вторых, нет никакой необходимости делать запросы. Достаточно из суммы вычесть старое значение платежа и прибавить новое. Триггер все-равно выполняется по одной записи за раз. Например, триггер для payment_doc будет выглядеть примерно так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
Аналогичную функцию надо сделать для триггеров таблицы bill. Можно написать не один общий, а три разных триггера. По их типам. PS: В триггерах надо с осторожностью использовать алиасы той таблицы, модификация которой и выполняется, поскольку нет никакой гарантии, что алиас таблицы совпадает с ее именем. В данном случае можно использовать функцию Alias(), поскольку, по умолчанию, триггер выполняется в той рабочей области, которая и вызвала срабатывание триггера. Но можно оставить как есть. Т.е. просто имя поля без указания алиаса. В этом случае предполагается, что речь идет о поле таблицы, открытой в текущей рабочей области. Что, в данном случае, соответствует действительности ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2011, 19:40 |
|
after and before UPDATE триггера
|
|||
---|---|---|---|
#18+
Исчерпывающее объяснение. :) Спасибо! Насчет +/- баланса я тоже думал, но как-то казалось долго. Триггер на удаление не нужен: не удаляю записи. Обнуляю суррогатные ключи в таблицах и при добавление новой записи ищу первый попавшийся скажем customer_id = 0 и UPDATE новым ключом + UPDATE полей в таблице. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2011, 21:06 |
|
|
start [/forum/topic.php?fid=41&fpage=68&tid=1584113]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 130ms |
0 / 0 |