问题描述:
1、在业务草稿里面打开单据过账提示:本张草稿已经过账,请确认后重试!
2、在业务草稿里面勾选多张单据点击批量过账提示:所选单据不能包含已过账单据,请刷新后重新选择!
排查步骤:
1、确认是否是通过对接第三方软件上传到ERP软件生成的单据。
2、确认客户的业务流程,是否是同时多个人在同一个时间点同时操作同一张单据,比如一个人过账,另外一个人修改单据,过账的人先提交,修改的人后提交,导致单据被写回了草稿状态,并且单据明细也被覆盖了,时间差可能只有0.0几秒的样子,就容易导致该现象,如果要避免,需要客户优化操作流程,尽量避免多人并发操作的流程。
3、优化服务器和客户端电脑的配置,性能越高出现并非的几率越小,比如提供资源比较充足的内存、CPU,优化网络的上行和下行速度等。
4、可以在SQL数据库里面执行下面语句,查询并发导致单据过账又被写回草稿的单据日志。
select o.id,o.billnumberid,o.OperateType,e.usercode 操作员编号,e.fullname 操作员名称,o.operatetime 操作时间,o.IP,o.billcode,o.billdate,case when ifcheck ='f' then '草稿' when ifcheck='t' then '过账' end 单据状态 ,b.usercode 往来单位编号,b.fullname 往来单位名称,o.ntotalmoney 单据金额,bn.billname from BillOperateLog o left join employee e on e.typeid=o.etypeid left join btype b on b.typeid=o.btypeid left join billname bn on bn.billtype=o.billtype
where o.billnumberid in(
select billnumberid from billindex b where ( b.ifcheck='f' or b.draft = 1)
and ( exists (select 1 from inoutstocktable i where i.billnumberid=b.billnumberid and i.billtype=b.billtype)
or exists(select 1 from listtable l where l.billnumberid=b.billnumberid and l.billtype=b.billtype)))
order by o.billnumberid,o.id
处理方法:备份数据后,执行下面脚本:
DECLARE @BillCode TABLE
( BillCode VARCHAR (300) )
UPDATE bi SET bi.draft = 0 , bi.ifcheck = 't'
OUTPUT INSERTED.BillCode INTO @BillCode
FROM BillIndex bi
WHERE
(
(
EXISTS (SELECT 1 FROM Listtable l WHERE l.BillNumberId = bi.BillNumberId )
AND EXISTS (SELECT 1 FROM InOutstocktable io1 WHERE bi.BillNumberId = io1.BillNumberId )
)
OR
( (
EXISTS (SELECT 1 FROM Listtable l WHERE l.BillNumberId = bi.BillNumberId )
OR EXISTS (SELECT 1 FROM InOutstocktable io1 WHERE bi.BillNumberId = io1.BillNumberId )
)
)
)
AND ( bi.ifcheck = 'f' OR bi.draft = 1 )
AND bi.IsIni = 0 AND bi.ifYearBill = 0
SELECT * FROM @BillCode
注意:执行完以上脚本后,该单据在经营历程了,请客户核对一下库存和往来即可。