Wise BOS审批流异常单据数据修复方法
背景:有些客户的审批流设计的非常复杂,元素非常多,可能会出现加载审批流之后再保存时(目前未能找到原因),部分节点的数据丢失,混乱。导致了状态为审批中的单据无法审核也无法反审核。又不能重新调整审批流。导致业务操作中断。
因此使用下面这个方法来清除正在审核中的单据的审批记录,让他们恢复到制单人刚保存的状态。
--审批流编辑再加载过程中发生了异常导致界面上的节点加载不完全,再保存时出现了数据丢失的情况,需要重新编辑审批流;如果存在审核中的单据审批流无法反启用,
--用下面的脚本来清除所有正在审核中的单据的审核过程,将它们返回到未提交状态(刚保存状态)
--以费用报销单为例
--执行前先通过这个脚本查看一下是否你需要改动的单据Select * from icclasstype where FName_CHS = '费用报销单'
--下面是正文
set nocount on
declare @name as nvarchar(50)
set @name = '费用报销单'
declare @classtypeid as int
declare @TableName as nvarchar(50)
declare @sql as nvarchar(4000)
Select @classtypeid = FID,@TableName = FTableName from icclasstype where FName_CHS = '费用报销单'
if isnull(@classtypeid,0) <> 0
begin
Create Table #T1(FID int)
set @sql = N'insert into #T1(FID) select FID from ' + Quotename(@TableName) +N' Where FMultiCheckStatus = 4'
exec(@sql)
set @sql = N'delete ' + Quotename('ICClassMCRecord'+Convert(nvarchar(10),@classtypeid)) + ' Where FBillID in(select FID from #T1)'
--print @sql
exec(@sql)
set @sql = N'delete ' +Quotename('ICClassMCStatus'+Convert(nvarchar(10),@classtypeid))+' Where FBillID in(select FID from #T1)'
--print @sql
exec(@sql)
set @sql = N'Delete ICClassMCTemplateMap where FClassTypeID = '+ Convert(nvarchar(10),@classtypeid) +' and FBillID in(select FID from #T1)'
--print @sql
exec(@sql)
set @sql = N'Update ' + Quotename(@TableName) +N' Set FMultiCheckStatus = 2 Where FMultiCheckStatus = 4'
--print @sql
exec(@sql)
Drop Table #T1
end
Go
执行完上述脚本后,再去调整审批流配置;重新启动审批流再让制单人重新提交审批那些单据。
另外可以增加下面的触发器来避免类似事情发生(无法找到此bug产生的原因,暂时先用此触发器做保存检查避免出现数据丢失的情况)
还是以费用报销单为例
执行脚本Select FID from icclasstype where FName_CHS = '费用报销单',获取到单据的类别ID:1000050
执行脚本select FID,* from ICClassMCTemplate where FClassTypeID = 1000050查找到你正在使用的审批流的模板ID
不同改的账套审批流模板ID各不相同,并且有些账套可能有多个,可以根据FName_Chs来确定现在用的是哪个?
if exists(select * from sysobjects where name ='tr_WatchMC_7' and xtype='tr')
begin
drop Trigger tr_WatchMC_7
end
go
Create Trigger tr_WatchMC_7 on ICClassMCTableInfo
for update,insert
as
begin
declare @name as nvarchar(50)
select @name = FName_CHS from ICClassMCTableInfo
where FTemplateID = 7 and FTagIndex in( select FTagIndex from inserted Where FTemplateID = 7)
and (datalength(FCheckRight)=0 or datalength(FCheckRight) is null or datalength(FUnCheckRight)=0 or datalength(FUnCheckRight) is null)
and FObjectType = 304
if isnull(@name,'') <> ''
begin
set @name = @name + '节点审核人、反审核人不能设置为空'
RAISERROR(@name,18,18)
return
end
end
Go
把这段脚本中数字7(已经用红字标识出来)替换成上一段脚本刚查出来的FID.然后执行创建这个检查触发器;
这样可以保证再审批流编辑过程中发生异常导致数据丢失时(数据异常大概率导致节点审核人反审核人数据丢失)能够限制保存成功。
提示保存失败后,用户应重新打开界面编辑(数据丢失这种情况大概率是审批流UI再读取后台存储的二进制数据异常引起的)
Wise BOS审批流异常单据数据修复方法
本文2024-09-16 16:25:25发表“k3wise知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3wise-9135.html