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の参照時にエラーになります。