[[: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 | ]]