Оригинал на GitHub
Вопрос
Задача следующая:
Есть простая таблица учета операций поступления и списания материалов с отдельной графой в виде накопительного регистра, в которой также рассчитывается остаток на складе после операции. Если после операции значение остатка становится меньше 0 нужно:
У меня получается, но что-то одно. Либо ошибка с откатом, либо данные пишутся, а операция проходит
Как именно можно использовать для этого функцию tryCatch или через что-то другое сделать?
Ответ
Это можно сделать через tryCatch
Например ставим полю с количеством код-действия при добавлении:
=catch: if(condition: $#nfv < 0; then: $err)
err: errorException(text: "Zero error")
catch: insert(table: 'error_table'; field: 'error' = str`"Zero value in row" ++ #id`)
Если есть несколько инициирующих кодов, изменяющих одно поле и надо узнать, в результате выполнения какого из них произошло отслеживаемое событи, то инициирующие коды-действия должны записать о себе информацию в процессную переменную.
Например. Это код кнопки, которая добавляет строку с неподходящим значением:
a1=: procVar(name: "zero_process_var"; value: "some_code_name")
a2=: insert(table: 'target_table'; field: 'test' = -1)
Код действия в поле test таблицы target_table:
=catch: if(condition: $#nfv < 0; then: $err)
err: errorException(text: "Zero error")
catch: insert(table: 'error_table'; field: 'error' = str`"Zero value in row" ++ #id ++ $@zero_process_var`)
И в catch мы используем данные из переменной $@zero_process_var
.