Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした