RPG

115. データ・ストラクチャーでの重複定義 QUALIFIED

データ・ストラクチャー(DS) でフィールドをまとめて BACKUP用のエリアとして定義しておいて、
MOVE 命令などで変数値を保存しておいて、後からまた MOVE で復元する手法は効果的な使い方である。
例えば、

D SAVDTA          S              1    DIM(1024)
D*       読み取り ファイル の FORMAT を外部 DS として READ  
D DATADS        E DS                  EXTNAME(SHOHIN)   
D  DSPDTA                 1   1024                      
D                                     DIM(1024)         
    :
C                   MOVE      DSPDTA       SAVDTA
C        SHCODE     CHAIN     SHOHIN                       99
C                   MOVE      SAVDTA       DSPDTA

などのようにして使用する。
さらにこの手法を発展させて任意のフィールド群をまとめて DS として定義しておいて
1回の MOVE 命令だけで SAVE/RESTORE を行いたいとする。
上記の例では外部ファイルを EXTNAME でインクルードしているが
任意のフィールドを次のように定義しても良いはずである。

D DATADS          DS
D  SHCODE                       10A
D  SHNAME                       32O
D  SHTANKA                       7P 0
D  DSPDTA                 1   1024                      
D                                     DIM(1024) 

ところが、このような定義では SHCODE, SHNAME,... などは既に定義済みであるとして
コンパイル・エラーとなってしまう。
この不自由さを避けることのできるパラメーターとして V5R2M0 からは「QUALIFIED」という
キーワードが追加された。
使い方は簡単で、DS に次のように QUALIFIED を追加するだけでよい。

D DATADS          DS                  QUALIFIED
D  SHCODE                       10A
D  SHNAME                       32O
D  SHTANKA                       7P 0
D  DSPDTA                 1   1024                      
D                                     DIM(1024)

これだけでコンパイル・エラーを避けて、DATADS を定義することができる。
各要素は DATADS.SHCODE のように要素を付加して扱うことができる。
ただし QUALIFIED というのは既に定義済みという意味であるので
QUALIFIED として定義されている DS で新しいフィールドは定義することはできない。

これはあたかも ANSI-Ctypedef と同じである。