Ant*_*ake 5 ax x++ axapta dynamics-ax-2012 dynamics-ax-2012-r2
我正在调查AX 2012中新代表和事件订阅模式的功能.
目前,我希望检测特定字段何时被修改,例如何时SalesTable.SalesStatus更改为SalesStatus::Invoiced.
我创建了以下事件后处理程序并附加到SalesTable.Update方法;
public static void SalesTable_UpdatePosteventHandler(XppPrePostArgs _args)
{
Info("Sales Update Event Handler");
}
Run Code Online (Sandbox Code Playgroud)
现在我知道我可以得到SalesTable从_args,但我怎么能检测场发生了变化?我真的可以使用前后版本,这让我觉得我在这里订阅了错误的事件.
如果update方法不更新字段,则可以在update方法上使用pre 事件处理程序.如果要监视表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));
}
Run Code Online (Sandbox Code Playgroud)
一个post事件处理程序将无法正常工作,因为orig()将返回改变记录.此外,如果使用doUpdate您的处理程序更新记录,则不会调用.
你也可以覆盖aosValidateUpdateon CustTable,即使doUpdate被使用也会被调用.此方法始终在AOS服务器上运行.
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;
}
Run Code Online (Sandbox Code Playgroud)
另一种选择是该Application.eventUpdate方法的全球变化.从方法的标题:
用作内核在更新表中的记录时调用的回调,前提是内核已设置为监视该表中的记录.
开发人员可以通过将记录插入DatabaseLog内核表并将所有字段设置为相关值(包括设置为EventUpdate的字段logType)来设置内核以回调给定表的更新.无论何时更新记录或更新特定字段,都可以设置内核应该回调.这与调用和设置logUpdate的方式非常相似.此方法的调用将在更新记录的事务中.
警报规则通知系统使用此方法.我建议不要这样做,除非它是全局变化(如警报规则).
警报规则可以按此处所述进行扩展.