PL/SQL : リアルサンプル2

  SAMPLE02



CREATE or REPLACE PROCEDURE SAMPLE02
        (
         PM_BLOCKSHO    IN      NUMBER
        ,PM_DATE    IN      DATE
        )
        AS

/*===========================================================================
   変数
===========================================================================*/
    source_cursor        integer;
    destination_cursor    integer;
    delete_cursor        integer;
    rows_processed        integer;

    WK_DATE        DATE;
    WK_SELECT    VARCHAR2(1024);            -- select 文

    取引先        NUMBER(5,0);
    取引先支店    NUMBER(2,0);
    請求締め日    NUMBER(2,0);
    回収サイクル    NUMBER(1,0);
    回収日        NUMBER(2,0);
    回収予定日    DATE;
    事業部        NUMBER(2,0);
    部        NUMBER(1,0);
    課        NUMBER(1,0);
    手形区分    NUMBER(3,0);
    S手形区分    VARCHAR2(8);
    サイト        NUMBER(3,0);
    回収方法    NUMBER(1,0);
    S回収方法    VARCHAR2(4);
    当月請求額    NUMBER(10,0);
    当月売上額    NUMBER(10,0);
    中間請求額    NUMBER(10,0);
    回収予定額    NUMBER(10,0);
    買掛残高    NUMBER(10,0);

    R振込        NUMBER(3,0);
    振込        NUMBER(10,0);
    R現金        NUMBER(3,0);
    現金        NUMBER(10,0);
    R手形        NUMBER(3,0);
    手形        NUMBER(10,0);
    R期日現金    NUMBER(3,0);
    期日現金    NUMBER(10,0);
    R小切手        NUMBER(3,0);
    小切手        NUMBER(10,0);
    Rその他        NUMBER(3,0);
    その他        NUMBER(10,0);

    S事業部        NUMBER(2,0);
    S部        NUMBER(1,0);
    S課        NUMBER(1,0);
    担当者        NUMBER(4,0);

/*===========================================================================
   ローカル関数
===========================================================================*/
/*=======================================================
   最新請求締年月日取得
   IN           PM_DATE         : 締年月日
   RETURN       WK_DATE         : 最新請求締年月日
=====================================================*/
FUNCTION GET_DATE_SIME (PM_DATE IN DATE) RETURN DATE
        AS
        WK_DATE         DATE;
BEGIN
        WK_DATE         := ADD_MONTHS(PM_DATE,-1);
        WK_DATE         := WK_DATE + 1;
        RETURN          WK_DATE;
END GET_DATE_SIME;

/*
=======================================================
   長い文字列出力
=====================================================*/
-- CREATE or REPLACE
PROCEDURE PUT_LSTR
        (
         PM_STR        IN      VARCHAR2
        )
        AS

BEGIN

    DBMS_OUTPUT.PUT_LINE(substr(PM_STR,1,80));
    DBMS_OUTPUT.PUT_LINE(substr(PM_STR,81,80));
    DBMS_OUTPUT.PUT_LINE(substr(PM_STR,161,80));
    DBMS_OUTPUT.PUT_LINE(substr(PM_STR,241,80));
    DBMS_OUTPUT.PUT_LINE(substr(PM_STR,321,80));
    DBMS_OUTPUT.PUT_LINE(substr(PM_STR,401,80));
    DBMS_OUTPUT.PUT_LINE(substr(PM_STR,481,80));

END PUT_LSTR;

/*=====================================================
 対象取引先チェック
=====================================================*/
FUNCTION CHECK_TORI
        (
         PM_TORI    IN    NUMBER
        ,PM_TORI_ST    IN    NUMBER
        )
    RETURN BOOLEAN
        AS

    WK_DAY        NUMBER(2,0);
    WK_CMP_DAY    NUMBER(2,0);
    WK_KBN_JITA    NUMBER(1,0);
    WK_SIME        DATE;
