データ・ストラクチャー(データ構造定義)で
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によってかなり考えぬかれて工夫して進化しているといえる。