You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:35:49