• SQL-007以现存量提取数据验证店存量


    /* Formatted on 2020/12/08 17:49:34 (QP5 v5.326) */
    DECLARE
        CURSOR c_ic_onhandnum_withoutVLot IS
              SELECT *
                FROM IC_ONHANDNUM
               WHERE     pk_corp <> '1001'
                     AND nonhandnum > 0
                     AND (NVL (dr, 0) = 0)
                     AND (vlot IS NULL)
            ORDER BY pk_corp;
    
        CURSOR c_ic_onhandnum_withVLot IS
              SELECT *
                FROM IC_ONHANDNUM io
               WHERE     pk_corp <> '1001'
                     AND io.nonhandnum > 0
                     AND (NVL (io.dr, 0) = 0)
                     AND (io.vlot IS NOT NULL)
                     AND NOT EXISTS
                             (SELECT vbatchcode
                                FROM rmb_onhandnum ro
                               WHERE     NVL (dr, 0) = 0
                                     AND (NVL (ro.nonhandnum, 0) > 0)
                                     AND (ro.cinvmanid = io.cinventoryid)
                                     AND (ro.cwhid = io.cwarehouseid)
                                     AND (ro.cinvbasid = io.Cinvbasid)
                                     AND (ro.vbatchcode = io.vlot))
            ORDER BY vlot;
    
    
    
        TYPE productinfo IS RECORD
        (
            pkcorp          CHAR (4),
            invcode         VARCHAR2 (40),
            invname         VARCHAR2 (200),
            storname        VARCHAR2 (200),
            ccalbodyid      CHAR (20),
            cwarehouseid    CHAR (20),
            cinventoryid    CHAR (20),
            vbatchcode      VARCHAR2 (30)
        );
    
        v_product                     productinfo;
        v_product1                    productinfo;
        num                           INT := 0;
        i                             INT := 0;
        j                             INT := 0;
        diffvalue                     INT := 0;
        startDate                     CHAR (30) := '2020-12-31';
        endDate                       CHAR (30) := '2022-12-31';
    
        v_ic_onhandnum                ic_onhandnum%ROWTYPE;
        v_ic_onhandnum_pk_corp        ic_onhandnum.pk_corp%TYPE;
        v_ic_onhandnum_vbatchcode     IC_ONHANDNUM.VLOT%TYPE;
        v_ic_onhandnum_Cinvbasid      IC_ONHANDNUM.CINVBASID%TYPE;
        v_ic_onhandnum_cinventoryid   IC_ONHANDNUM.CINVENTORYID%TYPE;
        v_ic_onhandnum_ccalbodyid     IC_ONHANDNUM.CCALBODYID%TYPE;
        v_ic_onhandnum_cwarehouseid   IC_ONHANDNUM.CWAREHOUSEID%TYPE;
        v_ic_onhandnum_nonhandnum     IC_ONHANDNUM.NONHANDNUM%TYPE;
        v_rmb_onhandnum               rmb_onhandnum%ROWTYPE;
        v_rmb_onhandnum_nonhandnum    rmb_onhandnum.nonhandnum%TYPE;
    BEGIN
        SELECT TO_CHAR (SYSDATE, 'yyyy-mm-dd hh:mm:ss') INTO endDate FROM DUAL;
    
        DBMS_OUTPUT.put_line (
               '以现存量提取数据验证店存量,检查开始时间--无批次号检验:'
            || endDate);
        DBMS_OUTPUT.put_line ('===============================================');
        DBMS_OUTPUT.put_line (
            '===========以下查询无批次号现存/店存数据===========');
        DBMS_OUTPUT.put_line ('===============================================');
    
    
        IF NOT c_ic_onhandnum_withoutVLot%ISOPEN
        THEN
            OPEN c_ic_onhandnum_withoutVLot;
        END IF;
    
        NULL;
    
        LOOP
            FETCH c_ic_onhandnum_withoutVLot INTO v_ic_onhandnum;
    
            EXIT WHEN c_ic_onhandnum_withoutVLot%NOTFOUND;
            v_ic_onhandnum_nonhandnum := v_ic_onhandnum.nonhandnum;
    
            IF (v_ic_onhandnum_nonhandnum > 0)  --如果有现存量,就检查对应的店存是否有数据,而且数量是否一致!!!
            THEN
                v_ic_onhandnum_pk_corp := v_ic_onhandnum.pk_corp;
                v_ic_onhandnum_vbatchcode := v_ic_onhandnum.vlot;
                v_ic_onhandnum_Cinvbasid := v_ic_onhandnum.cinvbasid;
                v_ic_onhandnum_cinventoryid := v_ic_onhandnum.cinventoryid;
                v_ic_onhandnum_ccalbodyid := v_ic_onhandnum.ccalbodyid;
    
                v_ic_onhandnum_cwarehouseid := v_ic_onhandnum.cwarehouseid;
    
                IF (v_ic_onhandnum_vbatchcode IS NULL)
                THEN                                           --如果批次号为空,检查有无对 应数量
                    SELECT COUNT (*)
                      INTO num
                      FROM rmb_onhandnum
                     WHERE     NVL (dr, 0) = 0
                           AND (nonhandnum <> 0 OR nretailnum <> 0)
                           AND (cinvmanid = v_ic_onhandnum_cinventoryid)
                           AND (cwhid = v_ic_onhandnum_cwarehouseid)
                           AND (cinvbasid = v_ic_onhandnum_Cinvbasid);
    
                    IF num <> 1
                    THEN
                        SELECT h.pk_corp          pkcorp,
                               inv.invcode        invcode,
                               inv.invname        invname,
                               bs.STORNAME        storname,
                               h.ccalbodyid       ccalbodyid,
                               h.cwarehouseid     cwarehouseid,
                               h.cinventoryid     cinventoryid,
                               h.vlot             vbatchcode
                          INTO v_product
                          FROM ic_onhandnum  h
                               LEFT OUTER JOIN ic_onhandnum_b b
                                   ON h.pk_onhandnum = b.pk_onhandnum
                               LEFT OUTER JOIN bd_invbasdoc inv
                                   ON h.cinvbasid = inv.pk_invbasdoc
                               LEFT OUTER JOIN bd_invmandoc inm
                                   ON inm.PK_INVBASDOC = h.CINVENTORYID
                               LEFT OUTER JOIN bd_stordoc bs
                                   ON bs.PK_STORDOC = h.CWAREHOUSEID
                         WHERE     (NVL (h.dr, 0) = 0)
                               AND (NVL (b.dr, 0) = 0)
                               AND (NVL (inm.dr, 0) = 0)
                               AND (NVL (bs.dr, 0) = 0)
                               AND (h.PK_CORP <> '1001')
                               AND h.CWAREHOUSEID = v_ic_onhandnum_cwarehouseid
                               AND h.CCALBODYID = v_ic_onhandnum_ccalbodyid
                               AND h.CINVBASID = v_ic_onhandnum_Cinvbasid
                               AND h.CINVENTORYID = v_ic_onhandnum_cinventoryid
                               AND h.VLOT IS NULL;
    
                        IF num <= 0
                        THEN
                            i := i + 1;
                            DBMS_OUTPUT.put_line (
                                   '无批次检查结果显示:'
                                || i
                                || ' ,PK_CORP:'
                                || v_product.pkcorp
                                || ' ,库存组织:'
                                || v_product.storname
                                || ' ,商品名称:'
                                || v_product.invname
                                || ' ,INVCODE:'
                                || v_product.invcode
                                || ' ,现存数量为:'
                                || v_ic_onhandnum_nonhandnum
                                || ',在店存内查询不到对应信息无法判断!!!!!!');
                        ELSE
                            j := j + 1;
                            DBMS_OUTPUT.put_line (
                                   '无批次检查结果显示:'
                                || j
                                || ' ,PK_CORP:'
                                || v_product.pkcorp
                                || ' ,库存组织:'
                                || v_product.storname
                                || ' ,商品名称:'
                                || v_product.invname
                                || ' ,INVCODE:'
                                || v_product.invcode
                                || ' ,现存数量为:'
                                || v_ic_onhandnum_nonhandnum
                                || ' ,在店存内查询到不是1条信息,无法判断,请检查两边数据是否一致!!!!!!');
                        END IF;
                    ELSE
                        SELECT *
                          INTO v_rmb_onhandnum
                          FROM rmb_onhandnum
                         WHERE     NVL (dr, 0) = 0
                               AND (nonhandnum <> 0 OR nretailnum <> 0)
                               AND (cinvmanid = v_ic_onhandnum_cinventoryid)
                               AND (cwhid = v_ic_onhandnum_cwarehouseid)
                               AND (cinvbasid = v_ic_onhandnum_Cinvbasid);
    
                        v_rmb_onhandnum_nonhandnum := v_rmb_onhandnum.nonhandnum;
    
                        IF (v_ic_onhandnum_nonhandnum <>
                            v_rmb_onhandnum_nonhandnum)
                        THEN
                            SELECT h.pk_corp          pkcorp,
                                   inv.invcode        invcode,
                                   inv.invname        invname,
                                   bs.STORNAME        storname,
                                   h.ccalbodyid       ccalbodyid,
                                   h.cwarehouseid     cwarehouseid,
                                   h.cinventoryid     cinventoryid,
                                   h.vlot             vbatchcode
                              INTO v_product1
                              FROM ic_onhandnum  h
                                   LEFT OUTER JOIN ic_onhandnum_b b
                                       ON h.pk_onhandnum = b.pk_onhandnum
                                   LEFT OUTER JOIN bd_invbasdoc inv
                                       ON h.cinvbasid = inv.pk_invbasdoc
                                   LEFT OUTER JOIN bd_invmandoc inm
                                       ON inm.PK_INVBASDOC = h.CINVENTORYID
                                   LEFT OUTER JOIN bd_stordoc bs
                                       ON bs.PK_STORDOC = h.CWAREHOUSEID
                             WHERE     (NVL (h.dr, 0) = 0)
                                   AND (NVL (b.dr, 0) = 0)
                                   AND (NVL (inm.dr, 0) = 0)
                                   AND (NVL (bs.dr, 0) = 0)
                                   AND (h.PK_CORP <> '1001')
                                   AND h.CWAREHOUSEID =
                                       v_ic_onhandnum_cwarehouseid
                                   AND h.CCALBODYID = v_ic_onhandnum_ccalbodyid
                                   AND h.CINVBASID = v_ic_onhandnum_Cinvbasid
                                   AND h.CINVENTORYID =
                                       v_ic_onhandnum_cinventoryid
                                   AND h.VLOT IS NULL;
    
    
                            diffvalue := diffvalue + 1;
                            DBMS_OUTPUT.put_line (
                                   '检查结果显示:No:'
                                || diffvalue
                                || ' ,现存量='
                                || v_ic_onhandnum_nonhandnum
                                || ' ,店存量='
                                || v_rmb_onhandnum_nonhandnum
                                || ' ,PK_CORP:'
                                || v_product1.pkcorp
                                || ' ,库存组织:'
                                || v_product1.storname
                                || ' ,商品名称:'
                                || v_product1.invname
                                || ' ,INVCODE:'
                                || v_product1.invcode
                                || ' ,店存/库存数量不一致,请检查!!!!!!');
                        END IF;
                    END IF;
                ELSE                                          --如果批次号不为空,检查有无对 应数量
                    DBMS_OUTPUT.put_line (
                        '应该没有批次号的呀,请查询SQL');
                END IF;
            END IF;
        END LOOP;
    
        IF c_ic_onhandnum_withoutVLot%ISOPEN
        THEN
            CLOSE c_ic_onhandnum_withoutVLot;
        END IF;
    
        num := i + j + diffvalue;
    
        IF (num < 1)
        THEN
            DBMS_OUTPUT.put_line ('以无批次号现存量验证正常!!!');
        ELSE
            DBMS_OUTPUT.put_line (
                '以无批次号现存量验证完毕,错误数量:' || num);
        END IF;
    
        --下面是有批次号的检验!!!!!!!!!!!!!!!
    
        i := 0;
        j := 0;
        diffvalue := 0;
        num := 0;
    
        DBMS_OUTPUT.put_line ('===============================================');
        DBMS_OUTPUT.put_line (
            '============以下查询有批次号现存/店存数据==========');
        DBMS_OUTPUT.put_line ('===============================================');
    
    
        IF NOT c_ic_onhandnum_withVLot%ISOPEN
        THEN
            OPEN c_ic_onhandnum_withVLot;
        END IF;
    
        NULL;
    
        LOOP
            FETCH c_ic_onhandnum_withVLot INTO v_ic_onhandnum;
    
            EXIT WHEN c_ic_onhandnum_withVLot%NOTFOUND;
            v_ic_onhandnum_nonhandnum := v_ic_onhandnum.nonhandnum;
    
            IF (v_ic_onhandnum_nonhandnum > 0)  --如果有现存量,就检查对应的店存是否有数据,而且数量是否一致!!!
            THEN
                v_ic_onhandnum_pk_corp := v_ic_onhandnum.pk_corp;
                v_ic_onhandnum_vbatchcode := v_ic_onhandnum.vlot;
                v_ic_onhandnum_Cinvbasid := v_ic_onhandnum.cinvbasid;
                v_ic_onhandnum_cinventoryid := v_ic_onhandnum.cinventoryid;
                v_ic_onhandnum_ccalbodyid := v_ic_onhandnum.ccalbodyid;
                v_ic_onhandnum_cwarehouseid := v_ic_onhandnum.cwarehouseid;
    
                IF (v_ic_onhandnum_vbatchcode IS NOT NULL)
                THEN
                    SELECT h.pk_corp          pkcorp,
                           inv.invcode        invcode,
                           inv.invname        invname,
                           bs.STORNAME        storname,
                           h.ccalbodyid       ccalbodyid,
                           h.cwarehouseid     cwarehouseid,
                           h.cinventoryid     cinventoryid,
                           h.vlot             vbatchcode
                      INTO v_product
                      FROM ic_onhandnum  h
                           LEFT OUTER JOIN ic_onhandnum_b b
                               ON h.pk_onhandnum = b.pk_onhandnum
                           LEFT OUTER JOIN bd_invbasdoc inv
                               ON h.cinvbasid = inv.pk_invbasdoc
                           LEFT OUTER JOIN bd_invmandoc inm
                               ON inm.PK_INVBASDOC = h.CINVENTORYID
                           LEFT OUTER JOIN bd_stordoc bs
                               ON bs.PK_STORDOC = h.CWAREHOUSEID
                     WHERE     (NVL (h.dr, 0) = 0)
                           AND (NVL (b.dr, 0) = 0)
                           AND (NVL (inm.dr, 0) = 0)
                           AND (NVL (bs.dr, 0) = 0)
                           AND (h.PK_CORP <> '1001')
                           AND h.CWAREHOUSEID = v_ic_onhandnum_cwarehouseid
                           AND h.CCALBODYID = v_ic_onhandnum_ccalbodyid
                           AND h.CINVBASID = v_ic_onhandnum_Cinvbasid
                           AND h.CINVENTORYID = v_ic_onhandnum_cinventoryid
                           AND h.VLOT = v_ic_onhandnum_vbatchcode;
    
                    i := i + 1;
                    DBMS_OUTPUT.put_line (
                           '检查结果显示:'
                        || i
                        || ', 批次号:'
                        || v_ic_onhandnum_vbatchcode
                        || ' ,PK_CORP:'
                        || v_product.pkcorp
                        || ' ,库存组织:'
                        || v_product.storname
                        || ' ,商品名称:'
                        || v_product.invname
                        || ' ,INVCODE:'
                        || v_product.invcode
                        || ' ,现存数量为:'
                        || v_ic_onhandnum_nonhandnum
                        || ',在店存内查询不到对应信息无法判断!!!!!!');
                END IF;
            ELSE
                --如果批次号为空,直接报异常!!!!!!
                DBMS_OUTPUT.put_line (
                    '检查结果异常,批次号??????');
            END IF;
        --END IF;
        END LOOP;
    
        IF c_ic_onhandnum_withVLot%ISOPEN
        THEN
            CLOSE c_ic_onhandnum_withVLot;
        END IF;
    
        num := i + diffvalue;
    
        IF (num < 1)
        THEN
            DBMS_OUTPUT.put_line ('以现存量有批次号验证正常!');
        ELSE
            DBMS_OUTPUT.put_line (
                '以现存量有批次号验证完毕,错误数量:' || num);
        END IF;
    END;
  • 相关阅读:
    bzoj2395: [Balkan 2011]Timeismoney
    bzoj2725: [Violet 6]故乡的梦&&bzoj4400: tjoi2012 桥
    bzoj3047: Freda的传呼机&bzoj2125: 最短路
    bzoj2734: [HNOI2012]集合选数
    bzoj2728: [HNOI2012]与非
    bzoj2730: [HNOI2012]矿场搭建
    bzoj2727: [HNOI2012]双十字
    蓝桥杯-计蒜客之节假日
    蔡基姆拉尔森计算公式
    最长公共子串与最长公共子序列
  • 原文地址:https://www.cnblogs.com/Chengjr/p/14103957.html
Copyright © 2020-2023  润新知