SalesLine.update调用错误:自定义销售行金额计算异常排查
问题分析与解决方案
错误原因
- 方法签名不匹配:你扩展的
update方法参数未定义默认值,与SalesLine表原update方法的签名不一致。原方法的参数都带有默认值,签名不匹配会导致next update()调用时参数传递错误,触发系统的参数校验报错。 - 逻辑位置错误:修改
LineAmount的计算逻辑不应放在update方法中。LineAmount通常由calcLineAmount方法负责计算,在update中直接修改会跳过系统原有的金额计算逻辑,引发数据一致性问题,同时也不符合D365FO的标准开发规范。 - 未初始化变量:代码中声明的
SalesLine saleLine变量未赋值就直接访问其字段,后续会引发空引用错误。
正确实现方式
应该扩展SalesLine的calcLineAmount方法,在原有金额计算基础上乘以自定义字段PRMSC_NoOfMonths,代码示例如下:
[ExtensionOf(tableStr(SalesLine))] final class PRMSC_SalesLine_Extension { public void calcLineAmount() { // 执行原有金额计算逻辑 next calcLineAmount(); // 仅当自定义字段有有效值时,调整行金额 if (this.PRMSC_NoOfMonths > 0) { this.LineAmount = this.LineAmount * this.PRMSC_NoOfMonths; } } }
额外说明
如果必须在update方法中处理逻辑(不推荐),需确保方法签名与原方法完全一致,包括参数默认值,并且正确处理更新逻辑:
[ExtensionOf(tableStr(SalesLine))] final class PRMSC_SalesLine_Extension { public void update(boolean _dropInvent = false, Common _childBuffer = null, boolean _updateOrderLineOfDeliverySchedule = false, boolean _mcrAutoallocate = false, boolean _cameFromCreate = false, boolean _promptSuppItem = false) { next update(_dropInvent, _childBuffer, _updateOrderLineOfDeliverySchedule, _mcrAutoallocate, _cameFromCreate, _promptSuppItem); // 使用当前记录,无需重新声明变量 if (this.PRMSC_NoOfMonths > 0 && this.LineAmount != this.LineAmount * this.PRMSC_NoOfMonths) { // 调用doUpdate避免循环触发update方法 this.LineAmount = this.LineAmount * this.PRMSC_NoOfMonths; this.doUpdate(); } } }
注意:在
update方法中修改字段后调用doUpdate需添加判断条件避免无限循环,因此更推荐使用calcLineAmount方法实现需求。
内容的提问来源于stack exchange,提问作者Saba Iqbal
相关产品推荐
相关产品推荐

