错误分析
此错误说明:历史流程实例节点的FTTableId在定义表t_bf_tabledefine中的 FSeq列找不到;
直接原因是:当前流程实例节点在归档时需要把表名转换为定义表中的FSeq列对应的序号值,如果没有转换成功,归档的数据就会有问题。
根本原因是:当前流程实例节点的产生有问题,可能是手工增加的时不符合规范(没有取定义表中的表名),可能是迁移的,没有迁移(定义表中的数据)等。
相关表
定义表:t_bf_tabledefine
历史流程实例节点表:t_bf_instanceEntryHis
关联表:单据关联配置中的关联表名
如何修复
以应付单为示例
1. 首先根据报错单据formId,查询定义表中相关的表信息,主要取到表名和序号
select * from t_bf_tableDefine where FFormId ='AP_PAYABLE'
2. 再根据报错单据信息,把历史流程实例节点数据全部查询出来,大概脚本如下:
select * from t_bf_instanceEntryHis
where FInstanceid in(select FInstanceid from t_bf_instanceEntryHis
where FTTableId=' 定义表中的序号' and FTId in(select t0.FEntryId from T_AP_PAYABLEENTRY t0
inner join T_AP_PAYABLE t1 on t0.FId= t1.FId
where t1.FBillNo='单据编码'))
3. 再根据2中得到的流程实例内码,查询有问题的节点,如下脚本
select * from t_bf_instanceEntryHis where FFirstNode=1 and FTTableId=0
select * from t_bf_instanceEntryHis where FFirstNode=0 and (FTTableId=0 or FSTableId=0)
4. 找到问题节点后,根据上下节点和LK表(单据的关联表),确定它的来源单据或目标单据,
到定义表中找到对应的FSeq序号值
5. 最后把FTTableId和FSTableId为0的值改成序号值,相关脚本如下:
update tt set FTTableId='序号值'
from (select * from t_bf_instanceEntryHis where FRouteId in('FRouteId 1','FRouteId 2',...) tt
或
update tt set FSTableId='序号值'
from (select * from t_bf_instanceEntryHis where FRouteId in('FRouteId 1','FRouteId 2',...) tt
推荐阅读