Рука дрогнула, а дописать таки не успеваю... Пора бежать.

Закончу таки... :)

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

With b/r. Gleb.


Ответить