BEGIN
        BEGIN
        select DAY_SIME_SEI into WK_DAY from MM_TORISUB
            where CD_TORI = PM_TORI and CD_TORI_ST = PM_TORI_ST and FLG_TOKUI = 1;
        EXCEPTION
            WHEN NO_DATA_FOUND THEN NULL;
        END;
        if SQL%NOTFOUND then  
        return FALSE;
    end if;

    if LAST_DAY(PM_DATE) = PM_DATE then
        WK_CMP_DAY := 99;
    else
        WK_CMP_DAY := TO_NUMBER(TO_CHAR(PM_DATE,'DD'));
    end if;

    if WK_DAY = WK_CMP_DAY then

            BEGIN
            select KBN_JITA into WK_KBN_JITA from MM_TORI 
                where CD_TORI = PM_TORI and CD_TORI_ST = PM_TORI_ST;
            EXCEPTION
                WHEN NO_DATA_FOUND THEN NULL;
            END;
            if SQL%NOTFOUND then  
            return FALSE;
        end if;

        if WK_KBN_JITA = 0 then
                    BEGIN
                select YMD_SIME_SEI into WK_SIME from KF_HSIME_SEI where 
                    CD_BLOCKSHO = PM_BLOCKSHO and 
                    CD_TORI = PM_TORI and 
                    CD_TORI_ST = PM_TORI_ST;
                    EXCEPTION
                            WHEN NO_DATA_FOUND THEN NULL;
                    END;
                    if SQL%NOTFOUND then  
                return TRUE;
            end if;
            if WK_SIME != PM_DATE then
                return TRUE;
            end if;
        end if;
    end if;

        BEGIN
        select KBN_JITA into WK_KBN_JITA from MM_TORI where CD_TORI = PM_TORI and CD_TORI_ST = PM_TORI_ST;
        EXCEPTION
            WHEN NO_DATA_FOUND THEN NULL;
        END;
        if SQL%NOTFOUND then  
        return FALSE;
    end if;

    if WK_KBN_JITA = 0 then
            BEGIN
            select YMD_HSIME_SEI into WK_SIME from KF_HSIME_SEI where 
                CD_BLOCKSHO = PM_BLOCKSHO and 
                CD_TORI = PM_TORI and 
                CD_TORI_ST = PM_TORI_ST;
        EXCEPTION
            WHEN NO_DATA_FOUND THEN NULL;
        END;
        if SQL%NOTFOUND then  
            return FALSE;
        end if;
        if WK_SIME = PM_DATE then
            return TRUE;
        end if;
    end if;
    return FALSE;

END CHECK_TORI;

/*===========================================================================
   主処理
===========================================================================*/
BEGIN

/*=====================================================
   初期処理
=====================================================*/
    WK_DATE        :=    GET_DATE_SIME( PM_DATE );    -- from DATE 取得
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(WK_DATE,'YY/MM/DD') || '〜' || TO_CHAR(PM_DATE,'YY/MM/DD'));

/*=====================================================
   SELECT文作成
=====================================================*/
    WK_SELECT    :=
    'select
        CD_TORI,
        CD_TORI_ST,
        CD_JIGYO,
        CD_BUMON,
        CD_KA,
        nvl(sum(KIN_TOSEI),0),
        nvl(sum(KIN_URIAGE),0),
        nvl(sum(KIN_TYUKAN),0)
    from KF_SEI
    where
        CD_BLOCKSHO = :PM_BLOCKSHO and
        YMD_SIME_SEI = :PM_DATE and
        YMD_FROM_SEI <= YMD_SIME_SEI
    group by
        CD_JIGYO,
        CD_BUMON,
        CD_KA,
        CD_TORI,
        CD_TORI_ST';
/*
    'select
        CD_TORI,
        CD_TORI_ST,
        CD_JIGYO,
        CD_BUMON,
        CD_KA,
        nvl(sum(KIN_TOSEI),0),
        nvl(sum(KIN_URIAGE),0),
        nvl(sum(KIN_TYUKAN),0)
    from KF_SEI
    where
        CD_BLOCKSHO = :PM_BLOCKSHO and
        YMD_SIME_SEI between :WK_DATE and :PM_DATE
    group by
        CD_JIGYO,
        CD_BUMON,
        CD_KA,
        CD_TORI,
        CD_TORI_ST';
*/

