主题
月结检查:应付暂估 vs 存货暂估对账
用途:月结前核对「应付模块暂估余额」与「存货核算暂估结存」是否一致。这是月结最能卡的检查之一——两边暂估不平,月结过不去。
业务口径
- 应付暂估:采购发票未到、但已入库形成的暂估应付款(挂应付暂估科目)
- 存货暂估:存货核算里暂估入库形成的暂估结存金额
- 两者应相等;差异通常来自:先入库后改价、跨月红字回冲、暂估方式不一致
T-SQL 版本(SQL Server)
sql
-- 用途:比对应付暂估余额与存货核算暂估结存
-- 方言:T-SQL (SQL Server)
-- 参数:@period 会计期间 'YYYY-MM'
DECLARE @period CHAR(7) = '2026-07';
WITH ap AS ( -- 应付暂估
SELECT cInvCode, SUM(iAPCost) AS ap_amt
FROM AP_Estimate_Detail -- 示意表名,按版本核对
WHERE cPeriod = @period
GROUP BY cInvCode
),
ia AS ( -- 存货暂估
SELECT cInvCode, SUM(iCost) AS ia_amt
FROM IA_Estimate_Balance -- 示意表名
WHERE cPeriod = @period
GROUP BY cInvCode
)
SELECT
COALESCE(ap.cInvCode, ia.cInvCode) AS 存货编码,
ISNULL(ap.ap_amt, 0) AS 应付暂估,
ISNULL(ia.ia_amt, 0) AS 核算暂估,
ISNULL(ap.ap_amt, 0) - ISNULL(ia.ia_amt, 0) AS 差额
FROM ap
FULL OUTER JOIN ia ON ap.cInvCode = ia.cInvCode
WHERE ABS(ISNULL(ap.ap_amt, 0) - ISNULL(ia.ia_amt, 0)) > 0.01
ORDER BY ABS(ISNULL(ap.ap_amt, 0) - ISNULL(ia.ia_amt, 0)) DESC;Oracle 版本
sql
-- 用途:比对应付暂估余额与存货核算暂估结存
-- 方言:Oracle
-- 参数::period 会计期间 'YYYY-MM'
WITH ap AS ( -- 应付暂估
SELECT cInvCode, SUM(iAPCost) AS ap_amt
FROM AP_Estimate_Detail -- 示意表名
WHERE cPeriod = :period
GROUP BY cInvCode
),
ia AS ( -- 存货暂估
SELECT cInvCode, SUM(iCost) AS ia_amt
FROM IA_Estimate_Balance -- 示意表名
WHERE cPeriod = :period
GROUP BY cInvCode
)
SELECT
COALESCE(ap.cInvCode, ia.cInvCode) AS 存货编码,
NVL(ap.ap_amt, 0) AS 应付暂估,
NVL(ia.ia_amt, 0) AS 核算暂估,
NVL(ap.ap_amt, 0) - NVL(ia.ia_amt, 0) AS 差额
FROM ap
FULL OUTER JOIN ia ON ap.cInvCode = ia.cInvCode
WHERE ABS(NVL(ap.ap_amt, 0) - NVL(ia.ia_amt, 0)) > 0.01
ORDER BY ABS(NVL(ap.ap_amt, 0) - NVL(ia.ia_amt, 0)) DESC;语法差异速查
| 项 | T-SQL | Oracle |
|---|---|---|
| 判空 | ISNULL(x,0) | NVL(x,0) |
| 参数 | @period 变量 | :period 绑定变量 |
| 逻辑同 | COALESCE / FULL OUTER JOIN / ABS | 一致 |
常见差异原因
- 先入库后改价:入库单暂估后,采购订单改单价 → 应付按发票取价、存货按入库取价,基准不一致
- 跨月红字回冲:回冲期间与原单期间不同,导致某月单边有数
- 暂估方式不一致:应付用「单到回冲」、存货用「月初回冲」,口径对不上
排查建议
- 先看差异是单向还是双向(只有应付多,还是互有多少)
- 按单据逐笔比对,定位差异单据的共同特征
- 回溯操作日志,看是否有非常规操作(改价、跨月回冲)