Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@ushiday

TEMPLATEの使い方1

V6R1以降ではTEMPLATEというオプションが追加されており、ファイルがパラメータで扱える様になっています。随分と長い間、V5R4を使用していたせいか、V6R1以降の追加機能は全て新鮮に思えます。
複数の同形式実ファイル引数に取って、サブプロシージャに処理させる事も可能です。

USR406R.rpgle
     H****************************************************************
     H*-‚------------------------------*
     H*-‚---<<日付・著作権    >>-----*
     H*-‚------------------------------*
     H DATEDIT(*YMD)
     H COPYRIGHT('(C) ushiday - ')
     H*-‚------------------------------*
     H*-‚---<<コンパイル条件  >>-----*
     H*-‚------------------------------*
     H DFTACTGRP(*NO) ACTGRP(*NEW)
     F*ファイルテンプレートの定義
     FITEM_T    IF   E           K DISK
     F                                     TEMPLATE BLOCK(*YES)
     F                                     EXTDESC('ITEM')
     F*実ファイルの定義
     FFILE1                                LIKEFILE(ITEM_T )
     F                                     EXTFILE('ITEM')
     FFILE2                                LIKEFILE(ITEM_T )
     F                                     EXTFILE('ITEM')
     D*
     D*レコードテンプレートの定義
     D REC_T           DS                  LIKEREC(ITEMR : *INPUT)
     D                                     TEMPLATE
     D*実レコードの定義
     D REC1            DS                  LIKEDS(REC_T)
     D REC2            DS                  LIKEDS(REC_T)
     D*
     D COUNT           S              5S 0 INZ
     D*
     D print           PR                  EXTPROC('print')                     標準出力関数
     D    msg                      1000A   VARYING CONST
     C*-‚------------------------------*
     C*-‚---<<メインルーチン  >>-----*
     C*-‚------------------------------*
      /FREE

           DOW GET_NEXT_REC(FILE1 : REC1)
            AND GET_NEXT_REC(FILE2 : REC2)
            AND COUNT < 10                      ;
               print ( 'REC1(' + %EDITC(REC1.CODE :'X') + ')'
                           +  REC1.NAME ) ;
               print ( 'REC2(' + %EDITC(REC2.CODE :'X') + ')'
                           +  REC2.NAME ) ;
               COUNT += 1 ;
           ENDDO ;

           EXSR @END  ;

           //終了
           BEGSR   @END   ;
               *INLR = *ON    ;
               RETURN        ;
           ENDSR         ;

      /END-FREE
     P****************************************************************
     P** < GET_NEXT_REC      >: 次レコード取得                    **
     P****************************************************************
     P GET_NEXT_REC    B
     D GET_NEXT_REC    PI              N
     D  IFILE                              LIKEFILE(ITEM_T)                     入力ファイル
     D  DATA                               LIKEDS(REC_T)                        結果レコード
     D*-š---<<変数定義 >>-----*
      /FREE

           DOW 1 = 1             ;
               READ IFILE DATA         ;
               IF %EOF(IFILE )         ;
                   RETURN *OFF ;
               ENDIF                 ;
               RETURN *ON            ;
           ENDDO                 ;

           RETURN *OFF  ;

      /END-FREE
     P                 E

ファイルの引数は色々と使えそうな気がしますね。もう少し掘り下げて活用してみたいです。
ただし、今回のサンプルは、2つのファイルが同一なので、ODPが共用されているとFILE2の参照時にエラーになります。

●実行結果
2015-12-10_205311.png

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?