D365 X++:如何正确获取EcoResProductParameter扩展字段值完成校验?
问题解决思路及方案
核心问题分析
你遇到的错误根源是DataContract类中未正确获取表单上用户手动修改的MaxPercentage最新值:要么是直接引用了缓存的旧表记录,要么是表单字段未与DataContract的属性正确绑定,导致校验时拿的是修改前的数值,从而触发错误。
具体解决步骤
1. 绑定表单字段到DataContract属性(推荐方案)
不要直接在DataContract中访问表记录,而是将表单上的MaxPercentage字段绑定到DataContract的对应属性,确保校验时使用的是用户提交的最新值:
[DataContractAttribute] class YourCustomDataContract { SalesPercentMarkup salesPercentMarkup; MaxPercentage maxPercentage; // 新增与表单字段对应的属性 // 为SalesPercentMarkup定义数据成员 [DataMemberAttribute] public SalesPercentMarkup parmSalesPercentMarkup(SalesPercentMarkup _salesPercentMarkup = salesPercentMarkup) { salesPercentMarkup = _salesPercentMarkup; return salesPercentMarkup; } // 为MaxPercentage定义数据成员,让表单可以传递值过来 [DataMemberAttribute] public MaxPercentage parmMaxPercentage(MaxPercentage _maxPercentage = maxPercentage) { maxPercentage = _maxPercentage; return maxPercentage; } public boolean validate() { boolean isValid = true; // 直接用DataContract属性值做校验,避免表缓存问题 if (salesPercentMarkup > maxPercentage) { isValid = checkFailed('The percentage has exceeded the max'); } return isValid; } }
然后在表单的EcoResProductParameter数据源字段中,将DataMember属性设置为maxPercentage,确保表单提交时把用户输入的值传递到DataContract。
2. 强制读取最新表记录(备选方案)
如果必须从表中读取值,需要重新查询当前公司的最新参数记录,避免使用缓存的旧实例:
public boolean validate() { boolean isValid; EcoResProductParameter parameterTable; // 重新读取当前公司的最新参数记录,跳过缓存 select firstonly MaxPercentage from parameterTable where parameterTable.DataAreaId == curext(); if(salesPercentMarkup <= parameterTable.MaxPercentage) { isValid = true; } else { isValid = checkFailed('The percentage has exceeded the max'); } return isValid; }
3. 额外检查项
- 确认表单提交时已保存
MaxPercentage的修改:比如表单的保存按钮是否触发了数据源的write()操作,确保修改先写入数据库。 - 校验字段数据类型一致性:确保
SalesPercentMarkup和MaxPercentage是相同数值类型(如Real或Decimal),避免类型转换导致的比较错误。
内容的提问来源于stack exchange,提问作者Fabrizio Mastrone
相关产品推荐
相关产品推荐

