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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.07.2009, 13:17   #1  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
376 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
-> Автоматическое создание номерной серии в заданном модуле
Доброго времени суток.

Во вложении мини-проект(может кому еще пригодится), который позволит автоматически создавать номерную серию для существующего модуля.

Как пользоваться :

Выбираем Extended Data Type, и вызываем
контекстное меню\Add-ins\Auto Create Number Sequence Reference

Задаем следующие параметры :

1. Модуль, для которого создается номерная серия
2. Является ли номерная серия непрерывной?(опционально)
3. Создавать ли статический метод на таблице параметров?(опционально)

Параметров немного, остальные по-умолчанию, если нужно, то думаю доработать будет не сложно.

Что делается :
1. В метод loadModule класса numberSequenceReference_<Module> автоматически добавится нужный код.
2. В случае если нужно, автоматически создает статический метод на
таблице <Module>Parameters, возвращающий ссылку на номерную серию.

Также во вложеном проекте, есть следующие мини dev-tools :

1. Для классов (Classes\Add-ins\Extended By) - показывает классы-потомки для указанного класса

2. Для проектов(Project\Add-ins\Compile All Project) - позволяет откомпилировать все объекты проекта, не открывая проект в новом окне

3. Для узла Classes(Classes\Add-ins\Auto Create Template RunBase) - создает класс-наследник RunBase\RunBaseBatch, также создается Menu Item для нового класса (опционально)

Проект импортировать аккуратно, изменен макрос xppTexts, затронуты методы системных классов, ниже их список :
X++:
SysContextMenu\verifyItem
ClassBuild\addSourceToEndMethod
Global\pickEnumValue
xppSource\beginBlock
xppSource\constructMethod
xppSource\constructMethod
xppSource\endBlock
xppSource\endLine
xppSource\getSource
xppSource\initDefaultIndentColumns
xppSource\mainMethodRunBase
xppSource\simpleLine
После импорта проекта Menu Items нужно закинуть в SysContextMenu.

Тестирование мини dev-tools производилось на DAX 4.0.

Вопросы к знатокам :

Почему в NumberSeqModule разные элементы имеют одинаковые метки ?
Например, NumberSeqModule::Ledger и NumberSeqModule::Asset имеют метку General Ledger.(В результате этого, если создавать контрол
typeId(NumberSeqModule) возникает путаница насчет модулей )

Почему поле Module в таблице NumberSequenceReference
имеет тип Integer, а не NumberSeqModule ?

