我正在研究新代表的能力。 AX 2012中的事件订阅模式。
目前,我希望检测特定字段的修改时间,例如当SalesTable.SalesStatus
更改为SalesStatus::Invoiced
时。
我创建了以下事件后处理程序并附加到SalesTable.Update方法;
public static void SalesTable_UpdatePosteventHandler(XppPrePostArgs _args)
{
Info("Sales Update Event Handler");
}
现在我知道我可以从SalesTable
获得_args
,但是如何检测字段已经更改?我真的可以使用之前和之后在版本之后,这让我觉得我在这里订阅了错误的事件。
答案 0 :(得分:8)
如果update
方法未更新字段,则可以在更新方法上使用pre
event handler。如果要监视PriceGroup
表上的CustTable
字段,请创建一个名为CustTableEventHandler
的类,其中包含以下方法:
public static void preUpdateHandler(XppPrePostArgs _args)
{
CustTable custTable = _args.getThis();
if (custTable.PriceGroup != custTable.orig().PriceGroup)
info(strFmt("Change price group from '%1' to '%2'", custTable.orig().PriceGroup, custTable.PriceGroup));
}
post
事件处理程序无效,因为orig()
将返回已更改的记录。
此外,如果使用doUpdate
更新记录,则不会调用您的处理程序。
您也可以覆盖aosValidateUpdate
上的CustTable
,即使使用了doUpdate
,也会调用该public boolean aosValidateUpdate()
{
boolean ret = super();
if (this.PriceGroup != this.orig().PriceGroup)
info(strFmt("Change price group from '%1' to '%2'", this.orig().PriceGroup, this.PriceGroup));
return ret;
}
。此方法始终在AOS服务器上运行。
Application.eventUpdate
另一种选择是{{1}}方法的全局变更。 从方法的标题:
用作内核在记录中时调用的回调 表已更新,前提是内核已设置为监视 该表中的记录。
开发人员可以设置内核以回调给定的更新 table将记录插入DatabaseLog内核表中 字段设置为相关值,其中包括设置为的字段logType EventUpdate。可以设置内核应该回调 每当更新记录或更新特定字段时。这 与logUpdate的调用和设置方式非常相似。电话 此方法将在记录所在的事务中 更新。
alert rule通知系统使用此方法。我建议不要这样做,除非它是全局变化(如警报规则)。
警报规则可以延长as described here。