本文详细分析了存货对账的原理及常见问题的解决方法。存货对账涉及存货业务数据、凭证数据及总账等多方面的数据汇总与核对。若业务系统上期期末与本期期初对账不平衡,需先确认上期是否已对平,未对平时按一般流程检查。若已对平,则重点检查业务数据问题,包括对账界面取数与存货收发汇总表取数的一致性、调拨单据跨期问题、异价调拨情形等,并提供了相应的解决步骤和脚本修复方法。
1 对账原理分析
1.1 存货对账是以存货业务数据和凭证数据做汇总来对账,大部分根据存货类别按科目对账
1.2 总账方面是按照科目取对应凭证做汇总
1.3 业务系统则以 成本费用项目 的数据做汇总;这是因为成本相关的业务单据,对应的预置凭证模板,金额字段取值主要为【总成本(费用明细)】字段
2 存货对账业务系统上期期末不等于本期期初,首先看上期是否已经对平
2.1 如果上期总账和业务系统已经不平,那么就按照存货对账的一般流程去检查,参照帖子如下
2.1.1 存货对账异常排查方法:https://vip.kingdee.com/school/717
2.1.2 存货对账差异检查步骤:https://vip.kingdee.com/article/12014
3 如果上期已经对平,出现存货对账业务系统上期期末不等于本期期初的现象,则需检查业务数据是否有问题,以下是本文重点讲述的内容
3.1 首先对比对账界面取数与存货收发汇总表的取数是否一致(此处注意要保证筛选条件一致,特别注意存货对账方案中的过滤条件出现的两个参数【不统计核算组织内调拨单据】以及【不统计库存调整单据】的勾选与否也要保持一致)(如图1)
3.2 如果对账界面取数与存货收发汇总表的取数不一致
3.2.1 如果差异没有明显规律,有可能是存货的数据汇总和明细不等,因为对账的数据是取得费用项目的数据,此时则可以考虑走数据修复处理,参考脚本如附1
3.2.2 如果对账界面的业务系统取数恰好翻倍,而存货收发汇总表数据正常(如图2),问题规律为出现问题的核算组织下有多个下级组织,下级组织数恰为翻倍的倍数;属历史版本的程序问题,19年8月份补丁已做修复,打最新补丁即可
3.3 如果对账界面取数与存货收发汇总表的取数一致
3.3.1 如果本期总账与业务系统差异较大,常见于调拨单据跨期,而调拨单据不生成凭证,此时需要启用存货系统【启用分步式调出未调入】功能(见图3、4)才有可能对账平衡;
3.3.1.1 优先检查版本,如果是19年3月份补丁及以前的,建议先升级,然后再走流程3.3.1.2
3.3.1.2 如果是3月份补丁以后的,可以 重新启用【分步式调出未调入】功能(这里指的重新启用,注意两点:1 所有已启用过的组织都要重新启用 2 重新启用指的是反启用,再启用)
3.3.2 如果本期总账与业务系统差异较小,则需要考虑【异价调拨】的情形(系统中所有的调拨业务,包括直接调拨单、分布式调入调出单,都为平价调拨,即调入成本应等于调出成本),异价调拨常见于手工维护的成本不一致,此时则需要找出具体差异物料,分析该类业务的调入与调出成本的不一致情形:
3.3.2.1 可通过用EXCEL导出存货收发存汇总数据,VLOOKUP对比具体的物料差异;
3.3.2.2 找出具体物料后,再通过【核算单据查询】限定物料,用EXCEL导出并按 数量及金额 排序,分析调拨业务的调入与调出成本作对比
3.3.2.3 当查询出具体差异后,可通过反结账删除凭证重算或本期手工新增成本调整单调整处理
对于【启用分步式调出未调入】功能,如果启用仍对账不平,补充说明以下两点
附1:修复费用表为空的记录,备份后可直接执行
SELECT * INTO T_HS_INIVBALANCEEXP_BAK190922 FROM T_HS_INIVBALANCEEXP
SELECT * INTO T_HS_INIVBALANCEEXP_H_BAK190922 FROM T_HS_INIVBALANCEEXP_H
--1 修复EXP表为空的记录
DECLARE @detailid INT;
SELECT @detailid = ISNULL(MAX(FDETAILID), 0)
FROM V_HS_INIVBALANCEEXP
WHERE FDETAILID < 100000;
BEGIN
INSERT INTO T_HS_INIVBALANCEEXP
( FENTRYID
, FDETAILID
, FEXPENSESITEMID
, FEXPENSESAMOUNT
, FACCTGID
, FDIMENSIONID
, FENDINITKEY
)
SELECT a.FENTRYID
, @detailid + ROW_NUMBER() OVER ( ORDER BY a.FENTRYID ) FDETAILID
, 20045
, a.FAMOUNT
, a.FID
, a.FDIMENSIONID
, a.FENDINITKEY
FROM T_HS_INIVBALANCE a
LEFT JOIN T_HS_INIVBALANCEEXP b ON a.FENTRYID = b.FENTRYID
WHERE b.FENTRYID IS NULL;
END;
--2 修复EXP历史表为空的记录
DECLARE @detailid_h INT;
SELECT @detailid_h = ISNULL(MAX(FDETAILID), 0)
FROM V_HS_INIVBALANCEEXP
WHERE FDETAILID < 100000;
BEGIN
INSERT INTO T_HS_INIVBALANCEEXP_H
( FENTRYID
, FDETAILID
, FEXPENSESITEMID
, FEXPENSESAMOUNT
, FACCTGID
, FDIMENSIONID
, FENDINITKEY
)
SELECT a.FENTRYID
, @detailid_h + ROW_NUMBER() OVER ( ORDER BY a.FENTRYID ) FDETAILID
, 20045
, a.FAMOUNT
, a.FID
, a.FDIMENSIONID
, a.FENDINITKEY
FROM T_HS_INIVBALANCE_H a
LEFT JOIN T_HS_INIVBALANCEEXP_H b ON a.FENTRYID = b.FENTRYID
WHERE b.FENTRYID IS NULL;
END;
推荐阅读