--    PUT_LSTR( WK_SELECT );        

/*=====================================================
   入力定義
=====================================================*/
    source_cursor        :=    dbms_sql.open_cursor;
    dbms_sql.parse( source_cursor, WK_SELECT, 2 );

    dbms_sql.define_column( source_cursor,    1,    取引先 );
    dbms_sql.define_column( source_cursor,    2,    取引先支店 );
    dbms_sql.define_column( source_cursor,    3,    事業部 );
    dbms_sql.define_column( source_cursor,    4,    部 );
    dbms_sql.define_column( source_cursor,    5,    課 );
    dbms_sql.define_column( source_cursor,    6,    当月請求額 );
    dbms_sql.define_column( source_cursor,    7,    当月売上額 );
    dbms_sql.define_column( source_cursor,    8,    中間請求額 );

    dbms_sql.bind_variable( source_cursor, 'PM_BLOCKSHO', PM_BLOCKSHO );
--    dbms_sql.bind_variable( source_cursor, 'WK_DATE', WK_DATE );
    dbms_sql.bind_variable( source_cursor, 'PM_DATE', PM_DATE );

    rows_processed        :=    dbms_sql.execute( source_cursor );

/*=====================================================
   入出力
=====================================================*/

    loop
        if dbms_sql.fetch_rows( source_cursor ) > 0 then

            dbms_sql.column_value( source_cursor,    1,    取引先 );
            dbms_sql.column_value( source_cursor,    2,    取引先支店 );
            dbms_sql.column_value( source_cursor,    3,    事業部 );
            dbms_sql.column_value( source_cursor,    4,    部 );
            dbms_sql.column_value( source_cursor,    5,    課 );
            dbms_sql.column_value( source_cursor,    6,    当月請求額 );
            dbms_sql.column_value( source_cursor,    7,    当月売上額 );
            dbms_sql.column_value( source_cursor,    8,    中間請求額 );

            DBMS_OUTPUT.PUT_LINE(TO_CHAR(取引先) || '-' || TO_CHAR(取引先支店));

            if CHECK_TORI(取引先,取引先支店) then
