表更新事件处理程序

时间:2013-10-04 10:40:36

标签: axapta x++ dynamics-ax-2012 ax dynamics-ax-2012-r2

我正在研究新代表的能力。 AX 2012中的事件订阅模式。

目前,我希望检测特定字段的修改时间,例如当SalesTable.SalesStatus更改为SalesStatus::Invoiced时。

我创建了以下事件后处理程序并附加到SalesTable.Update方法;

public static void SalesTable_UpdatePosteventHandler(XppPrePostArgs _args)
{
    Info("Sales Update Event Handler");
}

现在我知道我可以从SalesTable获得_args,但是如何检测字段已经更改?我真的可以使用之前和之后在版本之后,这让我觉得我在这里订阅了错误的事件。

1 个答案:

答案 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