文本主要描述了即时库存联查中发现的序列号与即时库存数量不对等的问题,分析了多种可能原因如序列号重复出入库、数据未更新等,并分类讨论了两类库存与序列号数量不一致的情况及其修复方法。同时提供了SQL查询脚本用于检测不一致的数据,强调了系统控制和二开可能导致的问题,并举例说明了如何通过查看明细单据来定位具体问题。
问题现象:即时库存联查发现序列号与即时库存数量不对等。
即时库存与序列号数量不一致,造成问题的原因可能会有很多种,
目前碰到过的一些原因:
1.同一序列号连续多次出库、或者入库,主档更新正常。
2.序列号保存未更新主档,导致后续多次出入库。
3.出库时与入库时即时库存维度不一致。
4.出入库更新主档正常,后续主档相关表数据无故被删除。
正常系统都有控制,不会出现以上异常,但是由于一些数据异常以及二开则会导致控制失效出现以上异常。
我将所排查过的一些客户的此类问题归为两类分析:
系统仅存在某维度库存数量大于对应序列号数量(或仅存某维度库存数量小于对应序列号数量)。
系统同时存在某维度库存数量大于对应序列号数量和某维度库存数量小于对应序列号数量,总数量一致。
系统仅存在某维度库存数量大于对应序列号数量(或仅存在某维度库存数量小于对应序列号数量)。
分析问题方法:
碰到此类问题一般比较麻烦,因为没法确定具体是多了哪个序列号或少了哪个序列号,
得从即时库存联查报表看单据收发对应序列号的流转,找到具体是多了或少了哪个序列号。
根据该序列号的主档分析单据数据情况。
问题示例:该物料库存为50联查序列号为52.
排查思路如下:
查看明细分录对应情况:发现序列号数量各多出一个。
联查物料收发明细报表查看即时库存是否正常:发现即时库存数量与报表流转一致。
即时库存收发流转确认当前在库的序列号情况:发现
862261038739137,862700036332601 出库2次 :
出库单为销售出库单XC20011611000018、XC20011611009459。
结论:同一个序列号多次出库,导致即时库存与序列号不一致。正常系统存在校验,后续未能重现这种制单情况具体原因不详。
修复方法:调整源问题单据。
系统同时某维度库存数量大于对应序列号数量和某维度库存数量小于对应序列号数量,总数量一致。
分析问题方法:
此类问题一般很可能是序列号S1按照即时库存维度A入库,但是出库却是即时库存维度B出库。
这样就导致某维度库存数量大于对应序列号数量和某维度库存数量小于对应序列号数量,但是总数量一致。
这种问题,曾经碰到2例:
>1.序列号S1库存维度A入库出库后,后台修改其出库单的某个维度值为B,再校对。
>2.序列号S1采购入库单按照辅助属性A入库,后退料单按照辅助属性B出库(此问题已修复)
这样就会导致库存维度A数量比实际序列号多一个,库存维度B数量比实际序列号少一个
结论:后台不建议修改序列号在库库存单据上的维度信息。
修复方法:
>1.修改对应后台修改过的单据,再校对或者修改对应序列号记录的即时库存信息。
>2.系统进行反向操作,序列号S1按照辅助属性B入库,A出库做一次,填平对应的数量。
其他类原因问题待补充了。。。
数据库中查询即时库存与序列号不一致脚本如下:
/*
查:即时库存ID对应和序列号数量不一致的数据。
注明:账套中物料基本单位和序列号单位换算比例均为1:1 则此脚本中序列号数量和即时库存数量不做单位换算直接比较
*/
SELECT INV.FID '即时库存ID' ,
ISNULL(A.FSERIALQTY, 0) '序列号数量' ,
INV.FBASEQTY '即时库存基本单位数量'
FROM T_STK_INVENTORY INV
INNER JOIN dbo.T_BD_MATERIALSTOCK TMS ON INV.FMATERIALID = TMS.FMATERIALID
LEFT JOIN ( SELECT T1.FINVID ,
COUNT(1) AS FSERIALQTY
FROM T_BD_SERIALMASTER T0
INNER JOIN T_BD_SERIALBILLTRACE T1 ON T0.FSERIALID = T1.FSERIALID
INNER JOIN ( SELECT MAX(FBILLTRACEID) fbilltraceid
FROM T_BD_SERIALBILLTRACE
WHERE ( ISNULL(FINVID, ' ') <> ' ' )
GROUP BY FSERIALID
) t2 ON T1.FBILLTRACEID = t2.fbilltraceid
WHERE ( ( T0.FFORBIDSTATUS = 'A'
AND T1.FSTATE = '1'
)
)
GROUP BY T1.FINVID
) A ON A.FINVID = INV.FID
WHERE TMS.FISSNMANAGE = '1'
AND ( ( A.FINVID IS NOT NULL
AND A.FSERIALQTY <> INV.FBASEQTY
)
OR ( A.FINVID IS NULL
AND INV.FBASEQTY <> 0
)
);
复制代码
推荐阅读