offtopic: В Global\PickEnumValue был обнаружен баг, проявляется в любой из версий AX :
X++:
...
for (i=1;i <= dictEnum.values(); i++)
...
Такой код приводит к тому, что значение енума 0 теряется, должно быть :
X++:
...
for (i=0;i <= dictEnum.values(); i++)
...
Также в данном методе есть небольшая помарка :
X++:
...
formRun.choices(names, #ImageClass);
...
по идее логичнее использовать картинку #ImageBaseEnumElement, т.е.
X++:
...
formRun.choices(names, #ImageBaseEnumElement);
...
Вложения
Тип файла: zip SRF_DevTools_DAX30.zip (47.1 Кб, 134 просмотров)
Тип файла: zip PrivateProject_SRF_DevTools_DAX40.zip (45.9 Кб, 130 просмотров)
Тип файла: zip PrivateProject_SRF_DevTools_DAX2009.zip (58.6 Кб, 138 просмотров)
__________________
Sergey Nefedov
За это сообщение автора поблагодарили: TasmanianDevil (4), konopello (3), dech (1).
Старый 29.07.2009, 07:27   #2  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
887 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Цитата:
Сообщение от SRF Посмотреть сообщение
offtopic: В Global\PickEnumValue был обнаружен баг, проявляется в любой из версий AX :
X++:
...
for (i=1;i <= dictEnum.values(); i++)
...
Такой код приводит к тому, что значение енума 0 теряется, должно быть :
X++:
...
for (i=0;i <= dictEnum.values(); i++)
...
Нет, Вы не правы - значение enum'а 0 не теряется .
Там идет проход по индексу enum'а, а затем уже по индексу инициализируется конкретное числовое значение enum'а.
X++:
for (i=1;i<=dictEnum.values();i++)
    {
        value = dictEnum.index2Value(i);
P.S.
При редактировании метода loadModule() у наследников NumberSequenceReference определение наименования переменной ошибочно, ввиду неправильного определения конца строки по символу ";" - strscan() ищет по подстроке от полного исходника, а начало поиска установлено на индекс относительно полной строки исходника. В результате поиск происходит где-то далеко за обявлением искомой переменной. В рабочем варианте выглядит так :
X++:
if (methodInfo)
    {
        positionVarTableStart = strScan(methodInfo.getSource(), tableStr(NumberSequenceReference), 1, strLen(methodInfo.getSource()));

        if (positionVarTableStart)
        {
            positionVarTableEnd = strScan(subStr(methodInfo.getSource(), positionVarTableStart, strlen(methodInfo.getSource())), ';', 1, strLen(methodInfo.getSource()));
            positionVarTableEnd += positionVarTableStart;

            if (positionVarTableEnd)
            {
                positionVarTableStart += strlen(tableStr(NumberSequenceReference));
                return strLRTrim(subStr(methodInfo.getSource(), positionVarTableStart,  positionVarTableEnd - positionVarTableStart - 1));
            }
        }
    }
P.P.S.
Кому б из "китайских пионеров" гвоздь в голову вбить за слой sys у механизма номерных серий ?
Отвратительно !
__________________
Мы летаем, кружимся, нагоняем ужасы ...

Последний раз редактировалось TasmanianDevil; 29.07.2009 в 09:13. Причина: Добавил некоторое описание багов, поругался
За это сообщение автора поблагодарили: SRF (1).
Старый 01.08.2009, 12:50   #3  
in.dc is offline
in.dc
Участник
 
29 / 53 (2) ++++
Регистрация: 09.04.2009
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
Нет, Вы не правы - значение enum'а 0 не теряется .
Там идет проход по индексу enum'а, а затем уже по индексу инициализируется конкретное числовое значение enum'а.
X++:
for (i=1;i<=dictEnum.values();i++)
    {
        value = dictEnum.index2Value(i);
И все таки SRF прав - баг в pickEnumValue() имеет место быть.
Речь видимо шла не о нулевом значении enum'а, а о значении индекса enum'а (который валиден в интервале [0..enumcnt()-1]) - в текущей реализации метода цикл начат с 1. Цикл в pickEnumValue() должен был выглядеть:
X++:
    for (i=0;i<dictEnum.values();i++)
    {
        ...
    }
В варианте SRF было for (i=0;i <= dictEnum.values(); i++) в результате чего в список добавлялось пустая строка (при достижении равенства dictEnum.values()) с 'левым' значением.

P.S. либо так:
X++:
    for (i=1;i<=dictEnum.values();i++)
    {
        value = dictEnum.index2Value(i-1);
        ...
        names += dictEnum.index2Label(i-1);
        ...
    }
__________________
Dynamics AX 4.0 SP2
Теги
faq, number sequence, номерная серия, нумерация, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Получение последнего номера из номерной серии longson DAX: Программирование 12 21.06.2007 13:30
привязка к новой номерной серии delicia DAX: База знаний и проекты 5 01.04.2007 22:40
Непрерывность номерной серии YaHooka DAX: Функционал 7 30.06.2005 18:04
Конфигуратор продуции - создание новой номенклатуры против создания новой конфигураци OliaM DAX: Функционал 6 15.04.2005 20:11
привязка к новой номерной серии delicia DAX: Программирование 2 21.11.2002 11:24

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

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

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