AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.03.2020, 13:03   #1  
oleggy is offline
oleggy
Участник
 
253 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
запуск класса RunBaseBatch
Привет.
Подскажите можно ли в методе
void main(Args _args)
пакетного класса (наследника RunBaseBatch) определить запущен данный пакетик в рамках переодической операции или в рамках вызова из формы?
Старый 24.03.2020, 13:26   #2  
Pandasama is offline
Pandasama
Участник
 
448 / 133 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
что имеется в виду под "в рамках периодической операции"? в пакетном режиме или нет?
Старый 24.03.2020, 13:29   #3  
axm2017 is offline
axm2017
Участник
 
1,748 / 292 (13) ++++++
Регистрация: 15.05.2017
main лишь статик отрабатывать будет наверное таки другой метод
isInBatch возможно вам поможет.
Старый 24.03.2020, 14:59   #4  
Pokersky09 is offline
Pokersky09
Участник
 
43 / 60 (3) ++++
Регистрация: 15.11.2012
Адрес: Turkey
Метод main вызывается только из форм, он не вызывается и не исполняется в пакетном задании. main отрабатывает клиентскую часть - отобразить диалог, собрать данные для запуска от юзера (если необходимо), и получить режим запуска от юзера - пакетный или нет. Все это происходит внутри метода prompt (который вызывается из main). Если юзер нажал чекбокс пакетного задания, то создается пакетное задание, которая запустится в отдельной сессии по расписанию. Это отдельная сессия АХ, и исходным (начальным) методом всегда является run.

Если Вам нужно внутри run понять, находится ли сейчас исполнение в пакетном задании или нет, то есть метод в RunBaseBatch.isInBatch().
За это сообщение автора поблагодарили: S.Kuskov (2), oleggy (1).
Старый 24.03.2020, 15:04   #5  
Omeo is offline
Omeo
Участник
 
129 / 50 (2) ++++
Регистрация: 18.03.2004
Адрес: Moscow
Цитата:
Сообщение от Pokersky09 Посмотреть сообщение
Метод main вызывается только из форм, он не вызывается и не исполняется в пакетном задании. main отрабатывает клиентскую часть - отобразить диалог, собрать данные для запуска от юзера (если необходимо), и получить режим запуска от юзера - пакетный или нет. .
мне кажется вы ошибаетесь,
main запускается всегда, просто в методе prompt базового класса что то есть про обработку в пакете, там вызов сохраненных параметров вызывается


edit: пардоньте, перепутал с runJobStatic в пакете

Последний раз редактировалось Omeo; 24.03.2020 в 15:34. Причина: ошибка
Старый 24.03.2020, 15:11   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
1. Статический метод main - это стартовый метод класса, если сам класс запускается через объект Menu Items. Т.е. через пункт меню.

Разумеется, это можно сделать и программно (и делают), но, как правило, это означает запуск пользователем "вручную". По кнопке или через пункт меню

2. При запуске класса в пакетном режиме сам запуск происходит следующим образом

X++:
myClass = new MyClass();   // Вот поэтому не надо в new() передавать параметры
myClass.unpack(xxx);
myClass.parmInBatch(true);  // Явным образом указывается признак запуска в пакетном режиме
myClass.run();
Вот по значению параметра parmInBatch() и можно определить, запущен ли класс в пакетном режиме или нет. Ну, или через isInBatch() - это чтение той же самой переменной
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 24.03.2020, 16:08   #7  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Вот по значению параметра parmInBatch() и можно определить, запущен ли класс в пакетном режиме или нет. Ну, или через isInBatch() - это чтение той же самой переменной
В стандарте это так, но уже в нескольких модификациях видел как при программном запуске разноски накладной в DAX2009 (не в пакетном режиме) принудительно устанавливался parmInBatch(true), чтобы сама разноска запускалась в отдельной пакетной задаче и не нужно было ждать, в итоге SalesFormLetter "обманывался" и считал, что работает в пакете.
Железобетонно определит работаем ли в пакете метод 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  
oleggy is offline
oleggy
Участник
 
