Инструменты пользователя

Инструменты сайта


axapta:номерныесерии

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

axapta:номерныесерии [2018/04/13 22:43]
axapta:номерныесерии [2018/04/13 22:43] (текущий)
Строка 1: Строка 1:
 +Раздел: [[Программирование | ]] > [[СредаИсполнения]]
 +----
 +Номерные серии предназначены для автоматической генерации заначений полей вида <префикс><номер><суффикс> на основе счетчика. При помощи номерных серий заполняюется такие поля как "Номер складского журнала"  и т.д. 
  
 +C номерными сериями документов можно работать через пункт главного меню "Основное\Настройки\Серии документов\Серии документов"
 +
 +Хорошее описание того, как делать номерные серии есть в статье [[http://axapta.mazzy.ru/lib/numbersequence/]]
 +
 +В качестве альтернативы можно использовать RecId, но следует учесть, что его значение не сохраняется при экспорте-иморте
 +{{toc}}
 +=== Создание собственного модуля номерных серий ===
 +  *добавить новое значение в BaseEnum/NumberSeqModule
 +  *создать подкласс [[Класс/NumberSeqReference]]
 +  *в созданном подклассе:
 +    *добавить статический метод numberSeqModule возвращающий значение нового элемента  BaseEnum/NumberSeqModule
 +    *перекрыть метод loadModule (см. ниже)
 +  *добавить создание экземпляра этого класса в [[AxPath://AOT/Classes/NumberSeqReference/construct?line=53&pos=9]]
 +  *добавить свой тип в перечень типов модулей в [[AxPath://AOT/Classes/NumberSeqReference/moduleList?line=53&pos=5]]
 +  *добавить в форму параметров своего модуля закладку "Номерные серии" (пример создания такой закладки содержит Форма/LedgerParameters)
 +=== Создание номерной серии ===
 +  *создать собственный ExtendedDataType типа [[Тип/str]]
 +  *добавить инициализацию номерной серии в метод loadModule потомка класса NumberSeqReference (например, NumberSeqReference_Ledger для модуля [[ГлавнаяКнига]]):
 +<code XPP>
 +// Укажем, какой тип мы хотим использовать.
 +
 +// Разумеется, здесь должен быть наш тип - тот,что мы использовали в таблице.
 +numRef.DataTypeId = typeid2extendedtypeid(typeid(SalesManagersGroupId));
 +
 +// Это будет в подсказке
 +numRef.ReferenceHelp = literalStr("Уникальный идентификатор групп менеджеров");
 +
 +// А это само имя - его мы видим в графе <Ссылка> при настройке номерных серий.
 +numRef.ReferenceLabel = literalStr("Идентификатор группы менеджеров");
 +
 +// Настройка мастера.
 +// Если мы решим запустить стандартны мастер, то он
 +// по-умолчанию сформирует нашу серию как <Непрерывную>
 + numRef.WizardContinuous = false;
 +
 +// Допускать изменения пользователем <Вручную>
 +numRef.WizardManual = NoYes::No;
 +
 +// : только на понижении серии
 +numRef.WizardAllowChangeDown = NoYes::No;
 +
 +// : только на повышение номера.
 +numRef.WizardAllowChangeUp = NoYes::No;
 +
 +// Максимальный номер.
 +// Здесь мы предполагаем, что у нас не будет больше 9999 групп менеджеров.
 +numRef.WizardHighest = 9999;
 +numRef.SortField = 3;
 +
 +// Создаем
 +this.create( numRef);
 +  </code>
 +=== Использование номерной серии ===
 +==== Вне формы ====
 +<code XPP>
 +// Получение объекта "Номерная серия"
 +NumberSeq sequence = NumberSeq::newGetNum(
 +    NumberSequenceReference::find(
 +        typeId2extendedTypeId(typeID(<Ваш EDT>))));
 +;
 +// получение нового значения из номерной серии
 +<Таблица>.<Поле> = sequence.num();
 +</code>
 +==== В форме ====
 +Ниже инструкция, как добавить использование номерной серии в форму. //Немного переработанный пример из [[http://axapta.mazzy.ru/lib/numbersequence/]] -- устранена избыточность кода//
 +
 +в **class declaration** формы добавить:
 +<code XPP>
 + NumberSeqFormHandler numberSeq;
 +</code>
 +
 +в форму добавить метод для получения обработчика номерной серии (используется приём [[:ЛениваяИнициализация]])
 +<code XPP>
 +NumberSeqFormHandler numberSeq()
 +{
 +    ;
 +    if(!numberSeq)
 +    {
 +        numberSeq = numberSeqFormHandler::newForm(
 +            NumberSequenceReference::find(
 +                typeId2extendedTypeId(typeID(ИмяТипаДанных))
 +            ).NumberSequence,
 +            element,
 +            element.dataSource(),
 +            fieldNum(НазваниеТаблицы, НазваниеПоля)
 +        );
 +    }
 +    return numberSeq;
 +}
 +</code>
 +Перекрыть метод close на форме:
 +<code XPP>
 +public void close()
 +{
 +;
 +    if (numberSeq)
 +        numberSeq.formMethodClose();
 +    super();
 +}
 +</code>
 +
 +Перекрыть следующие методы источника данных формы и добавить в них обращения к обработчику номерной серии:
 +<code XPP>
 +public void delete()
 +{
 +;
 +    ttsbegin;
 +    element.numberSeq().formMethodDataSourceDelete();
 +    super();
 +    ttscommit;
 +}
 +
 +public void linkActive()
 +{
 +;
 +    element.numberSeq().formMethodDataSourceLinkActive();
 +    super();
 +}
 +
 +public void write()
 +{
 +;
 +    ttsbegin;
 +    super();
 +    element.numberSeq().formMethodDataSourceWrite();
 +    ttscommit;
 +}
 +
 +public boolean validateWrite()
 +{
 +    boolean ret;
 +;
 +    ret = super();
 +    ret = ret && element.numberSeq().formMethodDataSourceValidateWrite();
 +    return ret;
 +}
 +
 +public void create(boolean _append = false)
 +{
 +;
 +    element.numberSeq().formMethodDataSourceCreatePre();
 +    super(_append);
 +    element.numberSeq().formMethodDataSourceCreate();
 +}
 +</code>
 +===== примечания =====
 +1. Aльтернативный эквивалентный вариант validateWrite:
 +<code XPP>
 +public boolean validateWrite()
 +{
 +   return element.numberSeq().formMethodDataSourceValidateWrite(super());
 +}
 +</code>
 +2. При удалении записей из таблицы, в номерную серию возвращается номер только если запись не была сохранена. 
 +3. При закрытии происходит то же самое
 +=== см. также ===
 + 
 +  *[[http://axapta.mazzy.ru/lib/numbersequence_using/]]
 +  *[[http://axapta.mazzy.ru/lib/numbersequenceformat/]]
axapta/номерныесерии.txt · Последнее изменение: 2018/04/13 22:43 (внешнее изменение)