偶尔会在账套中发现,科目(t_bd_account)的父级内码(fparentid)与实际情况不符,这个时候需要重新获取到正确的父级内码并加以更新。当需要批量修改的时候,出于安全性考虑,要求修改科目父级内码的SQL的逻辑与实际科目的内码判断的逻辑是等价的。另外,科目是否使用管控的情况也要区分开来。
在没有使用科目管控的情况下,我们通过下面的逻辑去确定科目A的内码:
1、科目A匹配父级的范围为科目A所在的科目表
2、科目A的父级编码,满足【科目A编码.】的格式
3、科目A的层级=科目A的父级层级+1
以上可以准确找到科目A的父级,因此批量修改的脚步如下:
查询:
select a.FPARENTID, b.FACCTID,a.facctid,a.fnumber,b.fnumber, a.FACCTTBLID
from T_BD_ACCOUNT a join T_BD_ACCOUNT b on a.FACCTTBLID=b.FACCTTBLID and SUBSTRING(a.FNUMBER,1,LEN(b.fnumber))=b.FNUMBER
and SUBSTRING(a.FNUMBER,LEN(b.fnumber)+1,1)='.' and a.FLEVEL=b.FLEVEL+1
join T_BD_ACCOUNTTABLE c on a.FACCTTBLID=c.FACCTTABLEID and c.FISENABLEDIST=0
where a.FPARENTID<>b.FACCTID
修改:
update a set a.FPARENTID=b.FACCTID
from T_BD_ACCOUNT a join T_BD_ACCOUNT b on a.FACCTTBLID=b.FACCTTBLID and SUBSTRING(a.FNUMBER,1,LEN(b.fnumber))=b.FNUMBER
and SUBSTRING(a.FNUMBER,LEN(b.fnumber)+1,1)='.' and a.FLEVEL=b.FLEVEL+1
join T_BD_ACCOUNTTABLE c on a.FACCTTBLID=c.FACCTTABLEID and c.FISENABLEDIST=0
where a.FPARENTID<>b.FACCTID
科目启用管控的情况下,同一个科目表会出现编码重复,科目根据使用组织隔离,因此,匹配科目A的父级需要添加——科目A的使用组织和父级的使用组织相同的条件。因此批量修改的脚本如下:
查询:
select a.FPARENTID, b.FACCTID,a.facctid,a.fnumber,b.fnumber, a.FACCTTBLID
from T_BD_ACCOUNT a join T_BD_ACCOUNT b on a.FACCTTBLID=b.FACCTTBLID and SUBSTRING(a.FNUMBER,1,LEN(b.fnumber))=b.FNUMBER
and SUBSTRING(a.FNUMBER,LEN(b.fnumber)+1,1)='.' and a.FLEVEL=b.FLEVEL+1 and a.FUSEORGID=b.FUSEORGID
join T_BD_ACCOUNTTABLE c on a.FACCTTBLID=c.FACCTTABLEID and c.FISENABLEDIST=1
where a.FPARENTID<>b.FACCTID
修改:
update a set a.FPARENTID=b.FACCTID
from T_BD_ACCOUNT a join T_BD_ACCOUNT b on a.FACCTTBLID=b.FACCTTBLID and SUBSTRING(a.FNUMBER,1,LEN(b.fnumber))=b.FNUMBER
and SUBSTRING(a.FNUMBER,LEN(b.fnumber)+1,1)='.' and a.FLEVEL=b.FLEVEL+1 and a.FUSEORGID=b.FUSEORGID
join T_BD_ACCOUNTTABLE c on a.FACCTTBLID=c.FACCTTABLEID and c.FISENABLEDIST=1
where a.FPARENTID<>b.FACCTID
后台修改数据有一定的风险性,请务必测试测试。
推荐阅读