【报错分析】-即时库存与序列号数量不一致问题分析
金蝶云社区-李海洲
李海洲
5人赞赏了该文章 6246次浏览 未经作者许可,禁止转载编辑于2018年05月14日 17:28:38

问题现象:即时库存联查发现序列号与即时库存数量不对等。

图片.png

即时库存与序列号数量不一致,造成问题的原因可能会有很多种,
目前碰到过的一些原因:
1.同一序列号连续多次出库、或者入库,主档更新正常。
2.序列号保存未更新主档,导致后续多次出入库。
3.出库时与入库时即时库存维度不一致。
4.出入库更新主档正常,后续主档相关表数据无故被删除。
正常系统都有控制,不会出现以上异常,但是由于一些数据异常以及二开则会导致控制失效出现以上异常。

我将所排查过的一些客户的此类问题归为两类分析:

  • 系统仅存在某维度库存数量大于对应序列号数量(或仅存某维度库存数量小于对应序列号数量)。

  • 系统同时存在某维度库存数量大于对应序列号数量和某维度库存数量小于对应序列号数量,总数量一致



  • 系统仅存在某维度库存数量大于对应序列号数量(或仅存在某维度库存数量小于对应序列号数量)。

分析问题方法:
碰到此类问题一般比较麻烦,因为没法确定具体是多了哪个序列号或少了哪个序列号,
得从即时库存联查报表看单据收发对应序列号的流转,找到具体是多了或少了哪个序列号。
根据该序列号的主档分析单据数据情况。

问题示例:该物料库存为50联查序列号为52.

图片.png

排查思路如下:

查看明细分录对应情况:发现序列号数量各多出一个。

图片.png

联查物料收发明细报表查看即时库存是否正常:发现即时库存数量与报表流转一致。

图片.png

即时库存收发流转确认当前在库的序列号情况:发现

862261038739137,862700036332601 出库2次 :
出库单为销售出库单XC20011611000018、XC20011611009459。

图片.png

图片.png

图片.png

结论:同一个序列号多次出库,导致即时库存与序列号不一致。正常系统存在校验,后续未能重现这种制单情况具体原因不详。
修复方法:调整源问题单据。



  • 系统同时某维度库存数量大于对应序列号数量和某维度库存数量小于对应序列号数量,总数量一致。

分析问题方法:
此类问题一般很可能是序列号S1按照即时库存维度A入库,但是出库却是即时库存维度B出库。
这样就导致某维度库存数量大于对应序列号数量和某维度库存数量小于对应序列号数量,但是总数量一致。
这种问题,曾经碰到2例:
>1.序列号S1库存维度A入库出库后,后台修改其出库单的某个维度值为B,再校对。
>2.序列号S1采购入库单按照辅助属性A入库,后退料单按照辅助属性B出库(此问题已修复)
这样就会导致库存维度A数量比实际序列号多一个,库存维度B数量比实际序列号少一个
结论:后台不建议修改序列号在库库存单据上的维度信息。
修复方法:
>1.修改对应后台修改过的单据,再校对或者修改对应序列号记录的即时库存信息。
>2.系统进行反向操作,序列号S1按照辅助属性B入库,A出库做一次,填平对应的数量。



  • 其他类原因问题待补充了。。。




数据库中查询即时库存与序列号不一致脚本如下:

  1. /*

  2. 查:即时库存ID对应和序列号数量不一致的数据。

  3. 注明:账套中物料基本单位和序列号单位换算比例均为1:1 则此脚本中序列号数量和即时库存数量不做单位换算直接比较

  4. */

  5. SELECT  INV.FID '即时库存ID' ,

  6.         ISNULL(A.FSERIALQTY, 0) '序列号数量' ,

  7.         INV.FBASEQTY '即时库存基本单位数量'

  8. FROM    T_STK_INVENTORY INV

  9.         INNER JOIN dbo.T_BD_MATERIALSTOCK TMS ON INV.FMATERIALID = TMS.FMATERIALID

  10.         LEFT JOIN ( SELECT  T1.FINVID ,

  11.                             COUNT(1) AS FSERIALQTY

  12.                     FROM    T_BD_SERIALMASTER T0

  13.                             INNER JOIN T_BD_SERIALBILLTRACE T1 ON T0.FSERIALID = T1.FSERIALID

  14.                             INNER JOIN ( SELECT MAX(FBILLTRACEID) fbilltraceid

  15.                                          FROM   T_BD_SERIALBILLTRACE

  16.                                          WHERE  ( ISNULL(FINVID, ' ') <> ' ' )

  17.                                          GROUP BY FSERIALID

  18.                                        ) t2 ON T1.FBILLTRACEID = t2.fbilltraceid

  19.                     WHERE   ( ( T0.FFORBIDSTATUS = 'A'

  20.                               AND T1.FSTATE = '1'

  21.           )

  22.                             )

  23.                     GROUP BY T1.FINVID

  24.                   ) A ON A.FINVID = INV.FID

  25. WHERE   TMS.FISSNMANAGE = '1'

  26.         AND ( ( A.FINVID IS NOT NULL

  27.                 AND A.FSERIALQTY <> INV.FBASEQTY

  28.               )

  29.               OR ( A.FINVID IS NULL

  30.                    AND INV.FBASEQTY <> 0

  31.                  )

  32.             );

复制代码


赞 5