Рука дрогнула, а дописать таки не успеваю... Пора бежать.
Закончу таки... :)
У меня примерно так реализовано:
У документа 3 состояния - не проведен, проведен, закрыт (последнее -
документ неизменяемый, корректировка только сторнированием). Работа с
первыми двумя состояниями происходит так примерно:
Есть пара SP - проведение/отмена проведения документа. Документ
редактируется в режиме cashed updates с предварительной попыткой блокировки.
Добавление - пользователь вносит документ и пытается сохранить его
проведенным. При этом документ сначала сохраняется в непроведенном состоянии
в отдельной транзакции. Транзакция коммитится, стартует следующая в которой
запускается процедура проведения, а затем процедура контроля, которая в
случае ошибочных данных возвращает список конфликтов, который показывается
пользователю. В случае отсутствия конфликтов статус документа изменяется на
проведенный и транзакция коммитится. В случае lock conflict ползателю
выдается сообщение о том, что кто-то другой ему помешал и предлагается
попробовать провести документ еще раз. При наличии логических конфликтов
пользователь может сохранить документ либо в проведенном состоянии, либо в
непровенденном. Ежели провел - разруливает конфликты последующей
корректировкой этого или других документов.
Корректировка - в отдельной транзакции стартует процедура, котораю создает
копию документа с отрицательным PK чтобы можно было восстановить в случае
необходимости, затем идет отмена проведения и записи измененного документа в
непроведенном состоянии. Транзакция коммитится, дальше - также как и при
создании документа.
Удаление - отмена проведения, показ списка конфликтов если таковые имеются с
возможностью подтвердить удаление несмотря на наличие конфликтов. Документ
физически не удаляется - только помечается как удаленный.
Ну и есть отчеты, показывающие логические конфликты в данных...
Сначала хотел запретить пользователю вносить неверные данные, но решил
именно на такой схеме остановиться. Потому что встречаются иногда
практически тупиковые ситуации, когда такой запрет требует только ручного
ковыряния в базе, чтоб исправить неверно внесенные данные...
With b/r. Gleb.