RPG

263. マニュアルにも載っていない二重構造化 DSの使い方

ここで紹介するのは IBM マニュアルにも掲載のない
特殊な DS (DataStructure)の使い方を説明する。
ILE-RPG の DS(データ構造定義)は C言語の構造体 typedef に良く似ているのだが
C言語では typedef をまた上位の typedef にまとめて定義することができる。
ILE-RPG も DS定義をいくつか上位に DS定義にまとめて定義する、と二重に構造化
して使うことができないものか ? と考えることができるのだが
結論から言うと何とできた。

つまり DS定義を集めて新しい別の DS定義と定義することができるのである。

【SAMPLE: TESTDS2】
0001.00 H DFTNAME(TESTDS2) DATEDIT(*YMD/) BNDDIR('QC2LE')                       
0002.00 F**********  二重構造化された DATA STRUCRURE の使い方 ***************** 
0003.00 F*                                                                      
0004.00 F********************************************************************** 
0005.00                                                                         
0006.00 D FILEDS          DS                  QUALIFIED                         
0007.00 D  FILE                   1     10                                      
0008.00 D  FILLIB                11     20                                      
0009.00                                                                         
0010.00 D PGMDS           DS                  QUALIFIED                         
0011.00 D  PGM                    1     10                                      
0012.00 D  PGMLIB                11     20                                      
0013.00                                                                         
0014.00 D LIBDS           DS                  QUALIFIED                         
0015.00 D  FILES                              LIKEDS(FILEDS)                    
0016.00 D  PGMDS                              LIKEDS(PGMDS)                     
0017.00                                                                         
0018.00 C                   EVAL      LIBDS.FILES.FILE = 'SHOHIN'               
0019.00 C                   EVAL      LIBDS.PGMDS.PGM = 'PGM001'                
0020.00 C                   SETON                                        LR     
0021.00 C                   RETURN
【解説】

FILEDSPGMDS という二つの DS構造体がある。

0006.00 D FILEDS          DS                  QUALIFIED                         
0007.00 D  FILE                   1     10                                      
0008.00 D  FILLIB                11     20 

0010.00 D PGMDS           DS                  QUALIFIED                         
0011.00 D  PGM                    1     10                                      
0012.00 D  PGMLIB                11     20 

これらをまとめると

0014.00 D LIBDS           DS                  QUALIFIED
0015.00 D  FILE                   1     10
0016.00 D  FILLIB                11     20
0017.00 D  PGM                   21     30
0018.00 D  PGMLIB                31     40

とするのではなく構造体の名前を使って

0014.00 D LIBDS           DS                  QUALIFIED                         
0015.00 D  FILES                              LIKEDS(FILEDS)                    
0016.00 D  PGMDS                              LIKEDS(PGMDS)

とのように再定義することができる。
これらは QUALIFIED によって定義されているので

0018.00 C                   EVAL      LIBDS.FILES.FILE = 'SHOHIN'               
0019.00 C                   EVAL      LIBDS.PGMDS.PGM = 'PGM001'

のように DSの識別子を使って宣言しなければならないが
構造化されているだけに、見やすくわかりやすいものとなる。

2次元だけでなく 3次元や 4次元の構造体定義も理論的には
できるのではないかと思われる。
読者のほうでも是非試してみて欲しい。