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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.04.2009, 13:31   #1  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Номерная серия без нулей
Вот стало надо нумеровать серии без нулей. То есть вместо
ППП_009
написать
ППП_9.
Максимум = 999
Как задать формат такой номерной серии?
Не хочется заниматься постобработкой полученной строки.
Старый 01.04.2009, 13:40   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Вот стало надо нумеровать серии без нулей. То есть вместо
ППП_009
написать
ППП_9.
Максимум = 999
Как задать формат такой номерной серии?
Не хочется заниматься постобработкой полученной строки.
1. Нету такого формата.
2. формат с нулями нужен для правильной сортировки "как числа". В вашем варианте номера будут сортироваться "как строки" (ППП_1, ППП_11, ППП_12, ... ППП_19, ППП_2, ППП_21...)

См. http://axapta.mazzy.ru/lib/adjustment/
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: Eldar9x (1).
Старый 01.04.2009, 15:07   #3  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Если все же хотите сделать по-своему, невзирая на замечание №2 от mazzy (очень существенное замечание, хочу заметить), то смотреть нужно в сторону метод NumberSeq::numInsertFormatInternal().

В нем надо сделать следующее изменение
X++:
            case #SymbolNumerals:
                //tmpTxt  = strpoke(tmpTxt,'0',x);
                tmpTxt = strDel(tmpTxt, x, 1);
                break;
Ограничения, о которых стоит упомянуть:
Это только для ситуации, когда используются числовые подстановки, а не буквенные
Если уже были использованы номера, и серия непрерывная, то значения будут браться из списка, а не формироваться новые - тогда этот код, опять же, не отработает.
Старый 01.04.2009, 15:31   #4  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Тогда придется править еще как минимум ::numRemoveFormat(), насколько я помню.

Желательно отказаться от хотелки.
__________________
С уважением,
glibs®
Старый 01.04.2009, 15:40   #5  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Зачем и кому это надо? Не зная ответа на этот вопрос можно много "вредных" советов надавать.

А то ведь получится как у Джоэля.
Цитата:
Хороший кандидат попытается вытянуть из вас побольше информации. Для кого нужен дом? Я принципиально не приму на работу кого-то, занимающегося проектированием и не спрашивающего, для чего. Однажды меня это так возмутило, что я прервал кандидата и сказал: «Вы забыли об этом спросить, но это дом для семейства слепых жирафов.»
http://russian.joelonsoftware.com/Ar...erviewing.html
Старый 01.04.2009, 16:09   #6  
egorych is offline
egorych
Участник
Самостоятельные клиенты AX
Oracle
 
761 / 154 (7) ++++++
Регистрация: 09.11.2006
Адрес: Краснодарский край
У нас одна из серий имеет формат - КЛ9-#######, номера сейчас такие - КЛ9-0029921, максимум -9999999
Так что впрде все нормально работает
Старый 01.04.2009, 16:12   #7  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от egorych Посмотреть сообщение
У нас одна из серий имеет формат - КЛ9-#######, номера сейчас такие - КЛ9-0029921, максимум -9999999
Так что впрде все нормально работает
Автор хочет избавиться от нулей
чтобы при таком формате, как у Вас, вместо КЛ9-0029921 получилось КЛ9-29921
Старый 01.04.2009, 16:14   #8  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Давайте разделять реальный используемый номер и вывод на экран-на печать.

Напишите дисплей-метод, и все дела!

С Уважением,
Георгий
Старый 01.04.2009, 22:29   #9  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,202 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
А поиск? а переход к основной таблице?
имхо, предложение имеет смысл только при отображении номера в печатных документах. Возможно, автору вопроса стоит подумать над изменением постановки задачи как раз в эту сторону.
Старый 02.04.2009, 07:12   #10  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
Зачем и кому это надо?
Таблица уже заполнена данными, причем код набивался в другой системе.
Вот мне и нужно, запретить ввод кода, оставив при этом формат предыдущей системы, который идет с префиксом и не имеет ведущих нулей.

Цитата:
Напишите дисплей-метод, и все дела!
Ну, дисплей метод тут и на самом деле не пойдет. Это ключевое поле в таблице.

