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

D365FO X++:通过Chain of Command实现字段条件必填校验

Dynamics 365 Finance and Operations 字段强制必填校验实现

需求场景

在Dynamics 365 Finance and Operations(D365FO)中,Table1_表包含复选框字段Field1_,当该字段设为Yes时,需强制要求Table2_表中的Field2_字段为必填项。计划通过对Table2_的validateWrite方法创建Chain of Command(CoC)扩展,实现用户未填写Field2_时,保存操作触发错误提示。

现有实现代码

[ExtensionOf(tableStr(Table2_))]
final class Table2__Table_Extension
{
    public boolean validateWrite(boolean _skipCreditLimitCheck)
    {
        boolean continueOnError = false; 
        boolean ret = next validateWrite();
        
        Table1_ table1 = Table1_::find(this.ProjId);
        
        if (table1.Field1_)
        {
            if (!this.Field2_)
            {
                if (continueOnError)
                {
                    error("@SYS98197");
                }
                else
                {
                    throw error("@SYS23020");
                }
            }
        }
        
        return ret;
    }
}

代码优化建议

  1. 调整校验顺序:当前代码先执行原表的validateWrite逻辑,再执行自定义校验。若原逻辑校验不通过直接返回false,自定义的必填校验会被跳过。建议先执行自定义校验,通过后再调用原方法。
  2. 移除冗余变量:continueOnError被固定赋值为false,导致永远只会触发throw error分支,可直接简化逻辑。
  3. 增加空记录判断:需先判断Table1_::find返回的记录是否存在,避免空引用异常。

优化后的代码示例:

[ExtensionOf(tableStr(Table2_))]
final class Table2__Table_Extension
{
    public boolean validateWrite(boolean _skipCreditLimitCheck)
    {
        boolean ret = true;
        Table1_ table1 = Table1_::find(this.ProjId);
        
        // 执行自定义必填校验
        if (table1 && table1.Field1_)
        {
            if (!this.Field2_)
            {
                throw error("@SYS23020");
                ret = false;
            }
        }
        
        // 调用原方法执行其他系统校验
        if (ret)
        {
            ret = next validateWrite(_skipCreditLimitCheck);
        }
        
        return ret;
    }
}

内容的提问来源于stack exchange,提问作者XDeveloperX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:05:03