どういうわけか 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