资管云-SQL校准预收款台账之可转金额原创
1人赞赏了该文章
193次浏览
编辑于2024年07月03日 14:57:49
问题背景:资管云-收款管理-预收款台账中,偶尔会看到台账记录的余额金额,与勾选该记录点击列表上的转款按钮时,显示的可转金额不一致的情况。
分析原因:
1、首先检查配置【已开发票允许退款或转款】:配置位置在资管云-基础资料-参数配置-系统参数(左侧组织项目树需要匹配预收款台账对应的所属项目或所属组织),当该参数关闭时(默认关闭),则不允许来自“已开票”的预收款收款单的余额,用于转款,即在可转金额不会包含对应收款单处于已开票状态的余额。
2、排除第一个系统设计的原因,便有可能是预收款台账来源的收款单明细的转款金额,与实际转款金额不相等的问题。可转金额的计算公式为:可转金额 = 收款金额 - 转款金额 - 退款金额 + 冲抵金额。可以通过以下脚本进行定位,若能查询出数据,则说明存在问题,需要进一步执行后面的数据修复脚本:
SELECT b.fdetailid, b.ftransferamt, (0 - CASE WHEN SUM(c.famount) IS NULL THEN 0 ELSE SUM(c.famount) END) trasnferAmtExpected FROM t_cha_accountentry a JOIN t_cha_receiptdetail b ON a.freceiptdetailid = b.fdetailid LEFT JOIN t_cha_transferbill c ON c.faccountentryid = a.fentryid AND c.fiscancel <> '1' AND c.fbillstatus <> 'D' AND c.famount < 0 AND c.fmoneydefineoutid = a.fmoneydefine -- 精度的过滤数据,条件自己按需添加,以下注释部分仅为参考 -- WHERE a.fprojectid = '项目id' and a.froomid IN (select fid from t_psmd_room_l where fname = '房间名称') GROUP BY a.fentryid, b.fdetailid, b.ftransferamt) tmp WHERE tmp.ftransferamt <> tmp.trasnferAmtExpected
数据修复脚本(MySQL语法,若是PostgreSQL或天梯,请自行调整语法):
UPDATE t_cha_receiptdetail a1 JOIN (SELECT tmp.fdetailid, tmp.ftransferamt, tmp.trasnferAmtExpected FROM( SELECT b.fdetailid, b.ftransferamt, (0 - CASE WHEN SUM(c.famount) IS NULL THEN 0 ELSE SUM(c.famount) END) trasnferAmtExpected FROM t_cha_accountentry a JOIN t_cha_receiptdetail b ON a.freceiptdetailid = b.fdetailid LEFT JOIN t_cha_transferbill c ON c.faccountentryid = a.fentryid AND c.fiscancel <> '1' AND c.fbillstatus <> 'D' AND c.famount < 0 AND c.fmoneydefineoutid = a.fmoneydefine -- 精度的过滤数据,条件自己按需添加,以下注释部分仅为参考 -- WHERE a.fprojectid = '项目id' and a.froomid IN (select fid from t_psmd_room_l where fname = '房间名称') GROUP BY a.fentryid, b.fdetailid, b.ftransferamt) tmp WHERE tmp.ftransferamt <> tmp.trasnferAmtExpected) sub ON a1.fdetailid = sub.fdetailid SET a1.ftransferamt = sub.trasnferAmtExpected WHERE a1.ftransferamt <> sub.ftransferamt;
推荐阅读