资管云-SQL校准预收款台账之可转金额原创
金蝶云社区-最晴天
最晴天
1人赞赏了该文章 193次浏览 未经作者许可,禁止转载编辑于2024年07月03日 14:57:49

问题背景:资管云-收款管理-预收款台账中,偶尔会看到台账记录的余额金额,与勾选该记录点击列表上的转款按钮时,显示的可转金额不一致的情况。

image.png


分析原因:

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;


赞 1