AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 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 Кб, 80 просмотров)
За это сообщение автора поблагодарили: petr (3), aidsua (1), in.dc (1).
Старый 14.04.2009, 10:44   #22  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Импортировал, не компилируется. Возможно забыто объявление макросов.
Но именно из-за
Цитата:
...возможно еще что-то
я бы не стал вносить изменения в эти классы, вдруг что-то забыто... Лучше перед присвоением номер обрабатывать.
Старый 14.04.2009, 10:47   #23  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
X++:
 str 4  prefx = "ПОС.";
Гм... Вы вот прям так и сделали? А что помешало даже при данном выборе решения вынести этот префикс куда-нибудь в параметры?
Старый 14.04.2009, 10:54   #24  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
Гм... Вы вот прям так и сделали? А что помешало даже при данном выборе решения вынести этот префикс куда-нибудь в параметры?
Чтобы полностью исключить возможность его изменения.
Старый 14.04.2009, 12:35   #25  
in.dc is offline
in.dc
Участник
 
29 / 53 (2) ++++
Регистрация: 09.04.2009
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Импортировал, не компилируется. Возможно забыто объявление макросов..
Не пишите ерунды, все нормально компилируется.
Импортировал проект на Dynamics Ax 4.0 SP2 - макросы объявлены в NumberSeq\classDeclaration():
X++:
public class NumberSeq
{
    ...
    #DEFINE.SymbolNumerals('#')
    #DEFINE.SymbolLetters('&')
    #DEFINE.NoOfLetters(26)
    #DEFINE.FirstLetter('A')

    //  --> petergunn, NumberSeqOptional, 14.04.2009
    #define.SymbolNumOptional('$')
    #define.SymbolAlphaOptional('?')
    //  <-- petergunn, NumberSeqOptional
}
единственно для DAX4.0 поправил метод на таблице NumberSequenceTable.validateField():
X++:
    ...
    case fieldnum(NumberSequenceTable, Format):
        ret = this.checkFormat();
        //  in.dc -->
        ret = ret && NumberSeqOptional::validateFormat( this.Format ) ;
        //  in.dc <--
        break;
    ...
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Но именно из-за я бы не стал вносить изменения в эти классы, вдруг что-то забыто... Лучше перед присвоением номер обрабатывать.
вы несколько категоричны в рекламе своего варианта с прописанным в коде префиксом (как локальное решение может быть и пойдет, но в общем случае Best Practice тут 'отдыхает', imho ), тем более что вроде автор сообщения и не агитирует ни кого за свое решение:
Цитата:
Все нижеследующее можно считать в некоторой степени оффтопом
...
следует иметь в виду при принятии решения об использовании необязательных спец. символов в формате(шаблоне) номерной серии.
...
P.S. Проект НЕ претендует на 'готовое' решение.
2 petergunn - благодарю за идею и пример кода, подумаем о использовании и такого варианта.
__________________
Dynamics AX 4.0 SP2
Старый 14.04.2009, 13:03   #26  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
Не пишите ерунды, все нормально компилируется.
Да, действительно, после повторного импорта макросы появились...
Цитата:
вы несколько категоричны в рекламе своего варианта
не знаю, где уж вы там увидели рекламу ).
Вы задали вопрос
Цитата:
Eldar9x как в итоге решили вопрос с 'удалением' ведущих нулей?
я ответил.
Мне это решение и самому не нравится. Но поскольку в стандартной аксапте не реализован вышеуказанный формат номерной серии, пришлось выбирать вариант, который окажет наименьшее влияние на систему целиком. По поводу изменения NumberSeq... У меня на данный момент недостаточно знаний, чтоб гарантировать, что вышеописанное изменение класса NumberSeq не выплывет в каких-либо багах. Да и petergunn по сути это также озвучил.
Об этом говорилось и выше. Но, если вы хотите рискнуть и готовы внести подобные модификации в рабочее приложение, то флаг в руки.

Последний раз редактировалось Eldar9x; 14.04.2009 в 13:06.
Теги
download, faq, законченный пример, номерная серия, нули, нумерация, полезное, пример

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Номерная серия,,, превышена. tolstjak DAX: Функционал 28 14.01.2013 20:06
Номерная серия konopello DAX: Программирование 11 02.10.2007 12:00
Номерная серия общая для всех компаний! 3oppo DAX: Программирование 13 01.09.2006 06:38
Номерная серия в виртуальной компании Владимир Максимов DAX: Программирование 2 22.12.2005 12:52
Номерная серия требование-накладная loka DAX: Функционал 2 15.06.2005 13:14

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 04:37.