08.04.2011, 10:32 | #1 |
Участник
|
Пакетное задание
Добрый день. Возникли трудности с пакетным заданием. AX2009. Создал пакетный класс:
X++: class S_RemoveOldRecordsBatch extends RunBaseBatch { anytype dummy; #define.CurrentVersion(1) #define.Version1(1) #localmacro.CurrentList dummy #endmacro } X++: void DelOldRecords() { S_CustVendCommon s_CustVendCommon; ; ttsbegin; while select forupdate s_CustVendCommon where (s_CustVendCommon.NoYesCombo == NoYesCombo::Yes) { if( intvNo(Today(), s_CustVendCommon.TransDate, intvScale::YearMonth) >= 1) { s_CustVendCommon.delete(); } } ttscommit; } X++: public container pack() { return connull(); } X++: public boolean unpack(container packedClass) { return true; } X++: static void main(Args _args) { S_RemoveOldRecordsBatch s_RemoveOldRecordsBatch = new S_RemoveOldRecordsBatch(); ; s_RemoveOldRecordsBatch.DelOldRecords(); } Для пакетного задания выбрана пакетная группа, Указано запускать на сервере, Указан АОС, который является сервером пакетной обработки и выбранная группа входит в этот АОС. Ошибок в журнале нет. |
|
08.04.2011, 10:42 | #2 |
MCP
|
Можете поставить точку останова в методе s_RemoveOldRecordsBatch.DelOldRecords() и запустить выполнение в пакетном режиме (т.е. после запуска задание повеситься в пакет, а потом толкните выполнение пакетной группы вручную).
Вообще у вас пустые методы pack и unpack, т.е. при распаковке класса на сервере ничего нет. Попробуйте перекрыть эти методы вот так: X++: public container pack() { ; return [#CurrentVersion]; } X++: public boolean unpack(container packedClass) { Version version = RunBase::getVersion(packedClass); container queryCon; ; switch (version) { case #CurrentVersion: [version] = packedClass; break; default: return false; } return true; } |
|
08.04.2011, 10:42 | #3 |
Участник
|
Прикольно. Я помню тоже попадал на такую подставу. В классах-наследниках RunBaseBatch нужно все действия вписывать в run(). Именно этот метод вызывается пакетным сервером.
__________________
Дмитрий |
|
|
За это сообщение автора поблагодарили: AngelDominantes (1). |
08.04.2011, 11:11 | #4 |
Участник
|
|
|
08.04.2011, 11:32 | #5 |
----------------
|
другой вариант
Аналогичный эффект получается, если в getFromDialog не вызвать super.
-------- понимаю, что не в тему, но вдруг кому понадобится |
|
08.04.2011, 15:06 | #6 |
Участник
|
Если опустить частности, то выполнение класса через пакетное задание происходит следующим образом
X++: batchClass = classfactory.createClass(classId);
batchClass.parmInBatch(true);
batchClass.unpack(...);
batchClass.run(); Как видно из общей схемы, при запуске класса из сервера пакетной обработки, переменная inBatch принимает значение true. Опираясь на этот факт можно в самом начале метода run() "вручную" запустить те методы, которые "в обычном" состоянии запускаются из main(). |
|
Теги |
batch, runbasebatch, как правильно |
|
|