Страница 1 из 1

Триггером из деталь-таблицы изменить поле мастер-таблицы

Добавлено: 26 май 2005, 08:25
Solo
Мастер-таблица содержит поле BALANCE (Float, для денег)
Деталь-таблица состоит (кроме ID и PARENTID, конечно), поле даты, поле денег и стринговое поле (приход, расход и т.д.)

При добавлении записи в деталь-таблицу (такого-то числа клиент принес такую-то сумму денег, или унес сумму денег, если сумма ниже нуля) - после поста срабатывает триггер, который увеличивает поле БАЛАНС-а в главной таблице на эту сумму. Это понятно.

При удалении записи из деталь-таблицы (удаление ошибочной записи) - другой триггер (перед удалением) уменьшает деньги в главной таблице. Это тоже несложно.

:!: А что делать при редактировании суммы в ячейке деталь-таблицы?Даже не при-, а, наверное, после редактирования. Ну, записали, запостили, потом поняли, что ошиблись, и исправили?
Допустим, 50 рублей на 60 рублей? Как в этом случае триггер должен понять, что надо увеличить мастер-таблицу на 10 рублей?[/b]

Добавлено: 26 май 2005, 09:11
kdv
Мастер-таблица содержит поле BALANCE (Float, для денег)
это смешно, я прямо не могу. float - для денег! Да еще столбец balance называется? ну ты там насчитаешь :)
А что делать при редактировании суммы в ячейке деталь-таблицы?Даже не при-, а, наверное, после редактирования. Ну, записали, запостили, потом поняли, что ошиблись, и исправили?
Допустим, 50 рублей на 60 рублей? Как в этом случае триггер должен понять, что надо увеличить мастер-таблицу на 10 рублей?
update x
set balance = balance + dellta
where ...

это если запись добавляется. если удаляется - balance - delta.
Если update делается, то balance = balance - (new_delta-old_delta).

чего тут сложного?

Добавлено: 26 май 2005, 09:23
Solo
kdv писал(а): это смешно, я прямо не могу. float - для денег! Да еще столбец balance называется? ну ты там насчитаешь :)
Рад, что поднял настроение. :lol: А что, надо было дабл пресижн? Спрашиваю всерьез. Не знаю, в других СУБД, если нет карренси, везде используют с плавающей точкой... А что может быть? А насчет BALANCE - чего ж тут смешного, по-моему, это слово не резервировано...
kdv писал(а):update x
set balance = balance + dellta
where ...

это если запись добавляется. если удаляется - balance - delta.
Если update делается, то balance = balance - (new_delta-old_delta).

чего тут сложного?
Ну, теперь ничего... Я про дельту эту впервые слышу. Буду знать, спасибо :-) В обычной базе - то можно запомнить старое значение, да потом сравнить. А тут - ОлдАйДИ, НьюАйДи... Еще во вкус не вошел.

Добавлено: 26 май 2005, 10:12
kdv
float - 4 байта, 7 цифр. его вообще нельзя для денег использовать. либо double precision, либо numeric(18,x) в третьем диалекте, чтобы не иметь проблем с округлением double. в общем, на сайте и в документации все это описано.
А тут - ОлдАйДИ, НьюАйДи... Еще во вкус не вошел.
почитай про триггеры before update.

Добавлено: 26 май 2005, 10:24
Solo
kdv писал(а):float - 4 байта, 7 цифр. его вообще нельзя для денег использовать. либо double precision, либо numeric(18,x) в третьем диалекте, чтобы не иметь проблем с округлением double. в общем, на сайте и в документации все это описано.
А тут - ОлдАйДИ, НьюАйДи... Еще во вкус не вошел.
почитай про триггеры before update.
Да, уже нашел вашу статью про округление вещ. чисел, вечером читну. Удивительно, что Ibase-ники не предусмотрели готового типа Currency.

Хотя до недавнего времени эта блуждающая копейка была и в 1С