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