Генератор номеров документов


Никоим образом не умаляя преимуществ использования внутренних генераторов Interbase, предлагаю еще один способ создания идентификаторов записей в базе данных.Идея возникла после анализа внутренних структур программы Navision.

Свойства (они же - преимущества ):

  • формирование строковых идентификаторов фиксированной длины, состоящих из префикса и изменяющейся цифровой части, например "С03-000087"
  • можно определить начальный и конечный номер, приращение номера, длину номерной части (до 10),
  • можно определить начальную и конечную дату действия последовательности номеров, и таким образом автоматически переключать их, скажем, 1 января,
  • можно запретить использование последовательности номеров,
  • все перечисленное настраивается прямо в базе данных - через заполнение соответствующих таблиц.

Для чего все это нужно?

Мне хотелось сделать систему генерации текстовых идентификаторов документов, которой можно было бы легко управлять. Например: все номера заказов начинаются с буквы "З", а приходов "П", в номерах документов 2003 года есть цифры "03", а 2004 - "04", документы можно сортировать по номеру, номера документов филиала "А" отличаются от филиала "Б", ну, и т.д. На мой взгляд, данная система все это позволяет.
Как побочный эффект, получилась еще возможность блокировки выписки документов в определенный период времени, если в этот период не указать никакой открытой серии номеров.
P.S. Была еще мысль, не ввести ли в номер помимо префикса еще и суффикс, но я от нее отказался, т.к. искать по суффиксу очень неудобно, хотя такая модификация делается очень легко.

Как оно работает?

Все очень просто. В базе две таблички: в одной перечислены серии номеров, в другой - варианты нумерации для данной серии. В варианте указываются: префикс, начальный и конечный номера варианта, приращение номера, начальная и конечная дата действия варианта, ширина, до которой номер дополняется нулями слева. Еще в нем есть несколько рабочих полей (не для редактирования пользователем): последний использованный номер, дата выборки последнего номера, признак закрытия данного варианта. Клиенту необходимо указать серии номеров и варианты для каждой серии.

Всю работу по выборке очередного номера выполняет хранимая процедура, которой передается идентификатор требуемой серии, например:

  SELECT * FROM NS$GET_NEXT_NUM('Orders')
Процедура просматривает открытые варианты номеров в порядке дат начала действия, затем пытается обновить найденную строку (чтоб заблокировать ее), если получилось - считывает строку и формирует номер. Выборку номера лучше выполнять в отдельной короткой транзакции, т.к. строка варианта остается заблокированной до ее подтверждения. Хотя, если сам документ формируется автоматически и требуется непрерывная последовательность номеров, то использование единой транзакции имеет свой плюс: при неудаче создания документа номер автоматически освободится.

Таблицы:

  • NS$NUM_SERIES - список типов номеров ("Заказы", "Накладные", ...)
  • NS$NUM_SERIES_LINE - список серий номеров каждого типа

Процедура:

  • NS$GET_NEXT_NUM - принимает идентификатор типа серии, возвращает следующий доступный номер

(Хотел сделать еще компонент для Delphi, но руки как-то не дошли)

Ссылки по теме:


(c) Konstantin Beliaev, 2003

ċ
Konstantin Beliaev,
1 нояб. 2015 г., 01:10
Comments