采购发票反写单据头字段回应付单,历史数据处理SQL参考原创
金蝶云社区-jessie_w
jessie_w
29人赞赏了该文章 152次浏览 未经作者许可,禁止转载编辑于2024年05月16日 18:10:48

业务场景:

自定义反写规则:应付单下推采购发票后,采购发票反写单据头字段回应付单自定义字段

适用于SQL SERVER数据库,ORACLE数据库需要适当修改语句。


销售发票反写应收单请参考:销售发票反写发票号至应收单,历史数据处理SQL参考


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


应付单自定义字段在明细示例:

--场景1:有分批下推的情况 需要拼接发票号码,按逗号,拼接
SELECT A.FBILLNO 应付单号,A.FSETACCOUNTTYPE,B.FENTRYID 应付明细内码,ISNULL(C.FIVNUMBERNEW,''),C.* 
--UPDATE B SET B.F_BGP_TEXT=ISNULL(C.FIVNUMBERNEW,'')
FROM T_AP_PAYABLE A
LEFT JOIN T_AP_PAYABLEENTRY B ON A.FID=B.FID
INNER JOIN (
	SELECT A.FBILLNO 应付单号,B.FID,B.FENTRYID,STUFF((SELECT ',' + CC.FIVNUMBER 
	FROM T_IV_PURCHASEICENTRY_LK AA 
	LEFT JOIN T_IV_PURCHASEICENTRY BB ON AA.FENTRYID=BB.FENTRYID 
	LEFT JOIN T_IV_PURCHASEIC_O CC ON BB.FID=CC.FID WHERE AA.FSTABLENAME='T_AP_PAYABLEENTRY' AND AA.FSID = B.FENTRYID AND AA.FSBILLID=B.FID AND CC.FIVNUMBER<>'' FOR XML PATH('') ),  1, 1, ''  ) AS FIVNUMBERNEW
	FROM T_AP_PAYABLE A
	INNER JOIN T_AP_PAYABLEENTRY B ON A.FID=B.FID
	GROUP BY A.FBILLNO,B.FID,B.FENTRYID
) C ON A.FID=C.FID AND B.FENTRYID=C.FENTRYID
WHERE ( B.F_BGP_TEXT IS NULL OR ISNULL(C.FIVNUMBERNEW,'')<>'' AND B.F_BGP_TEXT<>ISNULL(C.FIVNUMBERNEW,'')) 
--AND LEN(ISNULL(C.FIVNUMBERNEW,''))<=50

--场景2:反写最后一张发票的发票号码
SELECT A.FBILLNO 应付单号,B.FENTRYID 应付明细内码,B.FSEQ 明细序号,C.FBILLNO 发票编号,FIVNUMBER 发票号码
--UPDATE B SET B.F_BGP_TEXT=C.FIVNUMBER
FROM T_AP_PAYABLE A
LEFT JOIN T_AP_PAYABLEENTRY B ON A.FID=B.FID
INNER JOIN (
	SELECT T1.FSID,T1.FSBILLID,T3.FBILLNO,T4.FIVNUMBER,ROW_NUMBER() OVER(PARTITION BY T1.FSID ORDER BY T3.FDATE DESC,T1.FENTRYID DESC) RN
	FROM T_IV_PURCHASEICENTRY_LK T1
	LEFT JOIN T_IV_PURCHASEICENTRY T2 ON T1.FENTRYID=T2.FENTRYID 
	LEFT JOIN T_IV_PURCHASEIC T3 ON T2.FID=T3.FID
	LEFT JOIN T_IV_PURCHASEIC_O T4 ON T3.FID=T4.FID 
	WHERE T3.FCANCELSTATUS<>'B' AND T3.FDOCUMENTSTATUS<>'Z' AND T1.FSTABLENAME='T_AP_PAYABLEENTRY'
) C ON B.FENTRYID=C.FSID
WHERE C.RN=1 AND ( B.F_BGP_TEXT IS NULL OR C.FIVNUMBER<>'' AND B.F_BGP_TEXT<>C.FIVNUMBER )


应付单字段在单据头字段示例:

--反写最后一张发票的单据编号回应付单单据头自定义字段
SELECT A.FBILLNO 应付单号,A.FID,A.FDATE 业务日期,A.F_ORA_TEXT,C.FBILLNO 发票编号,C.*
--UPDATE A SET A.F_ORA_TEXT=C.FBILLNO
FROM T_AP_PAYABLE A
INNER JOIN (
	SELECT T1.FSBILLID,T3.FBILLNO,ROW_NUMBER() OVER(PARTITION BY T1.FSBILLID ORDER BY T3.FDATE DESC,T1.FENTRYID DESC) RN
	FROM T_IV_PURCHASEICENTRY_LK T1
	LEFT JOIN T_IV_PURCHASEICENTRY T2 ON T1.FENTRYID=T2.FENTRYID 
	LEFT JOIN T_IV_PURCHASEIC T3 ON T2.FID=T3.FID
	LEFT JOIN T_IV_PURCHASEIC_O T4 ON T3.FID=T4.FID 
	WHERE T3.FCANCELSTATUS<>'B' AND T3.FDOCUMENTSTATUS<>'Z' AND T1.FSTABLENAME='T_AP_PAYABLEENTRY'
) C ON A.FID=C.FSBILLID
WHERE C.RN=1 AND ( A.F_ORA_TEXT IS NULL OR C.FBILLNO<>A.F_ORA_TEXT )


默认的文本字段长度为50,在更新过程中可能出现长度不够,此时就需要把自定义字段长度改大一些。数据库和BOS同步修改,数据库修改脚本如下:

--如拼接后的发票号字段超过现有自定义字段的长度,即更新时出现截断二进制报错,则需要扩大自定义字段长度
EXEC p_AlterColumn 'T_AP_PAYABLEENTRY', '字段名称', 'NVARCHAR(字段长度)', 'NULL', '0100', '';

--示例
EXEC p_AlterColumn 'T_AP_PAYABLEENTRY', 'F_BGP_TEXT', 'NVARCHAR(200)', 'NULL', '0100', '';


赞 29