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 を取得している。