Да, жаль, конечно, что нельзя. Если оставить формат номерной серии пустым, то нумеруется именно так как мне и надо, но без префикса. Вот и подумалось, что можно задать то же самое но с префиксом. Но ради такой малой задачи, вряд ли буду модифицировать эти классы. Всем спасибо!
Старый 02.04.2009, 12:23   #11  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Если данные заливаются из другой системы, то нельзя ли влезть в процесс заливки и добавить "не достающие" нули? Ну или поправить после заливки?
Старый 02.04.2009, 12:30   #12  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
Если данные заливаются из другой системы, то нельзя ли влезть в процесс заливки и добавить "не достающие" нули?
А смысл? Тогда уж легче префикс дописать... А формат номерной серии оставить пустым.
К тому же, если добавлять нули, формат исходной системы теряется. И еще получаем проблему: в аксапте, ППП_0001 и ППП_1 это разные значения, в другой системе - одинаковые .
Старый 02.04.2009, 14:59   #13  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Смысл есть. И не маленький.

1. Значение ключа формируется в формате "естесственном" с точки зрения идеологии построения номерных серий. Не надо будет никуда влезать и ничего править в "родной" системе.

2. Опыт перекачки данных из других систем научил тому, что нельзя использовать идентификатор другой системы в качестве идентификатора данной системы. По разным соображениям. Идентификатор "чужой" системы должен хранится в отдельном поле. Как служебная (справочная) информация.
За это сообщение автора поблагодарили: oip (1).
Старый 02.04.2009, 15:22   #14  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
Идентификатор "чужой" системы должен хранится в отдельном поле.
согласен, во всех остальных таблицах именно так и делается, но здесь не получится - требование пользователей.
Старый 03.04.2009, 00:40   #15  
Bober is offline
Bober
Участник
 
311 / 104 (4) +++++
Регистрация: 29.05.2007
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
но здесь не получится - требование пользователей.
Нет такого требования пользователей, которое им нельзя было бы убедительно опровергнуть. Особенно если на то есть реальные причины. Какое у пользвателей обоснование - наверняка "привычность такого формата номера" ?
Старый 03.04.2009, 07:04   #16  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
Какое у пользвателей обоснование
совместимость с филиалами, в которых этот код вообще вводится вручную.
Старый 10.04.2009, 15:25   #17  
in.dc is offline
in.dc
Участник
 
29 / 53 (2) ++++
Регистрация: 09.04.2009
? результат
Eldar9x как в итоге решили вопрос с 'удалением' ведущих нулей?
__________________
Dynamics AX 4.0 SP2
Старый 10.04.2009, 15:48   #18  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
Eldar9x как в итоге решили вопрос с 'удалением' ведущих нулей?
X++:
BrendId genBrendId()
{
    NumberSeq       NumberSeq;
    str 4           prefx = "ПОС.";
    Num             num;
    ;

    do
    {
        numberSeq = NumberSeq::newGetNum(CompanyInfo::tmn_numRefBrendId(), true);

        if (!numberSeq)
            throw checkFailed("Не задана номерная серия для Бренда в параметрах УЗ.");

        num = numberSeq.num();

        numberSeq.used();
    }
    while (BrendTable::exist(prefx + num));

    return prefx + num;
}
на initValue вызываем данный код, если поле не заполнено на таблице.
Формат номерной серии - пустой.
Старый 11.04.2009, 09:02   #19  
in.dc is offline
in.dc
Участник
 
29 / 53 (2) ++++
Регистрация: 09.04.2009
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
X++:
BrendId genBrendId()
{
    NumberSeq       NumberSeq;
    str 4           prefx = "ПОС.";
    Num             num;
    ;

    ...
    return prefx + num;
}
'Жестко' прописанный (фиксированный) в коде префикс для всех компаний которые ведутся?
Как-то не совсем красиво, если только нет твердой уверенности что ничего не поменяется в политике формирования номеров.

Может есть еще какие-то варианты?
__________________
Dynamics AX 4.0 SP2
Старый 14.04.2009, 08:49   #20  
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).
Теги
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, время: 13:02.