文本描述了一个用户反馈的问题,即采购入库单反写采购订单后,剩余入库数量变为负数。通过分析,发现是由于累计入库数量超过了采购数量导致。文中详细追踪了跨级反写、交叉拆单和合并的过程,并找到问题所在:反写逻辑中,因特定规则和时间顺序,导致某些采购订单行未能获得预期的反写值,而全部反写值集中到了某个特定行(内码112964),从而造成剩余入库数量为负。文中还涉及了LK表、反写规则内码、分配上限等细节,最终解释了问题原因。
用户反馈采购入库单反写采购订单剩余入库数量为负,如下图:
从上面截图中可以看出是因为累计入库数量(库存基本)大于采购数量,导致剩余入库数量为负
找出相应的反写规则,反写规则内码为:92fe56c5-368e-480a-b1d6-b626bbb978c3,并且允许超额。
检查一下全流程跟踪,确定是跨级反写,并且存在交叉拆单和合并:
通过采购订单单据编号CGDD2008170033找到对应分录内码为112964,如下图:
通过采购订单分录内码,反写规则内码,采购入库单反写,找到相应的反写记录,如下图:
7. 可以看到刚好反写了540,那为什么会反写了540?就需要分析每张采购入库单的反写情况,通过反写快照fcid得到采购入库单内码分别为447248,447250,447251,对应的编码和分录内码如下图:
8. 分析第一张采购入库单CGRK20120400003的分录(内码为890405),反写了280,先检查它的Lk表,确定它的反写值和直接上游单据(收料通知单)分录内码114403
9. 再根据收料通知单分录内码114403检查LK表,确定它关联的采购订单分录内码为112964(也就是出现负数的采购订单分录),并且反写值为300,携带量为500,可以得出第一张采购入库单CGRK20120400003反写280只反写给采购订单分录内码为112964的行。
10. 分析第三张采购入库单CGRK20120400006的分录(内码为890408),反写值为20,跟第一张类似,,关联收料通知单分录内码为114403,收料通知单关联的采购订单分录为112964,也就是20都反写给了112964的行。
11. 分析第二张采购入库单CGRK20120400005的分录(内码为8904007),反写值为240,先检查它的Lk表,确定它的反写值240和直接上游单据(收料通知单)分录内码116902
12. 再根据收料通知单的分录内码16902,检查LK表,可以看到关联的采购订单有四行分录来源,分别是:115619,114962,114023,112964(需要分析的采购订单行),也就是说第二张采购入库单需要反写4张采购订单,并且把反写值都给了112964。如下图可以看出,反写的逻辑是跨级合并反写,存在跨级分配的情况。跨级分配逻辑参考:跨级分配逻辑。
下面继续分析第二张采购入库单为什么把所有的反写值都反写给了112964行:
首先要找到最大分配值, 跨级反写最大分配值来源反写规则分配上限和控制字段反写值中较小值
控制字段反写值:既收料通知单反写采购订单的值,如下图(可以从lk表查询或控制字段反写记录表),可以看到只有采购订单115619行有来收料通知单的反写值640,其他都为0,
反写规则分配上限:既反写规则中配置的分配上限(库存基本数量-累计入库数量(库存基本)),如下图,可以得到除114023分录行最大分配上限为340-100=240,其他的都是0,或小于零。
综合第2和第3点,最大可分配值可以分配值都是0,再按照至上而下的分配原则,故把 所有反写值都分配给最后一行,也就是112964行。
可能有人会疑问第3点是反写后的值,确实是;但根据第2点,就可以得出只有115619可以分配到640,那么为什么它没有分配到,根据第3点估计是因为它的反写规则最多分配上限为0,我们先来看一下采购入库单CGRK20120400005反写240是什么时候,如下图,可以看到是:2020-12-04 14:52:05
再检查一下采购订单115619分录行被反写的所有时间,如下图:可以得到最后的反写时间2020-12-04 14:51:54,从而得出在采购入库单CGRK20120400005反写240的时候,采购订单115619分录行的反写规则最大分配上限已经为0了。(这里还需注意,有可能采购入库单的反写记录归档到历史表中了,需要按一下保存操作把历史表的数据迁移到当前表)
综合上述,故采购入库单CGRK20120400005把240都反写给了采购订单分录内码为112964的行。
推荐阅读