主题
月结检查:库存台账 vs 库存核算对账
用途:核对「库存模块的现存量/台账」与「存货核算模块的结存」是否一致。库存和核算分属两个模块,日常出入库后若操作不完整(漏记账、未审核),两边会脱节。
业务口径
- 库存结存:库存模块的可用量/现存量(基于出入库单据)
- 核算结存:存货核算模块的结存数量/金额(基于记账后的单据)
- 正常两者一致;差异来自:单据未记账、记账时间差、库存调整未同步核算
T-SQL 版本(SQL Server)
sql
-- 用途:核对库存现存量与存货核算结存数量
-- 方言:T-SQL (SQL Server)
-- 参数:@wh 仓库编码(可空=全部)
DECLARE @wh VARCHAR(20) = NULL;
WITH inv AS ( -- 库存现存量
SELECT cInvCode,
SUM(CASE WHEN @wh IS NULL OR cWhCode = @wh THEN iQuantity ELSE 0 END) AS inv_qty
FROM CurrentStock -- 示意表:现存量表
GROUP BY cInvCode
),
ia AS ( -- 核算结存
SELECT cInvCode, SUM(iQuantity) AS ia_qty
FROM IA_Balance -- 示意表:存货核算结存
WHERE (@wh IS NULL OR cWhCode = @wh)
GROUP BY cInvCode
)
SELECT
COALESCE(i.cInvCode, a.cInvCode) AS 存货编码,
ISNULL(i.inv_qty, 0) AS 库存现存量,
ISNULL(a.ia_qty, 0) AS 核算结存,
ISNULL(i.inv_qty, 0) - ISNULL(a.ia_qty, 0) AS 数量差
FROM inv i
FULL OUTER JOIN ia a ON i.cInvCode = a.cInvCode
WHERE ABS(ISNULL(i.inv_qty, 0) - ISNULL(a.ia_qty, 0)) <> 0
ORDER BY ABS(ISNULL(i.inv_qty, 0) - ISNULL(a.ia_qty, 0)) DESC;Oracle 版本
sql
-- 用途:核对库存现存量与存货核算结存数量
-- 方言:Oracle
-- 参数::wh 仓库编码(可空=全部)
WITH inv AS ( -- 库存现存量
SELECT cInvCode,
SUM(CASE WHEN :wh IS NULL OR cWhCode = :wh THEN iQuantity ELSE 0 END) AS inv_qty
FROM CurrentStock -- 示意表
GROUP BY cInvCode
),
ia AS ( -- 核算结存
SELECT cInvCode, SUM(iQuantity) AS ia_qty
FROM IA_Balance -- 示意表
WHERE (:wh IS NULL OR cWhCode = :wh)
GROUP BY cInvCode
)
SELECT
COALESCE(i.cInvCode, a.cInvCode) AS 存货编码,
NVL(i.inv_qty, 0) AS 库存现存量,
NVL(a.ia_qty, 0) AS 核算结存,
NVL(i.inv_qty, 0) - NVL(a.ia_qty, 0) AS 数量差
FROM inv i
FULL OUTER JOIN ia a ON i.cInvCode = a.cInvCode
WHERE ABS(NVL(i.inv_qty, 0) - NVL(a.ia_qty, 0)) <> 0
ORDER BY ABS(NVL(i.inv_qty, 0) - NVL(a.ia_qty, 0)) DESC;语法差异速查
| 项 | T-SQL | Oracle |
|---|---|---|
| 判空 | ISNULL(x,0) | NVL(x,0) |
| 参数 | @wh 变量 | :wh 绑定变量 |
| CASE 表达式 | 一致 | 一致 |
常见差异原因
- 单据未记账:库存单据审核了,但存货核算没记账 —— 最常见
- 记账时间差:月结时点不同步,两边跑的时点不一致
- 库存调整未同步:库存模块做了盘盈/盘亏调整,核算没同步
排查建议
- 先确认差异单据清单:哪些入库单/出库单在库存有、核算没有
- 库房单据的「审核」和「记账」是两个动作,很多操作员只做了审核
- 月结前跑一遍,把差异单据记账补齐,再月结