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;
/











yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[oraPlsql]
Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
24/04/20 21:27:48
InfoBoard Version 1.00 : Language=Perl

1 BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube