Axapta 表更新事件处理程序
我正在调查AX 2012中新委托和事件订阅模式的功能 目前,我希望检测特定字段何时被修改,例如,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
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,你为我指明了正确的方向。您可能希望将此添加到您的答案的最后一个艺术中,因为我正在广泛使用它-而且,我将保留悬赏,直到它到期,以防万一!