zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    在Livemedia的基础上开发自己的流媒体客户端
    开源流媒体处理库live555服务器端、客户端源代码分析总结
    海康、大华IpCamera RTSP地址和格式
    专题:Windows编译x264、SDL、faac、ffmpeg过程
    linux下c/c++ IDE开发工具介绍
    socket选项自带的TCP异常断开检测
    logstash-input-jdbc实现mysql 与elasticsearch实时同步(ES与关系型数据库同步)
    哈希存储、哈希表原理
    APM系列-国外新兴厂商New Relic vs. AppDynamics
    SkyWalking 分布式追踪系统
  • 原文地址:https://www.cnblogs.com/Chengjr/p/14103776.html
Copyright © 2011-2022 走看看