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

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


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

Различия

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

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

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 (внешнее изменение)