TEMPLATEの使い方１

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

```RPG: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

```

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

●実行結果
![2015-12-10_205311.png](https://qiita-image-store.s3.amazonaws.com/0/100029/a58889ab-6347-98fe-3084-de7163268d7b.png)