SQL-002以旧换新传财务凭证核对-V1.3
2020-12-26重新更新的代码:
/* Formatted on 2020/12/25 星期五 21:29:35 (QP5 v5.326) */ DECLARE /*以下定义开始日期,每次查询时请自行修改*/ startdate CHAR (10) := '2020-10-01'; /* 以下语句请切记不要改动!!!!!!!!!!!!!!!!!! */ v_dap_finindex dap_finindex%ROWTYPE; v_dtjt_tradein dtjt_tradein_h%ROWTYPE; endDate CHAR (10) := '2022-12-31'; CURSOR c_dtjt_tradein IS SELECT H.* FROM dtjt_tradein_h h LEFT JOIN (SELECT DISTINCT ctradeinhid FROM dtjt_tradein_b) b ON h.ctradeinhid = b.ctradeinhid WHERE NVL (h.dr, 0) = 0 AND (h.vbillstatus = 1) AND (H.dbilldate >= startdate) AND (H.dbilldate <= endDate) ORDER BY h.dbilldate; num INT := 0; i INT := 0; v_dtjt_vbillcode dtjt_tradein_h.vbillcode%TYPE; v_dtjt_pk_corp dtjt_tradein_h.pk_corp%TYPE; v_dap_finindex_billcode DAP_FININDEX.BILLCODE%TYPE; v_dap_finindex_pk_corp dap_finindex.pk_corp%TYPE; v_dtjt_dbilldate dtjt_tradein_h.dbilldate%TYPE; BEGIN SELECT TO_CHAR (SYSDATE, 'yyyy-mm-dd') INTO endDate FROM DUAL; DBMS_OUTPUT.put_line ( '以旧换新工单传财务凭证验证,检查日期范围:' || startdate || ' -- ' || endDate); IF NOT c_dtjt_tradein%ISOPEN THEN OPEN c_dtjt_tradein; END IF; NULL; LOOP FETCH c_dtjt_tradein INTO v_dtjt_tradein; EXIT WHEN c_dtjt_tradein%NOTFOUND; v_dtjt_vbillcode := v_dtjt_tradein.vbillcode; v_dtjt_pk_corp := v_dtjt_tradein.pk_corp; v_dtjt_dbilldate := v_dtjt_tradein.dbilldate; v_dap_finindex_billcode := v_dtjt_vbillcode; v_dap_finindex_pk_corp := v_dtjt_pk_corp; SELECT COUNT (billcode) INTO num FROM dap_finindex WHERE (billcode = v_dap_finindex_billcode) AND (pk_corp = v_dap_finindex_pk_corp) AND (billcode IS NOT NULL) AND (busidate >= startdate) AND (busidate <= endDate) AND (pk_sys = 'BSM' AND pk_proc = 'JT01') -- and (flag=2) 这一行需要验证一下再决定是否使用!!!!!!!!! AND (NVL (dr, 0) = 0); IF (num <> 1) THEN i := i + 1; DBMS_OUTPUT.put_line ( '检查结果显示:No:' || i || ',工单日期:' || v_dtjt_dbilldate || ' ,公司:' || v_dtjt_pk_corp || ',可能未传递单号: ' || v_dtjt_vbillcode); END IF; END LOOP; IF c_dtjt_tradein%ISOPEN THEN CLOSE c_dtjt_tradein; END IF; IF (i < 1) THEN DBMS_OUTPUT.put_line ( '以旧换新工单传财务凭证验证正常,放心使用'); ELSE DBMS_OUTPUT.put_line ( '以旧换新工单传财务凭证验证完毕,可能未传递总数量:' || i); END IF; END; /
更新原因:以前理解稍有偏差,
1、认为表dtjt_tradein_h中的vdef2为空就应该是没有传过去凭证的单据,但通过实际业务发现,该字段有值有时也会发生没有传过去凭证的问题,故进行相应修改;
2、同时以前的游标代码进行相应变动,因为以前的游标代码如果删掉 AND h.vdef2 IS NULL 这个,如果子表有多个数据会出现重复查询结果,故新的查询语句格式变成:
SELECT H.* FROM dtjt_tradein_h h
LEFT JOIN (SELECT DISTINCT ctradeinhid FROM dtjt_tradein_b) b
ON h.ctradeinhid = b.ctradeinhid
这样就解决了查询主子表一对多数据时重复查询结果。
下面将以前的游标定义贴出,以记忆:
CURSOR c_dtjt_tradein IS
SELECT H.*
FROM dtjt_tradein_h h
INNER JOIN dtjt_tradein_b b ON h.ctradeinhid = b.ctradeinhid --这个会出现的问题是:如果子表和主表有多个数据对应,会导致查询结果有重复单号,1.3版变为以上!
--2020-11-15更新,增加dtjt_tradein_b
WHERE NVL (h.dr, 0) = 0
AND NVL (b.dr, 0) = 0
AND h.vbillstatus = 1
AND h.vdef2 IS NULL --这个不为空,也有部分单据没有传到凭证,1.3版取掉了!
AND H.dbilldate >= startdate
AND H.dbilldate <= endDate;