CHGLIBL コマンドなどでも良く知られているように複数のパラメータを
リスト形式で受け取りたいことがある。
MAX バラメータを変更することによってこのことは可能となる。
PARM KWD(GRP) TYPE(*GENERIC) LEN(10) +
SPCVAL((*ALL)) MAX(30) PROMPT(' パネル GRP')
は長さ10桁の項目を最大 30 項目入力可能にしている。
コマンドでのリスト・パラメータの指定はこのようにやさしいが、
その値を受け取る場合に考慮が必要となる。
上記の値は次の形式でコマンド処理プログラムに渡される。
リスト・パラメータの長さ = 1項目の長さ * 項目数 + 2 バイトで処理プログラムに渡される。
最初の 2バイトは入力された項目の数が2進数で保管されている。
項目の数(2バイト) 1番目の項目 2番目の項目 .... N 番目の項目
という構造になっている。
このパラメータの処理をする例を次に示す。
PGM PARM(&GRPPRM)
DCL VAR(&GRPPRM) TYPE(*CHAR) LEN(302)
DCL VAR(&STR) TYPE(*DEC) LEN(8 0) VALUE(3)
DCL VAR(&PRMSU) TYPE(*CHAR) LEN(2) /* 2 進数 */
DCL VAR(&DEC08) TYPE(*DEC) LEN(8 0)
DCL VAR(&N) TYPE(*DEC) LEN(3 0) VALUE(1)
DCL VAR(&GRP) TYPE(*CHAR) LEN(10)
CHGVAR VAR(&PRMSU) VALUE(%SST(&GRPPRM 01 2))
CHGVAR VAR(&DEC08) VALUE(%BIN(&PRMSU))
LOOP:
CHGVAR VAR(&GRP) VALUE(%SST(&GRPPRM &STR 10))
IF COND(&N < &DEC08) THEN(DO)
CHGVAR VAR(&N) VALUE(&N + 1)
CHGVAR VAR(&STR) VALUE(&STR + 10)
GOTO LOOP
ENDDO
【 解説 】
最初に
CHGVAR VAR(&PRMSU) VALUE(%SST(&GRPPRM 01 2))
によって項目数を取得して
CHGVAR VAR(&DEC08) VALUE(%BIN(&PRMSU))
によって10進数に変換している。
&Nは
DCL VAR(&N) TYPE(*DEC) LEN(3 0) VALUE(1)
で定義されているように 1 から始まって &DEC08 の分だけ LOOP して値 &GRP を取得している。
