本文描述了在销售出库单保存过程中遇到的报错问题,指出销售出库单的反写操作导致出库数量超过了销售订单的最大可出数量。问题排查部分详细解释了反写规则的逻辑和超额判断的条件,并提供了检查相关字段的建议。在特殊情况处理中,针对云星空特定版本可能遇到的浮点数计算精度问题,给出了验证方法和修改反写规则的具体步骤,以解决因计算精度误差导致的超额判断异常问题。同时指出,该问题在新版本中已得到优化。
一、问题描述:
销售出库单保存提示报错:销售出库单【XSCKDXXXX】的明细信息第X行 反写销售订单【XSDDXXXX】的订单明细第X行的关联出库数量(库存基本)含跨级:出库数量超过订单最大可出数量!
二、问题排查:
该报错提示是因触发了反写规则(规则名:7.6销售出库单【保存】反写(累加)销售订单关联出库数量(库存基本)含跨级)的超额判断,
该反写规则的反写逻辑,是将销售出库单的库存基本数量,累加反写至销售订单的“关联出库数量(库存基本)含跨级”字段,用于在保存时点去判断订单的出库数量是否超过了订单数量,防止订单超额出库
在物料无浮动换算情况下,其超额判断逻辑大致如下:
1.销售订单启用了控制发货 且 超发控制单位类型为默认(即销售订单交货明细页签 控制发货数量 复选框勾选,超发控制单位类型为销售单位):
则关联出库数量(库存基本)含跨级 - 累计退货补货数量(库存基本)应小于等于 发货上限(基本),不满足则超额
2.销售订单未启用控制发货且超发控制单位类型为默认(即销售订单交货明细页签 控制发货数量 复选框未勾选,超发控制单位类型为销售单位):
则关联出库数量(库存基本)含跨级 - 累计退货补货数量(库存基本)应小于等于 销售基本数量,不满足则超额
根据以上逻辑,需优先检查下游的销售出库单库存基本数量,以及上游销售订单的如下字段:累计退货补货数量(库存基本)、发货上限(基本)、库存基本数量、销售基本数量是否正确,以及以上字段按照逻辑计算后,是否确实超额。如计算后确实超额,则说明该销售订单的出库数量确实超出了限制,需根据实际业务调整业务单据。
三、特殊情况及处理:
如检查以上字段均无问题,并不满足超额判断,但保存依然提示超额,且云星空版本为9.0.0.20240822或者9.0.0.20240711,则可能是遇到了浮点数的计算精度问题
可以这样验证下,比如订单数量45.84,打开浏览器控制台(按F12),录入45.84*45.84/45.84,即 数量*数量÷数量,看最终结果是否略小于原本数字,如果是,则是该计算精度误差导致的超额判断异常
针对该情况,可以按以下步骤处理
1.将反写规则“7.6销售出库单【保存】反写(累加)销售订单关联出库数量(库存基本)含跨级”通过复制新增一个出来,将其超额检查公式修改为(清空原有公式,将以下公式复制粘贴进去):
round(abs(float(FStockBaseOutJoinQty)) - abs(float(FStockBaseReBackQty)),10) > ( ( round(abs(round(float(FBaseDeliveryMaxQty),10))*abs(round(float(FStockBaseQty),10))/abs(round(float(FBaseUnitQty),10)),10) if FOUTLMTUNIT ='SAL' and FBaseUnitQty<>0 else abs(round(float(FBaseDeliveryMaxQty),10)) ) if FDeliveryControl==true else abs(round(float(FStockBaseQty),10)))
2.启用复制新增的这个规则,并将原有的默认规则禁用即可(重要!不可以有重复且生效的反写规则)
注:针对该问题,后续新版本已优化
推荐阅读