主题
数据迁移校验:存货期初与总账对不上
**脱敏声明。**本案例为真实项目复盘,按站内脱敏规范隐去客户名称、真实金额与业务截图。
一、背景
某流程制造客户,从老系统迁到 U8 V16.0。存货期初按「存货档案 + 结存数量 + 结存单价」导入,总账期初按科目余额导入。两边分别导入时都显示成功,但存货模块的期初金额和总账「原材料/库存商品」科目余额对不上,差额是一个不小的数字。
财务月结时被卡:存货模块结存与总账科目余额不勾稽。
二、需求
客户要的是**「存货账 = 总账」**,这是月结能过的前提。两边数字对不上,说明迁移口径有问题,得先搞清是「存货导少了」还是「总账导多了」。
三、诊断
排查路径
- 先算总差额:存货期初金额合计 vs 总账原材料+库存商品+在途科目余额
- 按存货大类(原材料/半成品/产成品)拆开对比,缩小差异范围
- 重点查负库存、零成本、暂估入库这三类特殊存货的取价方式
- 核对老系统「结存单价」是含税还是不含税、是移动加权还是全月平均
定位结论
| 类型 | 特征 | 占比 |
|---|---|---|
| A | 老系统结存单价是不含税,新系统导入时按含税填了,差额≈税额 | 约 5 成 |
| B | 老系统存在负库存(先出后入),结存单价计算方式导致负金额,新系统不允许负库存,导入时被置 0 | 约 3 成 |
| C | 在途物资(已付款未入库)老系统挂总账,新系统存货期初没导入 | 约 2 成 |
根因:两边口径不一致——「存货的期初单价口径」和「总账的科目余额口径」没在迁移方案阶段对齐。单价含税不含税、负库存怎么处理、在途挂哪,这三个问题不提前定义,导入后必然不平。
四、方案
- 短期(救火) —— 按差异拆三类处理:A 类统一改不含税单价重导;B 类负库存先做「调整入库」把负库存消掉再导;C 类在途物资补一笔期初采购入库单,挂「在途物资」科目
- 长期(治根) —— 迁移方案里增加「双口径校验」:存货模块期初 = 总账科目余额,两边必须同时平才算通过
五、配置
存货期初 vs 总账余额校验 SQL
sql
-- 用途:存货核算期初金额 vs 总账存货科目余额 差异核对
-- 方言:Oracle
-- 参数::year 年度
WITH inv AS ( -- 存货期初(按存货大类汇总)
SELECT cInvClass AS 大类, SUM(iQuantity * iPrice) AS inv_amt
FROM IA_InitBalance -- 示意表:存货期初余额
WHERE iYear = :year
GROUP BY cInvClass
),
gl AS ( -- 总账存货科目余额(原材料/库存商品/在途)
SELECT cInvClass AS 大类, SUM(md) AS gl_amt
FROM GL_balance
WHERE iYear = :year AND iPeriod = 0
AND cCode LIKE '1403%' OR cCode LIKE '1405%' OR cCode LIKE '1402%'
GROUP BY cInvClass
)
SELECT
COALESCE(i.大类, g.大类) AS 大类,
NVL(i.inv_amt, 0) AS 存货期初,
NVL(g.gl_amt, 0) AS 总账余额,
NVL(i.inv_amt, 0) - NVL(g.gl_amt, 0) AS 差额
FROM inv i
FULL OUTER JOIN gl g ON i.大类 = g.大类
WHERE ABS(NVL(i.inv_amt, 0) - NVL(g.gl_amt, 0)) > 0.01
ORDER BY ABS(NVL(i.inv_amt, 0) - NVL(g.gl_amt, 0)) DESC;T-SQL 写法差异:
NVL→ISNULL;FULL OUTER JOIN语法一致;:绑定变量改@参数。
六、踩坑
- **别只看总额。**总额平不代表明细平——A 类含税差异可能在某个大类内互相抵消,拆大类核对才能暴露。
- **负库存不能「直接置 0 导入」。**要先在业务上消掉(调整单),否则第一个月出库成本计算会出负数,月结更乱。
- **在途物资最容易漏。**迁移清单里「存货期初」和「总账期初」经常是两个团队各导各的,在途这种跨模块科目没人认领。
- 期初导入后先跑这个校验再开账,别等月结时才发现。
七、验收
- 存货期初金额 = 总账原材料/库存商品/在途科目余额,差额归零
- 负库存全部消化,无零成本异常
- 第一个月存货核算月结通过,与总账勾稽一致
- 在途物资科目有对应期初单据支撑,后续发票核销路径清晰
八、回顾
做对的:把差异拆成三类分别处理,没有笼统「调平」,每类都找到了根因。
做得不够的:迁移方案阶段没有把「单价口径」写死——含税/不含税这种一句话能定义的事,拖到导入后才暴露,返工成本最高。
可复用:双口径校验已沉淀进 模板库-数据初始化校验清单,迁移项目直接照做。