Axapta SysOperation Framework禁止同步的infolog消息,但将它们保留在批处理历史记录中
我刚刚接触到SysOperation框架,我有一些运行并调用Axapta SysOperation Framework禁止同步的infolog消息,但将它们保留在批处理历史记录中,axapta,x++,dynamics-ax-2012,dynamics-ax-2012-r2,sysoperationframework,Axapta,X++,Dynamics Ax 2012,Dynamics Ax 2012 R2,Sysoperationframework,我刚刚接触到SysOperation框架,我有一些运行并调用info(“启动…”)等的同步进程 我需要这些信息日志消息,以便在查看批处理历史记录时,可以看到它们,以便稍后进行调查 但它们也从批处理中启动到客户机。我可以分辨出它们来自批处理,因为你不能双击信息日志来找到源代码。是否有某种方法可以阻止这些内容在用户屏幕上弹出,并且只显示在批处理日志中 用一些代码编辑: 用户单击表单操作窗格上的按钮,该按钮调用引用类的操作菜单项 在类中,新方法: public void new() { sup
info(“启动…”)
等的同步进程
我需要这些信息日志消息,以便在查看批处理历史记录时,可以看到它们,以便稍后进行调查
但它们也从批处理中启动到客户机。我可以分辨出它们来自批处理,因为你不能双击信息日志来找到源代码。是否有某种方法可以阻止这些内容在用户屏幕上弹出,并且只显示在批处理日志中
用一些代码编辑:
用户单击表单操作窗格上的按钮,该按钮调用引用类的操作菜单项
在类中,新方法:
public void new()
{
super();
this.parmClassName(classStr(MyControllerClass));
this.parmMethodName(methodStr(MyControllerClass, pickTransLines));
this.parmExecutionMode(SysOperationExecutionMode::ReliableAsynchronous);
// This is meant to be running as a batch task, so don't load syslastvalue
this.parmLoadFromSysLastValue(false);
}
从菜单项中单击的主要方法:
public static void main (Args _args)
{
MyControllerClass controller = new MyControllerClass();
MyContract contract;
WMSOrderTrans wmsOrderTrans;
RefRecId refRecId;
if (_args && _args.dataset() == tableNum(WMSOrderTrans) && _args.record())
{
contract = controller.getDataContractObject();
contract.parmRefRecId(_args.record().RecId);
controller.parmShowDialog(false);
refRecId = controller.doBatch().BatchJobId;
// This creates a batch tracking record
controller.updateCreateTracking(refRecId, _args.record().RecId);
}
}
启动的控制器方法:
// Main picking method
private void pickTransLines(MyContract_contract)
{
MyTrackingTable tracking;
boolean finished;
BatchHeader batchHeader = BatchHeader::getCurrentBatchHeader();
boolean updateTracking = false;
// NOTE - This infolog launches after a few seconds to the user, but
// you can't double click on the info message to go to the code
// because it's fired from the batch somehow.
info(strFmt("Working on wmsordertrans.recid == %1", _contract.parmRefRecId()));
// Create/Update batch tracker if needed
if (this.isInBatch())
{
// NOTE - This code gets executed so we ARE in batch
this.updateTrackingStuff(...);
}
// Do the pick work
finished = this.doPick(_contract);
if(!finished)
throw error("An error occurred during the picking process.");
}
然后,一秒钟后,此任务将启动到我的会话:
查看SysOperationServiceController.afterOperation
方法:
[...]
if (_executionMode == SysOperationExecutionMode::ReliableAsynchronous)
{
batch = this.operationReturnValue();
if (batch)
{
infolog.view(Batch::showLog(batch.RecId));
}
}
[...]
这是向屏幕显示信息日志以进行可靠异步处理的代码
您可以通过扩展SysOperationServiceController
来创建自己的控制器,并在菜单项或代码中使用它,这样做并在新控制器上覆盖后操作
,例如(未测试,但在您的情况下应该可以工作):
如果批处理在服务器上运行,他们如何“启动到客户端”?你正在运行“私人批处理”吗?用清晰的细节更新了主要帖子。在我看来,代码方面似乎很简单……这就是为什么我感到困惑的原因。太棒了!工作得很好!
if (_executionMode != SysOperationExecutionMode::ReliableAsynchronous)
{
super(_executionMode, _asyncResult);
}