コマンド

9. リスト・パラメータを使用するには?

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