Цитата:
Сообщение от
in.dc
...
Может есть еще какие-то варианты?
Все нижеследующее можно считать в некоторой степени оффтопом относительно номерных серий в контексте данной темы.
Не затрагивая вопрос практической необходимости такого поведения номерных серий (аргументы изложены участниками выше по теме), в качестве одного из вариантов решения такой задачи можно рассматривать расширение числа спец.символов формата(
шаблона) с которыми работает номерная серия.
В штатной функциональности класса
NumberSeq использованы 2 символа:
- # - для формирования цифровой последовательности
- & - для формирования символьной последовательности (A-Z)
в формате(
шаблоне) номерной серии эти символы можно использовать как раздельно ('PREFIX_
######' или 'PREFIX_
&&&&&&'), так и совместно ('PREFIX_
##&&##') в произвольной последовательности и комбинациях. При формировании номера
'лишние' символы формата(
шаблона) оставщиеся после преобразования исходного числа в символьную последовательность в обязательном порядке заполняются значениями по умолчанию ('
0' для
#, '
A' для
& - в методе
NumberSeq::numInsertFormatInternal()). Получаемый номер имеет туже размерность (длину) что и формат(
шаблон) номерной серии. (к примеру, число 123 преобразованное по формату '
DMO_######' выглядит как номер '
DMO_000123')
Можно расширить набор специальных символов формата(
шаблона)
'необязательными' знаками, к примеру:
- $ - дополнительный цифровой шаблон
- ? - дополнительный литерный шаблон
и трактовать их как
необязательные для заполнения (в случае если в исходном числе после преобразования в символьную последовательность нет значимой цифры для этого знакоместа;
что-то по аналогии с квантификатором '?' из регулярных выражений ('громко' сказано однако
'$'=='#'? )) - в этом случае длина полученной строки с номером будет короче (либо равна) длины строки формата(
шаблона) номерной серии. (число 123 преобразованное по формату '
DMO_$$$$$$' будет выглядеть как номер '
DMO_123'). Вот тут то и возможны
проблемы с сортировкой полученных номеров о которых упоминалось выше по теме из-за разных длин строк. Это следует иметь в виду при принятии решения об использовании необязательных спец. символов в формате(
шаблоне) номерной серии.
Как уже упоминалось выше по теме нужно будет внести некоторые модификации в код ряда методов класса
NumberSeq.
на вскидку это:
- formattingChars() - возвращает строку с 'служебными' спец.символами использумыми в форматах(шаблонах) номерных серий,
- numCheckFormat() - проверка строкового номера на соответствие формату(шаблону) номерной серии
- numInsertFormat() - преобразование числового кода в номер по формату(шаблону)
- numInsertFormatInternal() - используется в методе numInsertFormat()
- numInsertFormatLetters() - используется в методе numInsertFormat()
- numRemoveFormat() - восстановление числового значения номера по формату(шаблону) номерной серии
...возможно еще что-то
Для упрощения обработки в классе
NumberSeq можно допустить некоторую условность: необязательные символы шаблона должны находиться левее обязательных в шаблоне номерной серии ('PREFIX_$$$$
$#') - проверку пользовательского ввода можно организовать на
NumberSequenceTable.validateField() или
NumberSequenceTable.validateWrite()
В целях тестового примера подобной реализации набросал
в первом приближении небольшой проект по описанным выше пунктам. В проект выгружены только изменения на
USR слое с приложения
Axapta 3.0 SP5 (адаптировать для Dynamics Ax 4.0, если кому-то потребуется, думаю не составит труда - изменений не много, помечены комментариями '
NumberSeqOptional').
P.S. Проект НЕ претендует на 'готовое' решение.