データ・ストラクチャー(データ構造定義)で
QUALIFIEDキー・ワードを使えるようになっている。
DS定義のサブ・フィールドを各DSで定義するということで
DSの名前を付加して区別するようにしたものである。
例えばFROMILEという名前のDSで定義されるサブ・フィールド
FILE は FROMFILE.FILE というように表現して
使用する。
一体これは何のために必要なのだろうか?
QUALIFY とは資格を与えるという意味である。
例えば米国のPGAゴルフ・ツアーでも毎年春に
出場資格を得るための予選会があって
それに通過したプレーヤーだけが今年一年の
出場できるという制度がある。
この資格のことを QUALIFY と呼んでいる。

ここでは資格を与えるというより区別すると
いう意味としてQUALIFYを理解したほうがよいかも知れない。
[例1] 単純なDSの例
0001.00 H DFTNAME(TESTDS1) DATEDIT(*YMD/) BNDDIR('QC2LE')
0002.00 F********** データ構造定義の使い方その 1 ******************************
0003.00 F*
0004.00 F**********************************************************************
0005.00
0005.01 D CMR S 80 DIM(3) CTDATA PERRCD(1)
0005.02 D CMDSTR S 128A
0005.03
0006.00 D FROMFIL DS
0007.00 D FILE1 1 10 ファイル名
0008.00 D FILLIB1 11 20 ライブラリー
0009.00
0010.00 D TOFILE DS
0011.00 D FILE2 1 10 ファイル名
0012.00 D FILLIB2 11 20 ライブラリー
0013.00
0013.01 C CMD(1) CAT FILLIB1:0 CMDSTR
0013.02 C CMDSTR CAT '/':0 CMDSTR
0013.03 C CMDSTR CAT FILE1:0 CMDSTR
0013.04 C CMDSTR CAT CMR(2):0 CMDSTR
0013.05 C CMDSTR CAT FILLIB2:0 CMDSTR
0013.06 C CMDSTR CAT '/':0 CMDSTR
0013.07 C CMDSTR CAT FILE2:0 CMDSTR
0013.09 C*----------------------------------------------------+
0013.10 C CALL 'QCMDEXC'
0013.11 C PARM CMDSTR
0013.12 C PARM 80 CMDLEN 15 5
0013.13 C*----------------------------------------------------+
0014.00 ** CMR
0015.00 CPYF FROMFILE(
0016.00 ) TOFILE(
0017.00 ) MBROPT(*REPLACE)
[解説]
これは CPYF FROMFILE(FILLIB1/FILE1) TOFILE(FILLIB2/FILE2) MBROPT(*REPLACE)
を実行するだけのRPGであるが演算命令を見ただけでは何をしようとしているのか
頭の中で文字列を組み立てなければわからない。
またDSにQUALIFIEDの定義がないのでFILE1やFILE2というフィールド名を見ても
どのDSに定義されていたフィールドであるのか確認する必要がある。
[例2] QUALIFIED を与えたDSの例
0001.00 H DFTNAME(TESTDS2) DATEDIT(*YMD/) BNDDIR('QC2LE')
0002.00 F********** データ構造定義の使い方その 2 ******************************
0003.00 F*
0004.00 F**********************************************************************
0005.00
0006.00 D CMD S 128A
0007.00
0008.00 D FROMFIL DS QUALIFIED
0009.00 D FILE 1 10 ファイル名
0010.00 D FILLIB 11 20 ライブラリー
0011.00
0012.00 D TOFILE DS QUALIFIED
0013.00 D FILE 1 10 ファイル名
0014.00 D FILLIB 11 20 ライブラリー
0015.00
0016.00 /FREE
0017.00 CMD = ' CPYF FROMFILE(' + %TRIMR(FROMFIL.FILLIB) + '/' +
0018.00 %TRIMR(FROMFIL.FILE) + ') TOFILE(' +
0019.00 %TRIMR(TOFILE.FILLIB) + '/' + %TRIMR(TOFILE.FILE) +
0020.00 ') MBROPT(*REPLACE)';
0021.00 SYSTEM(CMD);
0022.00 /END-FREE
[解説]
QUALIFIED をDSに定義するとDSのQUALIFIED で定義されたサブ・フィールドは
FROMFIL.FILE のように表示されるているので見ただけでどのDSの
サブ・フィールドであるのかを直ちに理解することができるので
フィールドの定義を思い出す必要はない。
つまり読んでいてストレスがないのだ。
同じ名前のサブ・フィルドを重複して定義しても
コンパイル・エラーになることもない。
ただし QUALIFEDで定義するとフィールド表記が長くなるので
これまでの固定項目の記述ではフィールド名が演算項目のむ中に
収まりきれないようになる。
従ってこの場合でもフリー・フォーマットで記述したほうがよいというより
ほとんどフリー・フォーマットでしか記述できなくなってしまう。
QUALIFIEDを使うこの例でもやはりフリー・フォーマットにより
記述が自然なのである。
ちなみにDSもQUALIFIEDを定義したほうが後でRPGソースを見ても
圧倒的にわかりやすくなるのは間違いない。
筆者はDSはもうすべてQUALIFIED を使って定義している。
今ではQUALIFIEDを定義していないDSは考えられない。
今ではDS定義は考えることなくQUELIFIED として定義している。
逆にQUALIFIEDを使うようになってからフリー・フォーマットを
使う機会が多くなったのかも知れない。
RPGの進化はこのようにIBMによってかなり考えぬかれて工夫して進化しているといえる。
