RPG

398. データ構造定義はQUALIFIEDで

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