253 / 36 (2) +++
Регистрация: 03.12.2019
Адрес: Россия
Спасибо. А из отчета (класс ReportRun) можно узнать запущен отчет пользователем или в пакете?
Старый 25.03.2020, 16:53   #9  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1234 (44) ++++++++
Регистрация: 11.04.2008
если - наследник RunBaseReport (см. класс Tutorial_RunbaseReport), то аналогично, как подсказали.
Если нет, то есть глобальный метод Global::hasGUI(). Если вернёт false, то выполняется точно не в клиентской сессии (а значит, выполняется из-под Batch, Web, EP, .Net business connector).
За это сообщение автора поблагодарили: Pandasama (1).
Старый 25.03.2020, 22:09   #10  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
видел как при программном запуске разноски накладной в DAX2009 (не в пакетном режиме) принудительно устанавливался parmInBatch(true),
В таких случаях должны были бы дописать дополнительный признак, указывающий на способ запуска. Там ведь наверняка надо не все обходить. А часть оставить "как есть".

Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
Железобетонно определит работаем ли в пакете
Если идти по пути извращений, то кроме собственно признака выполнения в пакете в экземпляр класса записывается еще и запись таблицы Batch.

batchClass.parmCurrentBatch(batch);

Поэтому можно посмотреть еще есть ли не пустое значение табличной переменной Batch в текущем классе

BatchHeader::getCurrentBatchTask(); - это то пакетное задание, которое выполняется сейчас. Вопрос-то был не о том, выполняется ли что-нибудь, а выполняется ли именно данный экземпляр класса в пакете? Да, конечно, скорее всего, это будет один и тот же экземпляр. Но как-то это из разряда "у нас джентльменам верят на слово" (с)
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 26.03.2020, 08:00   #11  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
BatchHeader::getCurrentBatchTask(); - это то пакетное задание, которое выполняется сейчас. Вопрос-то был не о том, выполняется ли что-нибудь, а выполняется ли именно данный экземпляр класса в пакете?
Не, немного не так.
Это то задание, которое выполняется:
  • Сейчас.
  • С номером сессии, которая выполняется сейчас.
  • С датой начала сессии, которая выполняется сейчас.
Пакетный сервер для каждой задачи создает свою сессию, поэтому это абсолютно уверенно мы и есть.
Именно на этом же механизме основано получение заголовка, в который мы можем добавлять себе "помощников", тех же RunTimeTask.
Старый 26.03.2020, 08:17   #12  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
В таких случаях должны были бы дописать дополнительный признак, указывающий на способ запуска. Там ведь наверняка надо не все обходить. А часть оставить "как есть".
Там даже не нужно было менять стандартный код SalesFromLetter.
Стандарт, когда работает в пакете, создает себе "помощников" RunTimeTask на формирование и разноску накладной (точнее, по одному помощнику на каждую накладную, если работает групповая разноска) и одного помощника для завершения.
Если разноска изначально идет в пакете, то помощники создаются внутри общей задачи. А вот если сам запуск не в пакете, но мы передали parmInBatch(true), то разноска обманывается, отрабатывают те же механизмы, но так как текущей задачи нет, то она автоматом создается и все помощники добавляются к ней.
В результате без пакета работает только сама подготовка и запуск, а остальное в пакете.
Понятно, что можно было программно создать пакетную задачу с нуля, то работает и так. Видел это уже не раз, вполне возможно, что в разных местах делал это один и тот же разработчик.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как узнать имя класса наследника RunBaseBatch oleggy DAX: Программирование 3 27.01.2020 11:22
axaptapedia: RunBaseBatch Blog bot DAX Blogs 0 04.04.2009 22:05
axaptapedia: RunBaseBatch Blog bot DAX Blogs 0 31.03.2009 06:06
Запуск AX класса по расписанию SQL job'ом Iris! DAX: Программирование 5 08.05.2007 16:24
Запуск jobа из класса Migel_84 DAX: Программирование 12 05.05.2006 15:31
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 23:05.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.