本文讨论了企业在使用批号管理业务时遇到的问题及解决方案。启用批号管理后,因操作复杂导致数据录入不及时、实物与系统批号不符等问题,增加仓库与财务工作量。为改善现状,决定去除批号管理,并通过SQL脚本清除与批号相关的所有数据,涵盖物料属性、出入库单据等多个环节。此方案减少工作量,提升数据及时性和工作效率,适用于广泛场景及误操作情况,但需注意操作需谨慎并备份数据。
1 业务背景
1.1业务场景
本案例基于启用批号业务场景而撰写,产品为旗舰版V7.0,在企业的实际业务中,有启用批号管理业务场景,但是在使用过程中,批号并没有给公司带来很大便捷性,反而给后续的仓库造成很大的工作量,比如启用批号,下推领料的时候,有时候由于未能及时入库,或者由于入库单未能及时审批,出库的批号是未知之数,因此不能选择或者随便填写,出库单也就无从选择批号。此种情况是最为常见并且仓库工作量投入大量精力,往往数据不能及时有效录入系统。
1.2客户痛点分析
帐套中去掉批号管理
本来物料启用批号的主要目的就是想要追溯来源,并且为后续订单质量进行追踪,方便分批进行成本计算。但是在实际的操作过程中,仓库的工作也做了,不但没有起到强大的管理作用,反而经常出现实物批号跟系统库存批号不符的情况,更有甚者,库存中某个批号为正数,某个批号为负数,数量刚好相反,如果物料的计价方法为分批认定法的话,给财务的工作也造成了很大的困扰,往往获取不到负结存料号的单价,存货核算也就结账不成功。给财务造成很大的工作量,往往在期末结账的时候,都在大量查找各种产品,的各种成本,严重延误出报表的时间
1.3客户诉求与期望
客户最大的期望是仓库数据及时稳定,同时财务可以正常快速结账。考虑再三,还是决定去掉物料中的批号管理,这样仓库的工作量也会小一些,财务结账也会更顺畅一些
2 解决方案
2.1整体思路
根据客户实际的业务场景,在加上金蝶系统本身的功能,不在数据库中进行处理,系统中是根本不具有解决方案的,因此考虑到直接在数据库中清掉跟批号有关的所有数据,具体方案如下:
需要考虑的点
(1)物料属性修改:去掉所有物料的批号控制设置;
(2)出入库单据修改:清除所有出入库单据的批号;
(3)生产投料资料批号清除;
(4)生产投料变更单批号清除;
(5)生产任务单批号清除;
(6)生产任务变更单批号清除;
(7)生产物料报废/补料单批号清除;
(8)采购销售发票批号清除;
(9)初始化库存单据批号清除;
(10)库存余额数据批号清除和数据处理;
(11)即时库存重算:前端系统重算【校对及时库存】。
3 关键步骤及效果展示
步骤1:物料属性修改:去掉所有物料的批号控制设置;
update t_icitem set FBatchManager = 0 where FBatchManager = 1
如果只是某一个或者部分料号误操作,启用了批号,则直接在最后增加where语句即可
步骤2:出入库单据修改:清除所有出入库单据的批号;
update ICStockbillEntry set FBatchNo = '' where isnull(FBatchNo,'') <> ''
如果只是某一个或者部分料号误操作,启用了批号,在入库的时候提示需要输入序列号,还未入库的情况下,则不需要处理此步骤
步骤3:生产投料资料批号清除
update PPBOMEntry set FBatchNo = '' where isnull(FBatchNo,'') <> ''
步骤4:生产投料变更单批号清除
update PPBomChangeEntry set FBatchNo = '' where isnull(FBatchNo,'') <> ''
步骤5:生产任务单批号清除;
update ICMO set FGMPBatchNo = '' where isnull(FGMPBatchNo,'') <> ''
步骤6:生产任务变更单批号清除;
update ICMOChangeEntry set FBatchNo = '' where isnull(FBatchNo,'') <> ''
步骤7:生产物料报废/补料单批号清除;
update ICItemScrapEntry set FBatchNo = '' where isnull(FBatchNo,'') <> ''
步骤8:采购销售发票批号清除;
update ICPurchaseEntry set FBatchNo = '' where isnull(FBatchNo,'') <> ''
update ICSaleEntry set FBatchNo = '' where isnull(FBatchNo,'') <> ''
步骤9:初始化库存单据批号清除;
第一步删掉期初数据并且备份数据,参考如下:
select a.* into ICInvBal_bak01 from ICInvBal a,(
select FYear,FPeriod,FStockID,FItemID
from ICInvBal
group by FYear,FPeriod,FStockID,FItemID
having count(1) > 1 ) b
where a.FYear = b.FYear and a.FPeriod = b.FPeriod and a.FStockID = b.FStockID and a.FItemID = b.FItemID
delete a
from ICInvBal a,ICInvBal_bak01 b
where a.FYear = b.FYear and a.FPeriod = b.FPeriod and a.FStockID = b.FStockID and a.FItemID = b.FItemID
insert into ICInvBal(FBrNo,FYear,FPeriod,FStockID,FItemID,FBatchNo,FBegQty,FReceive,FSend,FYtdReceive,FYtdSend,FEndQty,FBegBal,FDebit,FCredit,
FYtdDebit,FYtdCredit,FEndBal,FBegDiff,FReceiveDiff,FSendDiff,FEndDiff,FBillInterID,FStockPlaceID,FKFPeriod,FKFDate,
FYtdReceiveDiff,FYtdSendDiff,FSecBegQty,FSecReceive,FSecSend,FSecYtdReceive,FSecYtdSend,FSecEndQty,FAuxPropID,FStockInDate,
FMTONo)
select
'0',FYear,FPeriod,FStockID,FItemID,'',sum(FBegQty),sum(FReceive),sum(FSend),sum(FYtdReceive),sum(FYtdSend),sum(FEndQty),sum(FBegBal),sum(FDebit),sum(FCredit),
sum(FYtdDebit),sum(FYtdCredit),sum(FEndBal),0,0,0,0,0,0,0,'',
0,0,0,0,0,0,0,0,0,'',''
from ICInvBal_bak01
group by FYear,FPeriod,FStockID,FItemID
第二部更新数据:
update ICInvBal set FBatchNo = '' where isnull(FBatchNo,'') <> ''
步骤10:库存余额数据批号清除和数据处理;
第一步删掉期初数据并且备份数据,参考如下:
select a.* into icbal_bak01 from icbal a,(
select FYear,FPeriod,FItemID,FBillInterID,FStockGroupID
from icbal
group by FYear,FPeriod,FItemID,FBillInterID,FStockGroupID
having count(1) > 1 ) b
where a.FYear = b.FYear and a.FPeriod = b.FPeriod and a.FItemID = b.FItemID and a.FBillInterID = b.FBillInterID and a.FStockGroupID = b.FStockGroupID
delete a
from icbal a,icbal_bak01 b
where a.FYear = b.FYear and a.FPeriod = b.FPeriod and a.FItemID = b.FItemID and a.FBillInterID = b.FBillInterID and a.FStockGroupID = b.FStockGroupID
insert into icbal(FBrNo,FYear,FPeriod,FItemID,FBatchNo,FBegQty,FReceive,FSend,FYtdReceive,FYtdSend,FEndQty,FBegBal,FDebit,FCredit,FYtdDebit,
FYtdCredit,FEndBal ,FBegDiff,FReceiveDiff,FSendDiff,FEndDiff,FBillInterID,FEntryID,FStockGroupID,FYtdReceiveDiff,FYtdSendDiff,
FSecBegQty,FSecReceive,FSecSend,FSecYtdReceive,FSecYtdSend,FSecEndQty,FStockInDate,FAuxPropID )
select
'0',FYear,FPeriod,FItemID,'',sum(FBegQty),sum(FReceive),sum(FSend),0,0,sum(FEndQty),sum(FBegBal),sum(FDebit),sum(FCredit),0,
0,sum(FEndBal) ,0,0,0,0,FBillInterID,0,FStockGroupID,0,0,
0,0,0,0,0,0,'',0
from icbal_bak01
group by FYear,FPeriod,FItemID,FBillInterID,FStockGroupID
第二部更新语句:
update icbal set FBatchNo = '' where isnull(FBatchNo,'') <> ''
步骤11:即时库存重算:前端系统重算【校对及时库存】
select FBatchNo,* from ICInventory where isnull(FBatchNo,'') <> ''
--前端系统重算【校对及时库存】
4 方案的可推广价值
1、可适用范围广泛
对于启用批号管理的客户,由于前期调研信誓旦旦的启用批号,一旦实施起来,发现并不能严格按照系统进行操作执行,比如仓库出库批号为20221202001,但是到仓库怎么都找不到这个批号的产品,随便出库一批其他批号(20221202002)的产品,上述这种情况就是不按照系统执行,严格意义上来说,就是单跟货物不符。后续想要在取消批号的可以参考如上实践方法。
2、工程人员建立料号误操作
对于一部分小微企业来说,建立料号可能不是专人负责,即使是专人负责,由于误操作,也有可能不小心勾选了启用批号管理,等到发现问题的时候,往往已经无法在进行处理,因此最简便的方法就是通过数据库脚本进行数据修复,此时发现问题的时候,往往没有进行入库操作,因此处理起来也相对来说简单,此时只需要处理前面第一步骤即可
3、保证数据的及时性,减少了仓库以及财务出错概率,提升了工作效率
物料没有启用批号的情况下,作为仓库人员来说,入库,出库变得容易操作,不需要录入批号,也不需要考虑批号,也不需要每批次进行查找,财务也变得顺畅,没有结账负结存的情况出现,大大提升了工作效率
5 注意事项
涉及到SQL脚本操作,没有撤销功能,因此需要慎重,一定要备份出来帐套,在测试环境下进行处理,然后执行完脚本后,要经过严格的测试,确保没有出现问题后在进行正式帐套的执行。
6 相关资料
【批号实践案例】介绍
批号实践案例.doc(80.50KB)