本文介绍了系统中存在的一种问题:当下游单据被删除后,在上游单据列表中仍能看到已删除的下游单据类型但无法打开,报错提示单据不存在。文章分析了问题产生的原因,是由于数据库后台残留数据导致。提供了详细的解决方案,包括查询、备份、删除残留数据的SQL代码示例,以及更新上游单据相关字段的步骤。同时,给出了通用版本的SQL语句模板,用于处理类似问题,并提醒替换模板中的特定字段名和值。最后,提出了数据恢复的建议,以防操作错误导致数据丢失。
注:文章只针对下游单据已删除,但是上游单据下查还能看到下游单据类型但打不开,以下操作只能将下游单据删除,不能修改反写的上游单据相关字段,最直接解决问题方法将上游单据也删除重新做。
经过总结和测试,发现系统中存在关联单据中下游单据被删除,在上游单据列表或打开上游单据后下查时,还是可以看到存在下游单据,但是打开报错说“单据不存在,可能已经被清理!”。
1、问题重现
例如,其他应付单下推进项费用增值税发票,进项费用增值税发票删除后,在其他应付单列表或打开其他应付单关联查询下查还是可以看到有一张费用进项增值税发票。
但是点击进项费用增值税发票时,报错“单据不存在,可能已经被清理!”。
2、问题来源及解决方案
这种情况产生的原因是数据库后台中有几张表存在残留数据导致,可通过以下代码删除残留数据。
首先可以在BOS里面查找需要的表名,如下以查找其他应付单明细表名为例。
在BOS中找到对应的单据双击打开,点击编辑下的批量编辑字段属性。
点击表单属性找到单据体,可以看到右边有对应的表名。
解决案例问题代码如下:
(1)查询、备份、删除全流程表体有问题记录
--从此句开始执行为查询全流程表体、费用发票表体主键、其他应付单编号
SELECT TBIE.*, TIPE.FENTRYID, TA.FBILLNO
--从此句开始执行为备份删除的东西
--SELECT TBIE.* INTO T_BF_INSTANCEENTRYBAK
--从此句开始执行为删除全流程表体有问题记录
--DELETE TBIE
FROM T_BF_INSTANCEENTRY TBIE
--通过其他应付单表体FENTRYID与全流程表体的FSID一致联查两表
INNER JOIN (
--将其他应付单表头、表体联查为TA表后取表头编号,表体主键
SELECT TAO.FBILLNO, TAOE.FENTRYID
FROM T_AP_OTHERPAYABLE TAO
--通过其他应付单表头、明细FID一致联查两表
INNER JOIN T_AP_OTHERPAYABLEENTRY TAOE ON TAO.FID = TAOE.FID
) TA
ON TA.FENTRYID = TBIE.FSID
--通过费用发票表体FENTRYID与全流程表体FTID一致联查两表
LEFT JOIN T_IV_PUREXPINVENTRY TIPE ON TIPE.FENTRYID = TBIE.FTID
--其他应付单单据编号
WHERE TA.FBILLNO = 'QTYFD00001207'
--全流程表体的FSTABLENAME指源单表体表名
AND TBIE.FSTABLENAME = 'T_AP_OTHERPAYABLEENTRY'
--全流程表体的FTTABLENAME指目标单表体表名
AND TBIE.FTTABLENAME = 'T_IV_PUREXPINVENTRY'
--费用发票表体主键为空
AND TIPE.FENTRYID IS NULL
(2)更新其他应付单表体相关反写字段。
--''内写其他应付单明细内码
UPDATE T_AP_OTHERPAYABLEENTRY SET FIVAMOUNTFOR=0 WHERE FENTRYID='102501'
(3)如果执行错误,没有解决问题,将数据还原回去
INSERT INTO T_BF_INSTANCEENTRY SELECT * FROM T_BF_INSTANCEENTRYBAK
3、通用版本
(1)查询、备份、删除全流程表体有问题记录
--从此句开始执行为查询全流程表体、目标单据表体主键、源单编号
SELECT TBIE.*, TD.FENTRYID, TC.FBILLNO
--从此句开始执行为备份删除的东西,切勿忘记操作!!!
--SELECT TBIE.* INTO T_BF_INSTANCEENTRYBAK
--从此句开始执行为删除全流程表体有问题记录
--DELETE TBIE
FROM T_BF_INSTANCEENTRY TBIE
--通过源单表体FENTRYID与全流程表体的FSID一致联查两表
INNER JOIN (
--将源单表头、表体联查为TC表后取表头编号,表体主键
SELECT TA.FBILLNO, TB.FENTRYID
-- TABLEA指源单表头表名
FROM TABLEA TA
-- TABLEB指源单表体表名,通过源单表头、明细FID一致联查两表
INNER JOIN TABLEB TB ON TA.FID = TB.FID
) TC
ON TC.FENTRYID = TBIE.FSID
-- TABLED指目标单表体表名,通过表体FENTRYID与全流程表体FTID一致联查两表
LEFT JOIN TABLED TD ON TD.FENTRYID = TBIE.FTID
--''内为源单单据编号
WHERE TC.FBILLNO = ''
--''内为源单明细表名
AND TBIE.FSTABLENAME = ''
--''内为目标单表体表名
AND TBIE.FTTABLENAME = ''
--''下游单据明细记录为空
AND TD.FENTRYID IS NULL
对语句说明,红色部分为需替换的内容,其中TABLEA,TABLEB,TABLED以及三个''都要依次替换为源单表头表名,源单表体表名,目标单表体表名, 源单单据编号, 源单表体表名以及目标单表体表名。
如果要删除同一上下游单据类型此类报错,比如删除其他应付单下推进项费用增值税发票,进项费用增值税发票已被清理的问题,注释掉TA.FBILLNO = ''和其后的AND。
(2)更新源单有问题的字段
--三个''分别指需修改的字段,修改的值,源单表体内码
UPDATE TB SET ''='' WHERE FENTRYID=''
(3)如果执行错误,没有解决问题,将数据还原回去
INSERT INTO T_BF_INSTANCEENTRY SELECT * FROM T_BF_INSTANCEENTRYBAK
推荐阅读