24.03.2020, 13:03 | #1 |
Участник
|
запуск класса RunBaseBatch
Привет.
Подскажите можно ли в методе void main(Args _args) пакетного класса (наследника RunBaseBatch) определить запущен данный пакетик в рамках переодической операции или в рамках вызова из формы? |
|
24.03.2020, 13:26 | #2 |
Участник
|
что имеется в виду под "в рамках периодической операции"? в пакетном режиме или нет?
|
|
24.03.2020, 13:29 | #3 |
Участник
|
main лишь статик отрабатывать будет наверное таки другой метод
isInBatch возможно вам поможет. |
|
24.03.2020, 14:59 | #4 |
Участник
|
Метод main вызывается только из форм, он не вызывается и не исполняется в пакетном задании. main отрабатывает клиентскую часть - отобразить диалог, собрать данные для запуска от юзера (если необходимо), и получить режим запуска от юзера - пакетный или нет. Все это происходит внутри метода prompt (который вызывается из main). Если юзер нажал чекбокс пакетного задания, то создается пакетное задание, которая запустится в отдельной сессии по расписанию. Это отдельная сессия АХ, и исходным (начальным) методом всегда является run.
Если Вам нужно внутри run понять, находится ли сейчас исполнение в пакетном задании или нет, то есть метод в RunBaseBatch.isInBatch(). |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2), oleggy (1). |
24.03.2020, 15:04 | #5 |
Участник
|
Цитата:
main запускается всегда, просто в методе prompt базового класса что то есть про обработку в пакете, там вызов сохраненных параметров вызывается edit: пардоньте, перепутал с runJobStatic в пакете Последний раз редактировалось Omeo; 24.03.2020 в 15:34. Причина: ошибка |
|
24.03.2020, 15:11 | #6 |
Участник
|
1. Статический метод main - это стартовый метод класса, если сам класс запускается через объект Menu Items. Т.е. через пункт меню.
Разумеется, это можно сделать и программно (и делают), но, как правило, это означает запуск пользователем "вручную". По кнопке или через пункт меню 2. При запуске класса в пакетном режиме сам запуск происходит следующим образом X++: myClass = new MyClass(); // Вот поэтому не надо в new() передавать параметры myClass.unpack(xxx); myClass.parmInBatch(true); // Явным образом указывается признак запуска в пакетном режиме myClass.run();
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
24.03.2020, 16:08 | #7 |
Участник
|
Цитата:
Железобетонно определит работаем ли в пакете метод BatchHeader::isExecutingInBatch(). Не помню, был ли он в DAX2009, но его код элементарный: X++: public static boolean isExecutingInBatch() { Batch batch = BatchHeader::getCurrentBatchTask(); if (batch) { return true; } return false; } |
|
|
За это сообщение автора поблагодарили: Logger (3), S.Kuskov (5), Pandasama (1), oleggy (1). |
25.03.2020, 11:07 | #8 |
Участник
|
Спасибо. А из отчета (класс ReportRun) можно узнать запущен отчет пользователем или в пакете?
|
|
25.03.2020, 16:53 | #9 |
Боец
|
если - наследник RunBaseReport (см. класс Tutorial_RunbaseReport), то аналогично, как подсказали.
Если нет, то есть глобальный метод Global::hasGUI(). Если вернёт false, то выполняется точно не в клиентской сессии (а значит, выполняется из-под Batch, Web, EP, .Net business connector). |
|
|
За это сообщение автора поблагодарили: Pandasama (1). |
25.03.2020, 22:09 | #10 |
Участник
|
Цитата:
Если идти по пути извращений, то кроме собственно признака выполнения в пакете в экземпляр класса записывается еще и запись таблицы Batch. batchClass.parmCurrentBatch(batch); Поэтому можно посмотреть еще есть ли не пустое значение табличной переменной Batch в текущем классе BatchHeader::getCurrentBatchTask(); - это то пакетное задание, которое выполняется сейчас. Вопрос-то был не о том, выполняется ли что-нибудь, а выполняется ли именно данный экземпляр класса в пакете? Да, конечно, скорее всего, это будет один и тот же экземпляр. Но как-то это из разряда "у нас джентльменам верят на слово" (с)
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
26.03.2020, 08:00 | #11 |
Участник
|
Цитата:
Это то задание, которое выполняется:
Именно на этом же механизме основано получение заголовка, в который мы можем добавлять себе "помощников", тех же RunTimeTask. |
|
26.03.2020, 08:17 | #12 |
Участник
|
Цитата:
Стандарт, когда работает в пакете, создает себе "помощников" RunTimeTask на формирование и разноску накладной (точнее, по одному помощнику на каждую накладную, если работает групповая разноска) и одного помощника для завершения. Если разноска изначально идет в пакете, то помощники создаются внутри общей задачи. А вот если сам запуск не в пакете, но мы передали parmInBatch(true), то разноска обманывается, отрабатывают те же механизмы, но так как текущей задачи нет, то она автоматом создается и все помощники добавляются к ней. В результате без пакета работает только сама подготовка и запуск, а остальное в пакете. Понятно, что можно было программно создать пакетную задачу с нуля, то работает и так. Видел это уже не раз, вполне возможно, что в разных местах делал это один и тот же разработчик. |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Как узнать имя класса наследника RunBaseBatch | 3 | |||
axaptapedia: RunBaseBatch | 0 | |||
axaptapedia: RunBaseBatch | 0 | |||
Запуск AX класса по расписанию SQL job'ом | 5 | |||
Запуск jobа из класса | 12 |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|