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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.11.2004, 15:14   #1  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Вопрос: Как создать свой класс, который можно запустить по расписанию (в пакетном режиме)

Ответ:
1. Скопируйте класс tutorial_runbaseBatch. Дайте ему нужое вам имя
2. Определите ваши переменные в ClassDeclaration.
3. Вставьте ваши переменные в currentList для того, чтобы работал паттерн pack/unpack. При помощи этого паттерна передаются параметры в пакетную обработку
4. измените dialog, getFromDialog и putToDialog так, чтобы пользователь мог вводить значения ваших переменных
5. Создайте menuItem, укажите в его параметрах ваш класс.
6. Запустите menuItem, укажите на закладке Пакет параметры запуска пакета

На скриншоте представлен диалог для класса tutorial_runbaseBatch
Миниатюры
Нажмите на изображение для увеличения
Название: p.gif
Просмотров: 411
Размер:	21.2 Кб
ID:	9713  
__________________
полезное на axForum, github, vk, coub.
Старый 19.12.2004, 08:05   #3  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Хочу дополнить теоретической подоплекой.

Класс RunBaseBatch очень важен в Аксапте и буквально красной нитью проходит по всем процессам в ней. Подавляющее большинство menuitem-ов прямо или косвенно запускают наследников этого класса.
И это очень важный момент - в идеологии аксапты любая мало мальски трудоёмкая операция обязана иметь возможность быть отложенной в очередь заданий на пакетную обработку. Под "любой мало мальски трудоёмкой операцией" как правило подразумеваются все действия, которые находятся в менюшках "Журналы" (при выполнении разносок, резервирований и т.п.), "Периодические операции", "Отчёты".
Для пользователя это выглядит следующим образом: при нажатии на кнопку (или пункт меню) начинающую какую либо операцию (например разноску журнала или формирование отчёта) сперва открывается диалог содержащий в себе параметры операции и либо закладку "Пакет" либо кнопку "Пакет". По нажатию на OK операция либо начинается выполнятся сразу, либо (если проставлены соответствующие опции), откладываеся в очередь заданий для пакетной обработки (Основное->Запросы->Пакеты) где будет лежать, до тех пор пока её не запустят оттуда вручную, либо пока её не запустит сервер пакетной обработки (Основное->Периодические операции->Пакет->Режим сервера).
Для программиста в простейшем случае это выглядит так, как описал mazzy выше. Т.е. создаётся класс, наследник от RunbaseBatch по вышеприведенной схеме, и по нажатии на кнопки запускается именно он.
Но схема по которой сделан класс tutorial_RunBaseBatch неудобна, когда параметров в диалоге много и между ними нужно организовать какую нибудь функциональную взаимосвязь (другими словами - "умно" реагировать на ввод пользователя в диалог). Обычный диалог позволяет лишь "накидать на него" поля ввода и по нажатию на OK прочитать их значения.
Когда требуется сложная форма диалога для RunBaseBatch существует возможность задать для этого диалога свою собственную форму, разработанную в AOT - как это делается показано в классе tutorial_RunBaseForm. В методе dialog() помещается примерно следующий код:
Код:
public Object dialog()
{
    dialogRunbase   dialog = dialog::newFormnameRunbase(formstr(имя_нашей формы_в_AOT),this);
;
    dialog = super(dialog);
    // Заполнение полей или передача их в форму
    ...
    return dialog;
}
К форме предявляются следующие требования:
1. В ней должен быть Tab с именем Tab - в него автоматически подставится закладка "Пакет" при запуске
2. В ней должна быть группа (Group) с именем dialogStartGrp - в неё будут помещены поля, которые вы добавляете через метод addField
3. Ну и разумеется две кнопки типа CommanButton: OK и Cancel

Существует еще возможность вместо закладки "Пакет" помещать на свою форму только кнопку "Пакет", при нажатии на которую откроется дополнительный диалог с параметрами пакетных заданий и тем самым сэкономить место на форме - для этого надо поместить на форму menuItemButton настроенный на menuItem BatchDialog, и подавить вывод закладки "Пакет" (как это сделать - отдельный разговор, к которому я пока не готов ).

Ну и последнее что остаётся сказать - это RunbaseBatch для отчётов.
Так как формирование отчётов как правило является трудоёмкой операцией отчёты - наипрямейшие кандидаты в очередь пакетных заданий.
Но в самих отчётах такой функциональности нет, и поэтому большинство стандартных menuItem-ов отчётов указывают не непосредственно на сами отчёты, а на классы наследники от RunbaseReport (см. tutorial_RunbaseReport). Самое главное в таком классе-наследнике переопределить метод lastValueElementName так, чтобы он возвращал имя отчёта в АОТ:
Код:
identifiername lastValueElementName()
{
    return reportStr(MyReport);
}
Так же как и в других наследниках от RunbaseBatch здесь можно организовывать ввод параметров для дальнешей передачи в отчёт.
Старый 19.12.2004, 12:00   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Диаграмма работы runBase-диалога в двухуровневой и трехуровневой среде.

Спасибо за ссылку Вадиму Гончаренко (Vadik)
Миниатюры
Нажмите на изображение для увеличения
Название: RunbasePrompt.jpg
Просмотров: 481
Размер:	109.9 Кб
ID:	9722  
__________________
полезное на axForum, github, vk, coub.
 


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

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

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