Показать сообщение отдельно
Старый 14.04.2009, 08:49   #21  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
Цитата:
Сообщение от 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. Проект НЕ претендует на 'готовое' решение.
Вложения
Тип файла: zip NumberSeqOptional_USR.zip (4.4 Кб, 83 просмотров)
За это сообщение автора поблагодарили: petr (3), aidsua (1), in.dc (1).