--                DBMS_OUTPUT.PUT_LINE('取引先チェックOK');
                BEGIN
                    select    DAY_SIME_SEI,CYCLE_KAI,DAY_KAI,
                        nvl(RT_FURI_KAI,0),
                        nvl(RT_GENKIN_KAI,0),
                        nvl(RT_TEGATA_KAI,0),
                        nvl(RT_KIJITU_KAI,0),
                        nvl(RT_KOGITTE_KAI,0),
                        nvl(RT_SONOTA_KAI,0),
                        KBN_TEGATA,
                        SAITO_KA,
                        HOUHOU_KAI,
                        CD_JIGYO,
                        CD_BUMON,
                        CD_KA
                    into    請求締め日,回収サイクル,回収日,
                        R振込,
                        R現金,
                        R手形,
                        R期日現金,
                        R小切手,
                        Rその他,
                        手形区分,
                        サイト,
                        回収方法,
                        S事業部,
                        S部,
                        S課
                    from    MM_TORISUB
                    where    CD_TORI = 取引先 and CD_TORI_ST = 取引先支店;
                    EXCEPTION
                        WHEN NO_DATA_FOUND THEN NULL;
                    END;
                    if SQL%FOUND then  
                    if 回収サイクル = 1 or 回収サイクル = 2 and 回収日 <= 請求締め日 then
                        回収予定額 := 当月請求額;
                    else
                        回収予定額 := 当月請求額 - 当月売上額 - 中間請求額;
                    end if;

                    振込        := 回収予定額 * R振込        / 100;
                    現金        := 回収予定額 * R現金        / 100;
                    手形        := 回収予定額 * R手形        / 100;
                    期日現金    := 回収予定額 * R期日現金    / 100;
                    小切手        := 回収予定額 * R小切手        / 100;
                    その他        := 回収予定額 * Rその他        / 100;
                    
                    delete from KF_KAI_YOTEI where 
                        CD_TORI = 取引先 and
                        CD_TORI_ST = 取引先支店;
                    
                    BEGIN
                        select    sum(nvl(KIN_MIBARAI,0))
                            +sum(nvl(KIN_SHOHIN,0))
                            +sum(nvl(KIN_GAICHU,0))
                        into    買掛残高
                        from    DF_SIZAN
                        where 
                            CD_TORI = 取引先 and
                            CD_TORI_ST = 取引先支店 and
                            TO_NUMBER(TO_CHAR(YMD_SIHARAI,'DD')) = 請求締め日;
                        EXCEPTION
                            WHEN NO_DATA_FOUND THEN NULL;
                        END;
                        if SQL%NOTFOUND then
                        買掛残高 := 0;
                    end if; 

                    回収予定日 := TO_DATE(TO_CHAR(PM_DATE,'YY') ||
                         '/' || TO_CHAR(PM_DATE,'MM') ||
                         '/' || TO_CHAR(回収日,'99'));
                    if 回収日 <= 請求締め日 then
                        回収予定日 := ADD_MONTHS(回収予定日, 1) ;
                    end if;

                    S手形区分 := NULL;
                    S回収方法 := NULL;

                    if R手形 != 0 then
                        if 手形区分 = 1 then
                            S手形区分 := '自己手形';
                        end if;
                        if 手形区分 = 2 then
                            S手形区分 := '廻り手形';
                        end if;
                    else
                        サイト := 0;                        
                    end if;
                    if 回収方法 = 1 then
                        S回収方法 := '振込';
                    end if;
                    if 回収方法 = 2 then
                        S回収方法 := '郵送';
                    end if;
                    if 回収方法 = 3 then
                        S回収方法 := '集金';
                    end if;

                    BEGIN
                        select CD_TANTO into 担当者 from MM_EITAN where 
                            CD_TORI = 取引先 and 
                            CD_TORI_ST = 取引先支店 and 
                            CD_JIGYO = S事業部 and 
                            CD_BUMON = S部 and 
                            CD_KA = S課;
                        EXCEPTION
                            WHEN NO_DATA_FOUND THEN NULL;
                    END;
                        if SQL%NOTFOUND then  
                        担当者 := 0;
                    end if;

                    insert into KF_KAI_YOTEI
                    (
                    CD_BLOCKSHO,
                    CD_JIGYO,
                    CD_BUMON,
                    CD_KA,
                    CD_TORI,
                    CD_TORI_ST,
                    CD_TANTO,
                    YMD_KAI,
                    KIN_TOSEI,
                    KIN_KAIYO,
                    KIN_Y_FURI,
                    KIN_Y_GENKIN,
                    KIN_Y_TEGATA,
                    KIN_Y_KIJITU,
                    KIN_Y_KOGITE,
                    KIN_Y_SOSAI,
                    KIN_Y_SONOTA,
                    NM_SAI,
                    NM_TEGATA,
                    NM_HOU,
                    KIN_MIBARAI
--                    YMD_UPD
                    ) 
                    values
                    (
                    PM_BLOCKSHO,
                    事業部,
                    部,
                    課,
                    取引先,
                    取引先支店,
                    担当者,
                    回収予定日,
                    当月請求額,
                    回収予定額,
                    振込,
                    現金,
                    手形,
                    期日現金,
                    小切手,
                    0,
                    その他,
                    サイト,
                    S手形区分,
                    S回収方法,
                    買掛残高
--                    sysdate
                    );
                end if;
            end if;
        else
            exit;
        end if;

    end loop;

/*=====================================================
   終了処理
=====================================================*/
    commit;
    dbms_sql.close_cursor( source_cursor );


END SAMPLE02;
/











  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