RPG

272. DS データを配列として定義するには ?

文字や数字を混在させた配列を作成したいとする。
文字や数字を混在させたものを定義するのは DS 定義になることは
わかるが、それでは DS を配列として定義するには
どのように定義すればよいのだろう ?

RPG 解説書を見ても解説文が長々と続いているが一向にその方法や
サンプル・ソースが示されていない。
そこでいろいろと試してみて成功した結果を紹介する。

【 サンプル: TESTDSR 】
        
0001.00 H DFTNAME(TESTDSR) DATEDIT(*YMD/) BNDDIR('QC2LE')                      
0002.00 F********** DS 配列のテスト *******************************************
0003.00 F*                                                                     
0004.00 F**********************************************************************
0005.00                                                                        
0006.00  * OVLR 配列の項目                                                     
0007.00 D OVLRCD          DS                  QUALIFIED                        
0008.00 D  RECORD                 1     10A                                    
0009.00 D  LIN                   11     13S 0                                  
0010.00                                                                        
0011.00  * OVLRCD の 256 個の配列                                              
0012.00 D OVLR            S                   LIKE(OVLRCD)                     
0013.00 D                                     DIM(256)                         
0014.00  * 配列の要素                                                          
0015.00 D OVL             S              3S 0 INZ(0)                           
0016.00                                                                        
0017.00  /FREE                                                                 
0018.00     OVLRCD.RECORD = 'SFLREC    ';                                      
0019.00     OVLRCD.LIN    = 5;                                                 
0020.00     OVL = +1;                                                          
0014.00  * 配列の要素                                                          
0015.00 D OVL             S              3S 0 INZ(0)                           
0016.00                                                                        
0017.00  /FREE                                                                 
0018.00     OVLRCD.RECORD = 'SFLREC    ';                                      
0019.00     OVLRCD.LIN    = 5;                                                 
0020.00     OVL = +1;                                                          
0021.00     OVLR(OVL) = OVLRCD;                                                
0022.00  /END-FREE                                                             
0023.00 C                   Z-ADD     1             N                 4 0      
0024.00 C     OVLRCD        LOOKUP    OVLR(N)                                50
0025.00 C     *IN50         IFEQ      *ON                                      
0026.00 C     '* FOUND'     DSPLY                   ANS               1        
0027.00 C                   ELSE                                               
0028.00 C     '* NOT FOUND' DSPLY                   ANS                        
0029.00 C                   ENDIF                                              
0030.00 C                   SETON                                        LR    
0031.00 C                   RETURN
【解説】

見てのとおり、

 * OVLR 配列の項目                                                     
0007.00 D OVLRCD          DS                  QUALIFIED                        
0008.00 D  RECORD                 1     10A                                    
0009.00 D  LIN                   11     13S 0 

としてレコード名 (10A) + 行数 (3,0) からなる DS: OVLRCD
配列の要素となる予定の基本項目である。
次に、DS の配列として OVLR

0011.00  * OVLRCD の 256 個の配列                                              
0012.00 D OVLR            S                   LIKE(OVLRCD)                     
0013.00 D                                     DIM(256)

として定義している。
ここで注目して欲しいのは LIKE によって OVLRCD という DS を参照しているが
OVLR は DS としては定義されておらず、LIKEDS も使っていない。
LIKE によって型を参照している。
OVLR を例えば

0011.00  * OVLRCD の 256 個の配列                                              
0012.00 D OVLR            DS                  LIKEDS(OVLRCD)                     
0013.00 D                                     DIM(256)

として定義してもコンパイルは成功するが OVLR は配列とは見なされない。
従って LOOKUP%LOOKUP を使って OVLR を参照するとそこで初めて
コンパイル・エラーとなってしまう。

この方法で DS も配列にして定義することができれば
DS の使い方が広くなるのではないだろうか ?
お役に立てれば幸いである。