应付单补付款计划SQL参考原创
金蝶云社区-jessie_w
jessie_w
92人赞赏了该文章 462次浏览 未经作者许可,禁止转载编辑于2024年12月11日 14:13:18
summary-icon摘要由AI智能服务提供

本文描述了处理历史单据付款计划分录为空或付款条件修改后重新生成付款计划的场景、注意事项及修复方案。修复方案涉及SQL语句操作,包括备份原付款计划表、删除旧付款计划、查询并插入新付款计划分录等步骤,并强调了在操作前需备份全表数据。

业务场景:

历史单据引入时付款计划分录为空,无法正常参与核销,需要补款计划分录;

或者是单据修改过款条件,比如从按到期日款修改为按物料明细款的款条件,希望重新生成款计划。

(不过不太建议历史单据修改款条件,如果和订单不一致,会影响预自动核销)


注意事项:

适用于单到期日的情况,如果款条件设置了多到期日不适用!!!

已下推付款单或已款核销过的单据绝对不允许修改款计划分录也不允许修改款条件!!!

否则导致数据问题总部不予处理!!!


修复方案:

通过明细按对应的款条件生成计划分录并插入到款计划表(原来有款计划分录的情况下需要先删除涉及单据的款计划分录行重新插入)

(新款计划的到期日和单据头到期日保持一致)


如下SQL语句仅供参考!!!更新前建议做全表备份!!!

--1.备份语句参考
SELECT * INTO T_AP_PAYABLEPLAN_SQLBAK_20241012 FROM T_AP_PAYABLEPLAN

--(1.2) 修改过付款条件的单据需要先将原来的付款计划删除然后再插入新的付款计划
DELETE T_AP_PAYABLEPLAN
WHERE FID IN (SELECT FID FROM T_AP_PAYABLE WHERE FBILLNO IN ('单据编号1','单据编号2'))

--2. 查询价税合计不为0,且无计划分录的应付单并插入临时表
--字段说明:FBILLNO单据编号,FPAYCONDITON付款条件,FPAYMENTMETHOD付款方式
SELECT DISTINCT A.FBILLNO,A.FID,A.FPAYCONDITON,B.FPAYMENTMETHOD INTO #TEMPALL
FROM T_AP_PAYABLE A
LEFT JOIN T_BD_PAYMENTCONDITION B ON A.FPAYCONDITON=B.FID
WHERE FALLAMOUNTFOR<>0 AND NOT EXISTS (SELECT 1 FROM T_AP_PAYABLEPLAN WHERE FID=A.FID)

--3. 查询并记录下当前计划分录表最大的分录内码
SELECT MAX(FENTRYID) FROM T_AP_PAYABLEPLAN  --比如为100001

--4. 查询并记录下当前分录种子表的值
SELECT IDENT_CURRENT('Z_AP_PAYABLEPLAN')  --比如为100001,一般情况下大于等于第3步的最大分录内码

--5. 插入记录前重置种子表  重要!!!!!!
--此步目的是不影响后续单据正常保存。
--新单据的分录内码都是从种子表取数,如果不重置种子表后续可能出现主键冲突,前台就无法正常保存单据。
--重置的值=第4步种子表当前值+需要插入记录的行数+1
DBCC CHECKIDENT(Z_AP_PAYABLEPLAN,RESEED,100030)  --将种子表重置为100030

--6. 补付款计划分录  如下语句中SELECT 后面有一个100001 记得需要按实际情况修改为和第4步种子表的当前值一致  重要!!!!!!
--如下是按标准产品字段插入,如存在二开字段携带到计划请按需修改语句
--6.1 付款条件的付款方式为按物料明细付款
INSERT INTO T_AP_PAYABLEPLAN 
(FENTRYID,FID,FSEQ,FENDDATE,FPAYRATE,FPAYAMOUNTFOR,FPAYAMOUNT,FWRITTENOFFSTATUS,FWRITTENOFFAMOUNTFOR,FWRITTENOFFAMOUNT,FNOTWRITTENOFFAMOUNTFOR,FNOTWRITTENOFFAMOUNT,FRELATEHADPAYAMOUNT,FAPPLYAMOUNT,FPURCHASEORDERNO,FPAYABLEENTRYID,FMATERIALID,FMATERIALSEQ,FPURCHASEORDERID,FNOTVERIFICATEAMOUNT,FPRICE,FQTY,FPRICEUNITID,FCOSTID_P,FREMARK)
SELECT 
100001+ROW_NUMBER() OVER(ORDER BY A.FID) FENTRYID,C.FID,ROW_NUMBER() OVER(PARTITION BY A.FID ORDER BY A.FID) FSEQ,C.FENDDATE,100 FPAYRATE,
B.FALLAMOUNTFOR FPAYAMOUNTFOR, B.FALLAMOUNT FPAYAMOUNT,'A' FWRITTENOFFSTATUS,0 FWRITTENOFFAMOUNTFOR,0 FWRITTENOFFAMOUNT,
B.FALLAMOUNTFOR FNOTWRITTENOFFAMOUNTFOR,B.FALLAMOUNT FNOTWRITTENOFFAMOUNT,0 FRELATEHADPAYAMOUNT,0 FAPPLYAMOUNT,B.FORDERNUMBER FPURCHASEORDERNO,
FORDERENTRYID FPAYABLEENTRYID,B.FMATERIALID FMATERIALID,0 FMATERIALSEQ,0 FPURCHASEORDERID,
B.FALLAMOUNTFOR FNOTVERIFICATEAMOUNT,0 FPRICE,B.FPRICEQTY FQTY,0 FPRICEUNITID,0 FCOSTID_P,'' FREMARK
FROM #TEMPALL A
LEFT JOIN (
	SELECT FID,FORDERNUMBER,FORDERENTRYID,FMATERIALID,SUM(FALLAMOUNTFOR) FALLAMOUNTFOR,SUM(FALLAMOUNT)  FALLAMOUNT ,SUM(FPRICEQTY)  FPRICEQTY
	FROM T_AP_PAYABLEENTRY 
	GROUP BY FORDERNUMBER,FORDERENTRYID,FMATERIALID,FID
) B ON A.FID=B.FID
LEFT JOIN T_AP_PAYABLE C ON B.FID=C.FID
WHERE A.FPAYMENTMETHOD=3

