|
28.11.2004, 15:14 | #1 |
Участник
|
Вопрос: Как создать свой класс, который можно запустить по расписанию (в пакетном режиме)
Ответ: 1. Скопируйте класс tutorial_runbaseBatch. Дайте ему нужое вам имя 2. Определите ваши переменные в ClassDeclaration. 3. Вставьте ваши переменные в currentList для того, чтобы работал паттерн pack/unpack. При помощи этого паттерна передаются параметры в пакетную обработку 4. измените dialog, getFromDialog и putToDialog так, чтобы пользователь мог вводить значения ваших переменных 5. Создайте menuItem, укажите в его параметрах ваш класс. 6. Запустите menuItem, укажите на закладке Пакет параметры запуска пакета На скриншоте представлен диалог для класса tutorial_runbaseBatch |
|
29.11.2004, 14:30 | #2 |
Участник
|
Обсуждение этого FAQ ведется здесь
Обсуждение FAQ: Как создать свой класс, который можно запустить по расписанию |
|
19.12.2004, 08:05 | #3 |
Участник
|
Хочу дополнить теоретической подоплекой.
Класс 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); } |
|
19.12.2004, 12:00 | #4 |
Участник
|
Диаграмма работы runBase-диалога в двухуровневой и трехуровневой среде.
Спасибо за ссылку Вадиму Гончаренко (Vadik) |
|