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; } }
代码优化建议
- 调整校验顺序:当前代码先执行原表的
validateWrite逻辑,再执行自定义校验。若原逻辑校验不通过直接返回false,自定义的必填校验会被跳过。建议先执行自定义校验,通过后再调用原方法。 - 移除冗余变量:
continueOnError被固定赋值为false,导致永远只会触发throw error分支,可直接简化逻辑。 - 增加空记录判断:需先判断
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
相关产品推荐
相关产品推荐