--6.2 付款条件的付款方式为按订单付款
INSERT INTO T_AP_PAYABLEPLAN 
(FENTRYID,FID,FSEQ,FENDDATE,FPAYRATE,FPAYAMOUNTFOR,FPAYAMOUNT,FWRITTENOFFSTATUS,FWRITTENOFFAMOUNTFOR,FWRITTENOFFAMOUNT,FNOTWRITTENOFFAMOUNTFOR,FNOTWRITTENOFFAMOUNT,FRELATEHADPAYAMOUNT,FAPPLYAMOUNT,FPURCHASEORDERNO,FPAYABLEENTRYID,FMATERIALID,FMATERIALSEQ,FPURCHASEORDERID,FNOTVERIFICATEAMOUNT,FPRICE,FQTY,FPRICEUNITID,FCOSTID_P,FREMARK)
SELECT 
100001+ROW_NUMBER() OVER(ORDER BY A.FID) FENTRYID,C.FID,ROW_NUMBER() OVER(PARTITION BY A.FID ORDER BY A.FID) FSEQ,C.FENDDATE,100 FPAYRATE,
B.FALLAMOUNTFOR FPAYAMOUNTFOR, B.FALLAMOUNT FPAYAMOUNT,'A' FWRITTENOFFSTATUS,0 FWRITTENOFFAMOUNTFOR,0 FWRITTENOFFAMOUNT,
B.FALLAMOUNTFOR FNOTWRITTENOFFAMOUNTFOR,B.FALLAMOUNT FNOTWRITTENOFFAMOUNT,0 FRELATEHADPAYAMOUNT,0 FAPPLYAMOUNT,B.FORDERNUMBER FPURCHASEORDERNO,
0 FPAYABLEENTRYID,0 FMATERIALID,0 FMATERIALSEQ,0 FPURCHASEORDERID,
B.FALLAMOUNTFOR FNOTVERIFICATEAMOUNT,0 FPRICE,0 FQTY,0 FPRICEUNITID,0 FCOSTID_P,'' FREMARK
FROM #TEMPALL A
LEFT JOIN (
	SELECT FID,FORDERNUMBER,SUM(FALLAMOUNTFOR) FALLAMOUNTFOR,SUM(FALLAMOUNT)  FALLAMOUNT 
	FROM T_AP_PAYABLEENTRY 
	GROUP BY FORDERNUMBER,FID
) B ON A.FID=B.FID
--LEFT JOIN T_AP_PAYABLE C ON B.FID=C.FID
WHERE A.FPAYMENTMETHOD=2

--6.3 付款条件的付款方式为按到期日付款或付款条件为空
INSERT INTO T_AP_PAYABLEPLAN 
(FENTRYID,FID,FSEQ,FENDDATE,FPAYRATE,FPAYAMOUNTFOR,FPAYAMOUNT,FWRITTENOFFSTATUS,FWRITTENOFFAMOUNTFOR,FWRITTENOFFAMOUNT,FNOTWRITTENOFFAMOUNTFOR,FNOTWRITTENOFFAMOUNT,FRELATEHADPAYAMOUNT,FAPPLYAMOUNT,FPURCHASEORDERNO,FPAYABLEENTRYID,FMATERIALID,FMATERIALSEQ,FPURCHASEORDERID,FNOTVERIFICATEAMOUNT,FPRICE,FQTY,FPRICEUNITID,FCOSTID_P,FREMARK)
SELECT 
100001+ROW_NUMBER() OVER(ORDER BY A.FID) FENTRYID,C.FID,ROW_NUMBER() OVER(PARTITION BY A.FID ORDER BY A.FID) FSEQ,C.FENDDATE,100 FPAYRATE,
B.FALLAMOUNTFOR FPAYAMOUNTFOR, B.FALLAMOUNT FPAYAMOUNT,'A' FWRITTENOFFSTATUS,0 FWRITTENOFFAMOUNTFOR,0 FWRITTENOFFAMOUNT,
B.FALLAMOUNTFOR FNOTWRITTENOFFAMOUNTFOR,B.FALLAMOUNT FNOTWRITTENOFFAMOUNT,0 FRELATEHADPAYAMOUNT,0 FAPPLYAMOUNT,'' FPURCHASEORDERNO,
0 FPAYABLEENTRYID,0 FMATERIALID,0 FMATERIALSEQ,0 FPURCHASEORDERID,
B.FALLAMOUNTFOR FNOTVERIFICATEAMOUNT,0 FPRICE,0 FQTY,0 FPRICEUNITID,0 FCOSTID_P,'' FREMARK
FROM #TEMPALL A
LEFT JOIN (
	SELECT FID,SUM(FALLAMOUNTFOR) FALLAMOUNTFOR,SUM(FALLAMOUNT)  FALLAMOUNT 
	FROM T_AP_PAYABLEENTRY 
	GROUP BY FID
) B ON A.FID=B.FID
LEFT JOIN T_AP_PAYABLE C ON B.FID=C.FID
WHERE A.FPAYMENTMETHOD=1 OR A.FPAYCONDITON =0


至此付款计划分录就插入完成了,请客户端检查是否存在异常。


应收单补收款计划请参考:应收单补收款计划SQL参考

图标赞 92
92人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!