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