[[:AxForum]]: [[http://www.axforum.info/forums/showthread.php?s=&threadid=823]] http://forum.mazzy.ru/index.php?showtopic=1846 ../Extends/Object {{toc}} === Введение === Класс RunBase служит базовым классом для создания классов-действий -- классов, которые выполняют одно некоторое действие. Если вы хотите выполнять действие в качестве пакетного задания, надо наследоваться от RunBaseBatch Как обычно, изучение класса RunBase начинается с рассмотрения примеров в стандартной Axapte таких как классы [[Tutorial_RunbaseBatch | ]], [[Tutorial_RunbaseForm | ]], являющимися наследниками RunBase. В основе лежит концепция формирования формы диалога из класса. Перед разработкой диалога необходимо определится с дизайном и функционалом. Это упростит разработку. Например, откуда будет вызываться диалог. Обычно это использование [[../ПунктМеню]]. Рассмотрим пример изменения дня рождения у сотрудника. Для запуска диалога необходимо определить, как минимум, следующие методы : classDeclaration, pack, unpack, dialog, main. При вызове класса активизируется статический метод main(). В нем определяется вызов диалога. Для добавления заголовка на форму необходимо использовать метод [[.RunBase:description]]. Для получения значения даты из диалога используется метод getFromDialog(). Для получения текущего курсора используется метод initFromArgs(). Выполнение необходимого функционала можно закладывать в run() или do(). Создаем класс public class Example_RunBase extends Run Base { EmplTable emplTable; //определение пременной в диалоге transDate transDate; //определение поля диалога dialogField dlgTransDate; // как правило стандартный набор #define.CurrentVersion(1) #define.Version1(1) #localmacro.CurrentList //хранение переменной transDate #endmacro } Методы pack и unpack можно переносить без изменений public Object dialog() { DialogRunBase dialog = super(); ; //определяется форма диалога, количесто полей, закладок. dlgTransDate = dialog.addFieldValue(typeid(transDate),transDate); return dialog; } static ClassDescription description() { return "Разработка диалога"; //определяем заголовок формы } public boolean getFromDialog() { ; // получение значения даты с диалога transDate = dlgTransDate.value(); return super(); } static void main(Args _args) { Example_RunBase example; ; //можно использовать для запрета вызова не через menuItem if (!_args || _args.dataset() != tableNum(EmplTable)) throw error(strfmt("@SYS25516")); // активизируем класс example = new Example_RunBase(); //получаем значение курсора example.initFromArgs(_args); //стандартный набор запускающий диалог if (example.prompt()) example.run(); } public void initFromArgs(Args _args) { ; emplTable = _args.record(); //получаем значение курсора } void run() //выполняем необходимые действия { boolean ok = true;// при нажатии ; if (ok) emplTable.BirthDate=transDate; } Размещаем на форме EmplTable menuItemButton, вызывающий наш класс и проверяем. Это самый простейший пример использования класса. Кто хочет использовать дополнительные возможности то будет полезным знать о других методах класса === Описание методов === 1. [[.RunBase:CanGoBatch]] Возвращает True если возможна пакетная обработка (т.е. можно указать когда запускать обработку и как часто ее запускать в автоматическом режиме) Возвращает False если пакетная обработка не возможна 2. CheckCloseDialog() Вызывается при закрытии диалога (CloseOk) 3. cleanupDialog() Вызывается при закрытии диалога (CloseCancel 4. Dialog() Вызывается из метода Prompt() и возвращает класс запуска формы dialog, ormRun 5. DalogTask() Вызывается из метода task() в диалоге 6. GetFromDialog() Вызывается из метода CheckFromDialog() 7. GetLast() Метод необходисо вызывать в классе наследнеке для получения сохраненных параметров при последнем вызаве этого класса (работает метод pack() и unpack()) 8. InitParmDefault() Вызывается если неудалось найти сохраненные параметры методом GetLast() 9. LastFalueDataAreaId() В какой компании идет работа 10. LastValueUserId() Пользователь. 11. pack() Через этот метод сохраняются параметры обработки return [#CurrentVersion, #CurrentList]; #CurrentVersion – макрос (local) версия сохранненных параметров #CurrentList – макрос (local) сохраняемые параметры 12. parmProgress() Метод Set/Get RunBaseProgress (прогресс) 13. progress*() методы для работы с прогрессом 14. Promt() Вызывается из класса наследника этот метод открываент диалог и если нажата кнопка OK и метод Validate() вернул True тогда метод Prompt() вернет значениеTrue If (this.Promt()) This.Run() 15. RunBase() Return this; 16. SaveLast() Вызывается из метода Prompt() если в диалоге нажта кнопка OK Метод сохраняет параметры (вызов метод pack()) 17. unpack() Распаковка параметров int version = runbase::getVersion(packedClass); switch (version) { case #CurrentVersion: [version,#CurrentList] = packedClass; return true; default : return false; } return false; 18. Validate() Вызывается при закрытии диалога (CloseOk) 19. static GetDescription(ClassId) Возвращет описание класса наследника static str Description() // лучше чтобы этот метод был в наследние { return <Описание класса> } void run() // Пример метода Run() { if (! This.Validate()) // только если вызывается форма, а не диалог throw Error(''); try { progress.progressinit(…) ttsbegin; While … { progress.inccount(); progress.settext(); … } ttscommit; } catch (exception::DeadLock) { retry; } } ===Потомки=== {{backlinks to="../Extends/RunBase"}} ===Диаграмма=== [[http://erpkb.com/Axapta/Klass/RunBase/files?get=runbaseprompt.jpg | ]]