V6R1からは、サブプロシージャでローカルのF仕様書が定義出来ます。
サブルーチンやサービスPGMを作成する際には、非常に役に立つのではないでしょうか。
今までは、サービスPGMでアサインしているファイルはUCしない限り、使用しないファイルでもオープンされてましたが、この機能により、通常はサブプロシージャが呼ばれない限り、オープンはされません。
ローカルF仕様書の挙動についてまとめ
メインルーチンとサブプロシージャで同じファイル定義が有る場合
1. ODP共用→メインとサブで同一のカーソルを持つ
2. ODP非共用→メインとサブで別のカーソルを持つ。サブは実行時にファイルオープンし、終了時にファイルクローズする。ただし、F仕様書にSTATICオプションを付けると、サブ終了時にファイルをクローズしない。
OVRDBFでODPを共用している場合は、挙動に気をつける必要がありますね。
USR404.rpgle
H****************************************************************
H*-‚------------------------------*
H*-‚---<<日付・著作権 >>-----*
H*-‚------------------------------*
H DATEDIT(*YMD)
H COPYRIGHT('(C) ushiday - ')
H*-‚------------------------------*
H*-‚---<<コンパイル条件 >>-----*
H*-‚------------------------------*
H DFTACTGRP(*NO) ACTGRP(*NEW)
H OPTION(*NOUNREF)
H BNDDIR('QC2LE')
FITEM IF E K DISK
D*
D REC E DS EXTNAME(ITEM : *INPUT)
D QUALIFIED
D*
D print PR EXTPROC('print') 標準出力関数
D msg 1000A VARYING CONST
C*-‚------------------------------*
C*-‚---<<メインルーチン >>-----*
C*-‚------------------------------*
/FREE
print ( '---- PROGRAM START ----') ;
READ ITEM ;
READ ITEM ;
READ ITEM ;
DSPLY ('MAIN READ 3 TIMES') ;
REC = GET_ITEM() ;
print ( '(' + %EDITC(REC.CODE :'X') + ')'
+ REC.NAME ) ;
EXSR @END ;
//終了
BEGSR @END ;
print ( '---- PROGRAM END ----') ;
*INLR = *ON ;
RETURN ;
ENDSR ;
/END-FREE
P****************************************************************
P** < GET_ITEM >: 商品取得 **
P****************************************************************
P GET_ITEM B
FITEM IF E K DISK
D GET_ITEM PI LIKEDS(REC)
D*-š---<<変数定義 >>-----*
D REC E DS EXTNAME(ITEM : *INPUT)
D QUALIFIED
/FREE
CLEAR REC ;
READ ITEM REC ;
DSPLY ('SUB ROUTINE READ 1 TIME') ;
RETURN REC ;
/END-FREE
P E
P****************************************************************
P** < print >: 標準出力 **
P****************************************************************
P print B EXPORT
D print PI
D msg 1000A VARYING CONST
D printf PR * EXTPROC('printf')
D template * VALUE OPTIONS(*STRING)
D string * VALUE OPTIONS(*STRING)
D dummy * VALUE OPTIONS(*NOPASS)
D*
D NEWLINE C X'15'
D*タイムスタンプ
D WTIMESTAMP S Z
D WDATE8 S 8S 0
D WTIME6 S 6S 0
WTIMESTAMP = %TIMESTAMP() ;
WDATE8 = %DEC(%DATE(WTIMESTAMP) : *ISO );
WTIME6 = %DEC(%TIME(WTIMESTAMP) : *HMS );
/FREE
printf ( %EDITW(WTIME6:' : : ')+ ' %s' + NEWLINE : msg) ;
/END-FREE
P E