CL でフラッシュバック・クエリ!? / CLで複数ファイルを扱う (V5R4)

DB2 for i でフラッシュバック・クエリ!? (V5R4)」を CL で書き換えてみました。
CL には DSPLY がないので表示のさせ方がちょっと変わってますが、ロジックはほぼ同じになっています。

             PGM                                                                
         /* コンパイル前に出力ファイルを作成しておくこと             */                               
         /*  DSPJRN     JRN(QSQJRN) OUTPUT(*OUTFILE) OUTFILE(QJORDJE)  */       
                                                                                
         /* カラム定義のためのDCLF  */                                                   
             DCLF       FILE(QJORDJE) OPNID(JO)                                 
             DCLF       FILE(QIWSTEST/QCUSTCDT) OPNID(CS)                       
         /* 変数 */                                                               
             DCL        VAR(&ENTNO) TYPE(*DEC) LEN(10 0)                        
             DCL        VAR(&JCODE) TYPE(*CHAR) LEN(1)                          
             DCL        VAR(&ETYPE) TYPE(*CHAR) LEN(2)                          
             DCL        VAR(&RCVNAME) TYPE(*CHAR) LEN(10)                       
             DCL        VAR(&RCVLIB) TYPE(*CHAR) LEN(10)                        
             DCL        VAR(&JENTRY) TYPE(*CHAR) LEN(205)                       
             DCL        VAR(&RTNSEQLRG) TYPE(*CHAR) LEN(20) +                   
                          VALUE(*FIRST)                                         
             DCL        VAR(&RTNSEQLRGN) TYPE(*INT)                             
         /* メッセージとして表示するための変数 */                                                
             DCL        VAR(&MSG6 ) TYPE(*CHAR) LEN(6 )                         
             DCL        VAR(&MSG10) TYPE(*CHAR) LEN(10)                         
             DCL        VAR(&MSG) TYPE(*CHAR) LEN(64)                           
                                                                                
 LOOP:       RTVJRNE    JRN(QIWSTEST/QSQJRN) +                                  
                          FILE((QIWSTEST/QCUSTCDT)) +                           
                          FROMENTLRG(&RTNSEQLRG) JRNCDE((R)) +                  
                          ENTTYP(*RCD) RTNSEQLRG(&RTNSEQLRG) +                  
                          RTNJRNCDE(&JCODE) RTNENTTYP(&ETYPE) +                 
                          RTNRCV(&RCVNAME) RTNRCVLIB(&RCVLIB) +                 
                          RTNJRNE(&JENTRY) RTNSEQNBR(&ENTNO)                    
             MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(EXIT))                  
         /* ジャーナル項目からカラムに切り出し */                                                
             CHGVAR     VAR(&JO_JOSEQN) VALUE(%SST(&JENTRY 6 10))               
             CHGVAR     VAR(&JO_JOCODE) VALUE(%SST(&JENTRY 16 1))               
             CHGVAR     VAR(&JO_JOENTT) VALUE(%SST(&JENTRY 17 2))               
             CHGVAR     VAR(&CS_CUSNUM) VALUE(%SST(&JENTRY 126 6))              
             CHGVAR     VAR(&CS_LSTNAM) VALUE(%SST(&JENTRY 132 8))              
             CHGVAR     VAR(&CS_STATE ) VALUE(%SST(&JENTRY 162 2))              
         /* 切り出したカラムを表示 */                                                      
             CHGVAR     VAR(&MSG10) VALUE(&JO_JOSEQN)                           
             SNDPGMMSG  MSG(&MSG10)                                             
             CHGVAR     VAR(&MSG) VALUE(&JO_JOENTT)                             
             SNDPGMMSG  MSG(&MSG)                                               
             CHGVAR     VAR(&MSG6) VALUE(&CS_CUSNUM)                            
             SNDPGMMSG  MSG(&MSG6)                                              
             CHGVAR     VAR(&MSG) VALUE(&CS_LSTNAM)                             
             SNDPGMMSG  MSG(&MSG)                                               
             CHGVAR     VAR(&MSG) VALUE(&CS_STATE)                              
             SNDPGMMSG  MSG(&MSG)                                               
             CHGVAR     VAR(&MSG) VALUE(' ')                                    
             SNDPGMMSG  MSG(&MSG)                                               
         /* 次の項目を取得するための計算*/                                                    
             CHGVAR     VAR(&RTNSEQLRGN) VALUE(&RTNSEQLRG)                      
             CHGVAR     VAR(&RTNSEQLRGN) VALUE(&RTNSEQLRGN + 1)                 
             CHGVAR     VAR(&RTNSEQLRG ) VALUE(&RTNSEQLRGN)                     
             GOTO       CMDLBL(LOOP)                                            
                                                                                
 EXIT:       ENDPGM                                                             

実行例

実行例は↓のようなかんじです。

CLP の複数ファイルの定義

CL で複数のファイルを定義する場合は、↓のように OPNID の指定が必須です。

             DCLF       FILE(QJORDJE) OPNID(JO)                                 
             DCLF       FILE(QIWSTEST/QCUSTCDT) OPNID(CS)                       

ファイルのフィールドは定義しなくても CL プログラム変数として取り込まれます。
ILE RPG の EXTNAME と同様ですね。
今回の例では RCVF は使用していないのですが、こういうファイル内の変数定義をまとめて行うという用途もあります。

複数ファイルへのアクセス

OPNID に _ (アンダーバー)をつけたフィールド名がそのまま変数名として使用できます。
複数ファイルの区別はこの OPNID_ で行われるので、OPNID の指定が必須なんですね。

             CHGVAR     VAR(&JO_JOENTT) VALUE(%SST(&JENTRY 17 2))               
             CHGVAR     VAR(&CS_CUSNUM) VALUE(%SST(&JENTRY 126 6))              

ジャーナル項目の取得は DSPJRN だけではない

DB2 for i でフラッシュバック・クエリ!? (V5R4)」では RPG SQL で処理するので DSPJRN コマンドでの出力ファイルを使用しましたが、今回は RTNJRNE コマンドを使用しています。

 LOOP:       RTVJRNE    JRN(QIWSTEST/QSQJRN) +                                  
                          FILE((QIWSTEST/QCUSTCDT)) +                           
                          FROMENTLRG(&RTNSEQLRG) JRNCDE((R)) +                  
                          ENTTYP(*RCD) RTNSEQLRG(&RTNSEQLRG) +                  
                          RTNJRNCDE(&JCODE) RTNENTTYP(&ETYPE) +                 
                          RTNRCV(&RCVNAME) RTNRCVLIB(&RCVLIB) +                 
                          RTNJRNE(&JENTRY) RTNSEQNBR(&ENTNO)                    

言うまでもありませんが、わざわざファイルを作らなくていい、というのがメリットですね。
逆にログとしても残したいような場合は DSPJRN でファイルに書き出せばいいですし、適材適所だと思います。

RTVJRNE コマンドの場合はジャーナル項目ごとの取得になります。
DSPJRN コマンドを利用した場合に比較すると、レコードづつ取得できるようなイメージです。

次の項目の取得には、順序番号を計算して次の項目に向けて RTVJRNE コマンドを再度実行する、というかたちになります。

             CHGVAR     VAR(&RTNSEQLRGN) VALUE(&RTNSEQLRG)                      
             CHGVAR     VAR(&RTNSEQLRGN) VALUE(&RTNSEQLRGN + 1)                 
             CHGVAR     VAR(&RTNSEQLRG ) VALUE(&RTNSEQLRGN)                     
             GOTO       CMDLBL(LOOP)                                            

[Top Pageに戻る]

Ads by TOK2