Определите, выполняется ли задание в коде X++
У меня есть сценарий, когда служба передает данные в AX, а затем мы используем SysOperationFramework для обработки этих данных, не заставляя клиента службы ждать завершения обработки.
Проблема возникает, если пользователь пытается открыть запись во внешнем приложении во время обработки.
Есть ли способ в X++, чтобы увидеть, какие задания в настоящее время выполняются (и, кроме того, посмотреть параметры, которые были переданы), чтобы мы могли отправить ошибку, которую мы можем обработать для пользователя?
1 ответ
Есть способ, да. Данные, которые вы ищете, хранятся в Batch
Таблица. Вы найдете ClassNumber
и поле состояния. Просто выберите запись, соответствующую вашему классу, которая имеет статус выполнения. Если запись существует, она выполняется.
Параметры хранятся в Parameters
поле в контейнере. Вы можете распаковать контейнер, создав экземпляр вашего класса и распаковав его, вот так (быстрый код, который не скомпилируется, но вы поймете суть):
Batch batch;
SysOperationServiceController sysOperationServiceController;
YourDataContract yourDataContract;
select batch
where batch.ClassNumber = YourClassNumber
&& batch.Status == BatchStatus::Executing;
// todo: you might have to check the type of the object before assignment
// todo: also check if batch record has been found
sysOperationServiceController = batch.object();
if (sysOperationServiceController.unpack(batch.Parameters))
{
// todo: you might have to check the type of the object before assignment
yourDataContract = sysOperationServiceController.getDataContractObject('_theParemterNameOfyourDataContract');
// todo: here you can read the parameters from your contract
}
else
{
throw error("Unpack failed");
}