5

我正在研究 AX 2012 中新的委托和事件订阅模式的功能。

目前我正在寻找检测特定字段何时被修改,例如何时SalesTable.SalesStatus更改为SalesStatus::Invoiced.

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

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

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

4

1 回答 1

9

如果该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));
}

事件处理程序将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;
}

另一种选择是对该Application.eventUpdate方法进行全局更改。从方法的标题:

用作更新表中的记录时由内核调用的回调,前提是内核已设置为监视该表中的记录。

开发人员可以设置内核以回调给定表的更新,方法是在 DatabaseLog 内核表中插入一条记录,所有字段都设置为相关值,其中包括字段 logType 设置为 EventUpdate。可以设置内核在更新记录或更新特定字段时回调。这与调用和设置 logUpdate 的方式非常相似。此方法的调用将在更新记录的事务中。

此方法由警报规则通知系统使用。我建议不要这样做,除非它是全局更改(如警报规则)。

警报规则可以按照此处所述进行扩展。

于 2013-10-07T12:17:28.373 回答