LoginSignup
1
1

More than 5 years have passed since last update.

サブプロシージャでのF仕様書

Posted at

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1