Номерные серии в AX2012

Номерная серия в AX2012 используется для создания уникальных кодов для идентификаторов таблиц, таких как идентификатор справочника или проводки. Как правило номерная серия имеет ссылку на расширенный тип и поэтому прежде чем создать номерную серию нужно создать расширенный тип. В редких случаях номерная серия может быть не привязана к расширенному типу, например, в настройках наименования журналов ГК есть поле Серии ваучеров которое ссылается на справочник номерных серий, по выбранной серии генерируется код для строки журнала, т.е. для разных типов журналов разные коды.

Создание номерной серии. Код

Первым делом нужно определится будет ли номерная серия привязана к расширенному типу, если нет, то пропускаем данный раздел и переходим к следующему Создание номерной серии. Форма, иначе остаемся здесь. Теперь нужно выбрать модуль в который добавим новую номерную серию, после этого нужно найти класс наследуемый от класса NumberSeqApplicationModule, например если нужно добавить в модуль Расчеты с поставщиками то берем класс NumberSeqModuleVendor. В классе есть метод loadModule, идем в конец метода и добавляем следующий код

datatype.parmDatatypeId(extendedTypeNum(EDT)); //расширенный тип который хотим использовать
datatype.parmReferenceLabel(literalStr("Label")); //наименование
datatype.parmReferenceHelp(literalStr("Help")); //подсказка
datatype.parmWizardIsContinuous(true); //признак Непрерывная
datatype.parmWizardIsManual(NoYes::No); //признак Вручную
datatype.parmWizardIsChangeDownAllowed(NoYes::No); //признак Уменьшение номера
datatype.parmWizardIsChangeUpAllowed(NoYes::No); //признак Увеличение номера
datatype.parmWizardHighest(999999); //максимальное значение номера
datatype.parmSortField(45); //номер сортировки, обычно указывается следующий номер после крайней номерной серии
datatype.addParameterType(NumberSeqParameterType::DataArea, true, false); //параметр области действия
this.create(datatype); //создание номерной серии

после этого следует инициализировать все номерные серии модуля, для этого нужно создать джоб с кодом инициализации конкретного модуля, либо выполнить инициализацию всех номерных серий посредством статического метода loadAll класса NumberSeqApplicationModule.

Как правило на таблицах параметров модулей создают статические методы, которые возвращают ссылки на номерные серии чтобы в дальнейшем использовать их для генерирования самих номеров. Метод выглядит так

public static client server NumberSequenceReference numRefEDT()
{
    return NumberSeqReference::findReference(extendedTypeNum(EDT));
}

здесь EDT это наш расширенный тип, в наименовании метода желательно его использовать.

Создание номерной серии. Форма

Теперь в нужном нам модуле открываем форму параметров модуля, в ней переходим на вкладку Номерные серии и здесь должна появиться наша ссылка, которую создали. Для того чтобы настроить номерную серию нужно в поле Код номерной серии нажать правой кнопкой мыши и в появившемся контекстном меню выбрать Просмотр подробных сведений, откроется форма Номерные серии. Здесь создаем номерную серию. Указываем Код номерной серии, Название. Настраиваем Параметры области действия. Настраиваем сегменты, номерная серия может состоять из нескольких сегментов, как констант, так и буквенно-цифровых. После чего настраиваем ссылки, имеется ввиду ссылка на расширенный тип, но могут быть номерные серии без ссылки на расширенный тип. На вкладке Разное можно указать признак Непрерывная или Остановлено и другие настройки. Так же можно настроить Автоматическую очистку и Производительность для номерной серии.

Как правильно написать код на форме чтобы использовать номерную серию

Для начала в ClassDeclaration формы объявим переменную numberSeqFormHandler

NumberSeqFormHandler numberSeqFormHandler;

после чего создадим метод инициализации экземпляра класса для работы с номерной серией

NumberSeqFormHandler initNumberSeqFormHandler()
{
    if (! numberSeqFormHandler)
    {
        numberSeqFormHandler = NumberSeqFormHandler::newForm(recId, //RecId нашей номерной серии (NumberSequenceTable)
                                                             element, //форма
                                                             table_ds, //источник данных
                                                             fieldNum(Table, Field)); //поле таблицы для которого генерируется номер

        if (! numberSeqFormHandler.parmNumberSequenceId())
        {
            numberSeqFormHandler = null;
            throw error(strFmt("@SYS26165", extendedTypeId2pname(extendedTypeNum(EDT)))); //расширенный тип связанный с номерной серией
        }
    }

    return numberSeqFormHandler;
}

затем нужно добавить следующий код в метод close формы до вызова super

if (numberSeqFormHandler)
{
    numberSeqFormHandler.formMethodClose();
}

Теперь нужно добавить некоторые вызовы нашего класса в следующих методах источника данных

в метод create до вызова super

if (! numberSeqFormHandler)
{
    element.initNumberSeqFormHandler();
}

if (numberSeqFormHandler)
{
    numberSeqFormHandler.formMethodDataSourceCreatePre();
}

после вызова super

if (numberSeqFormHandler)
{
    numberSeqFormHandler.formMethodDataSourceCreate(true);
}

метод delete должен выглядеть следующим образом

ttsbegin;

if (numberSeqFormHandler)
{
    numberSeqFormHandler.formMethodDataSourceDelete();
}

super();

ttscommit;

в метод linkActive до вызова super

if (numberSeqFormHandler)
{
    numberSeqFormHandler.formMethodDataSourceLinkActive();
}

метод write должен выглядеть следующим образом

ttsBegin;

super();

if (numberSeqFormHandler)
{
    numberSeqFormHandler.formMethodDataSourceWrite();
}

ttsCommit;

в метод validateWrite после вызова super

if (numberSeqFormHandler)
{
    numberSeqFormHandler.formMethodDataSourceValidateWrite();
}

Генерирование номера номерной серии в коде

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

Num num;
num = NumberSeq::newGetNum(InventParameters::numRefEDT()).num(); //метод создание которого описан в разделе Создание номерной серии. Код

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

Num         num;
container   numSeqValue;
numSeqValue = NumberSeq::newGetNumFromIdPacked(
                            recId, //RecId нашей номерной серии (NumberSequenceTable)
                            false, false, null, true);
num         = conPeek(conPeek(conPeek(numSeqValue, 1), 2), 6);

 

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar