Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Axapta 表更新事件处理程序_Axapta_X++_Dynamics Ax 2012_Ax_Dynamics Ax 2012 R2 - Fatal编程技术网

Axapta 表更新事件处理程序

Axapta 表更新事件处理程序,axapta,x++,dynamics-ax-2012,ax,dynamics-ax-2012-r2,Axapta,X++,Dynamics Ax 2012,Ax,Dynamics Ax 2012 R2,我正在调查AX 2012中新委托和事件订阅模式的功能 目前,我希望检测特定字段何时被修改,例如,SalesTable.SalesStatus更改为SalesStatus::invoinced 我已经创建了以下post事件处理程序并附加到SalesTable.Update方法 public static void SalesTable_UpdatePosteventHandler(XppPrePostArgs _args) { Info("Sales Update Event Handle

我正在调查AX 2012中新委托和事件订阅模式的功能

目前,我希望检测特定字段何时被修改,例如,
SalesTable.SalesStatus
更改为
SalesStatus::invoinced

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

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

现在我知道我可以从
\u args
获取
销售表,但是如何检测字段已更改?我真的可以使用前后版本,这使我认为我在这里订阅了错误的事件。

如果
update
方法不更新字段,您可以在更新方法上使用
pre
。如果要监视
CustTable
表上的
PriceGroup
字段,请创建一个名为
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
更新记录,则不会调用处理程序

您还可以覆盖
custable
上的
aosValidateUpdate
,即使使用了
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;
}
另一个选择是对
应用程序.eventUpdate
方法进行全局更改。 从方法的标题:

用作内核在 表已更新,前提是内核已设置为监视 那张表上的记录

开发人员可以设置内核,以便在给定时间内调用更新 通过将记录插入DatabaseLog内核表 字段设置为相关值,包括字段日志类型设置为 事件更新。可以设置内核应该回调 每当更新记录或更新特定字段时。此 与logUpdate的调用和设置非常相似。电话 此方法的副本将位于记录所在的事务中 更新

通知系统使用此方法。我建议不要这样做,除非这是一个全球性的变化(如警报规则)


警报规则可以扩展。

可能不是您的答案,但您能否使用salesTable.orig()值检测更改@ian_scho我认为它不起作用,因为我正在关注更新答案Jan我会在尝试了其中一些后再联系你Jan,你为我指明了正确的方向。您可能希望将此添加到您的答案的最后一个艺术中,因为我正在广泛使用它-而且,我将保留悬赏,直到它到期,以防万一!