![]() |
#7 |
Moderator
|
В общем - при работе с номерными сериями, есть два режима - простой и сложный
![]() Простой режим работает тогда, когда выделение номера в номерной серии и его использование (то есть - засовывание в поле какой-то записи какой-то таблицы) происходят в рамках одной транзакции. В момент выделения номера, новый номер пишется в таблицу NumberSequenceList, и помечается там статусом Нерешенный (Undecided). Если транзакция успешно завершается, в момент завершения все выделенные номера помечаются как используемые. Если транзакция о откатывается, то в момент отката все нерешенные номера, выделенные в рамках откатываемой транзакции, помечаются как свободные. Штатный аллокатор номеров в номерной серии, перед тем как создать новый номер из счетчика, сначала пытается реюзать свободные номера из NumberSequenceList. Сложный способ используется тогда, когда выделение и использование номера разделены по времени. В этом случае, при создании класса NumberSeq(),в конструктор передается второй параметр decideLater==true. В этом случае, где-то в своем коде, если ты (или пользователь) решил не использовать уже выделенный номер, ты должен вызвать NumberSeq::Release(), если решил использовать - numberSeq.used(). Если ты ни один из методов не вызвал, то номер будет вечно висеть в статусе Undecided, приводя к распуханию таблицы. При работе с журналом/заказом/закупкой и тп в интерактивном режиме, возможен сценарий, при котором пользователь создал запись (при этом система снегерирует новый номер в номерной серии и запишет его в поле новой записи), а потом вышел из формы без сохранения, или просто удалил запись до сохранения ее в БД. Для того чтобы отслеживать использование/неиспользование номеров, для таких форм был написан класс NumberSeqFormHandler, который обрабатывает в "сложном" режиме, выделение, пометку как использованных и освобождение номеров в номерной серии. Поскольку при программном создании строк журнала, вариант "Создали запись, захватили номер ваучера, а потом передумали и не сохранились" невозможен, то никакие used() или Release() не используются, поскольку номера будут корректно помечены как использованные или неиспользованные при успешном или неуспешном завершении транзакции "простым" механизмом. Последний раз редактировалось fed; 27.06.2011 в 15:54. |
|
|
За это сообщение автора поблагодарили: Logger (3), Ivanhoe (5), IKA (1), alex55 (1), S.Kuskov (5), someOne (3), Eloy (1). |
Теги |
number sequence, номерная серия, полезное |
|
|