RPG

260. DS定義のフィールドを *ENTRY に定義するには ?

どういうわけか DS (データ・ストラクチャー)に定義したフィールドを
*ENTRY の受取りパラメータとして使おうとすると
コンパイル・エラーとなってしまうのでシブシブ別の名前として
定義した経験のある方も多いと思う。
例えば次のような使い方である。

   *( 出力データの形式 )                         
  D WRKATR          DS                  
  D  STRLIN                 1      3S 0          
  D  WKR                    4    378    DIM(375) 
      :

  C     *ENTRY        PLIST                        
  C                   PARM                    STRLIN 

このRPGはコンパイル・エラーとなってしまう。

   RNF5029 30       *ENTRY PLIST の PARM 演算命令の結果のフィールドの指定が
                    正しくない。指定は無視されます。

STRLIN というフィールドが DS内に定義されているからである。
ここで *ENTRY には STRLIN の代わりに別の STRLINB のような
フィールドを定義してやるとコンパイルは成功する。

しかし、どうしても別名のフィールドを定義したくない場合がある。
例えば、

  D FORMDTA       E DS                  EXTNAME(FORMD)
     :
  C     *ENTRY        PLIST                       
  C                   PARM                    CPI

という場合であり FORMD という名前のファイル記述を外部定義として
FORMDTA として定義している。
これは

  C                   MOVE      FORMDTA       SAVDTA
  C     *LIKE         DEFINE    FORMDTA       SAVDTA

のようにしてレコード・バッファー FORMDTA の内容をまとめて
SAVDTA というフィールドとして BACKUP & RESTORE したいからである。
せっかくスマートな方法であるのにコンパイル・エラーごときのために
スマートな演算を捨てて、フィールドをすべて手動で記述していたのでは
保守性に欠けるソースとなるし、何よりもバグ発生の要因と成りかねない。

そこでDS定義のフィールドによるコンパイル・エラーを一気に解決できる
方法がある。
DS 定義に次のように QUALIFIED を追加することである。
これによって RNF5029 のコンパイル・エラーは発生することがなくなる。

  D WRKATR          DS                  QUALIFIED   
  D  STRLIN                 1      3S 0          
  D  WKR                    4    378    DIM(375) 

  D FORMDTA       E DS                  EXTNAME(FORMD)
  D                                     QUALIFIED