在Microsoft Dynamics AX 2012中如何在表方法委托中获取common.orig()?
在Dynamics AX 2012中通过委托实现字段变更检查的方案
直接给结论:在表方法委托中直接获取common.orig()是不可行的——因为XppPrePostArgs只能传递方法的显式参数,而orig()是表实例的内部状态,不属于方法参数范畴,无法通过委托的默认参数机制获取。不过我们可以通过手动传递参数的方式绕开这个限制,实现你想要的字段变更检查逻辑。
1. 创建带参数的委托
首先定义一个委托,显式接收当前记录和原始记录作为参数:
delegate void FieldChangeHandler(Common _currentRecord, Common _origRecord);
这个委托建议创建在你需要监控的目标表上;如果是通用逻辑,也可以绑定到Common基类,但要注意后续类型转换的安全性。
2. 修改表的update()方法触发委托
在原表的update()方法中,先获取原始记录,再调用委托并传递两个记录实例:
public void update() { Common origRecord = this.orig(); // 先判断是否有订阅者,避免空指针错误 if (this.fieldChangeHandler) { this.fieldChangeHandler(this, origRecord); } super(); }
这里的核心是手动把orig()的结果作为参数传给委托,让订阅者能直接拿到原始记录进行对比。
3. 编写委托订阅方法
创建一个独立类(推荐解耦逻辑),编写具体的字段检查逻辑:
class MyFieldChangeSubscriber { public static void fieldChangeHandler(Common _currentRecord, Common _origRecord) { // 转换为具体表类型,避免类型不匹配问题 MyTable currentTable = _currentRecord as MyTable; MyTable origTable = _origRecord as MyTable; if (currentTable && origTable) { if (currentTable.Field != origTable.Field) { info('Changed'); } } } }
最后记得在AX的委托注册界面(或通过代码),把这个方法订阅到目标表的FieldChangeHandler委托上。
额外注意事项
- 如果需要给多个表实现类似逻辑,可以把委托定义在
Common基类上,在各表的update()方法中统一调用,但要做好类型校验。 - 若目标是系统表无法修改
update()方法,可以考虑用AX 2012的事件框架,但该方案在表方法场景下的稳定性不如手动传参的委托方案。
内容的提问来源于stack exchange,提问作者boucekv
相关产品推荐
相关产品推荐

