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 

●ODPを非共用でのカーソルの状態
2015-12-04_194945.png

●ODPを共用でのカーソルの状態
2015-12-04_195035.png
2015-12-04_195201.png

●実行結果
2015-12-04_195437.png