文字や数字を混在させた配列を作成したいとする。
文字や数字を混在させたものを定義するのは 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 の使い方が広くなるのではないだろうか ?
お役に立てれば幸いである。
