OS/400 コマンド作成講座 (2: リスト)

前回、コマンドの作り方の簡単なことはだいたい説明したと思うので、今回からはトピックを選んで解説してみたいと思います。

今回取り上げるのは「リスト」機能です。

システムコマンドでも以下の例のように複数個値を指定できるパラメータがありますね。(RSTLIB とか)
こういうのを紹介してみたいと思います。

システムコマンドの場合 "+" を入力するとリストの個数が増えるようになっていますが、以下の例もそうなっています。

今回の例では上限値が 10個なので、10個まで出てくるようになっています。

上の例のコマンドのソースです。

CRTCMD で普通に作成すれば OK です。


コマンドのソース

あらためてコマンドの全文です。

CMD PROMPT(' コマンドのサンプル (リスト)') 
PARM KWD(LIST) TYPE(*NAME) LEN(10) MAX(10) PROMPT(' 複数指定可能なオブジェクト ')

MAX(10) 以外は、以前見た CRTLIB2 コマンドの例えば"ライブラリー"パラメータと変わりませんね。
その時は MIN(1) が指定してあって入力必須項目を表していましたが、今回は MAX(10) の指定で、10個まで定義したタイプと同じパラメータが指定できる、ということを示しています。

と、いうことで至極あっさりとリストの定義はできるのですが、受け取る時に若干の処理が必要になります。

このリストはひとつの長いフィールド/パラメータとしてコマンドからプログラムに渡されます。
内容としては、最初に何個要素が入っているかを示す値 (2桁) と、定義した長さどおりの要素が個数分、最大要素数に足りない分はその後にブランクで入っています。

長さ 10 で 10個、要素のカウント分の 2桁を足して 102 桁のフィールドを定義し、受け取るようにします。

PGM        PARM(&LIST)
DCL VAR(&LIST) TYPE(*CHAR) LEN(102) 

頭 2桁の要素数を取り出します。

CHGVAR VAR(&COUNTC) VALUE(%SST(&LIST 1 2)) 

文字から数字に変更し、計算できるようにします。

CHGVAR VAR(&COUNT) VALUE(%BIN(&COUNTC))

3桁目から要素が始まりますので、要素の桁数で切り出して要素そのものを取り出します。

LOOP:       CHGVAR     VAR(&ELEMENT) VALUE(%SST(&LIST &ORDER 10))

処理を行って (今回は前回作成したコマンドを使っています) 切り出し開始位置を次の位置に進めます。
コマンドを作成しておけば、自作コマンドでもこういうところで使用できます。ライブラリーリストに入っているか、ライブラリーの指定をしておくか、は要件で選べばいいでしょう。

CRTLIB2 LIB(&ELEMENT)
CHGVAR VAR(&ORDER) VALUE(&ORDER + 10) 

要素数を計算して、最後のものなら終了/そうでなければ最初に戻って処理継続を行います。

CHGVAR VAR(&COUNT) VALUE(&COUNT - 1)
IF COND(&COUNT = 0) THEN(GOTO CMDLBL(END))
  ELSE CMD(GOTO CMDLBL(LOOP))

コマンド処理プログラム

コマンド処理プログラムの全文です。

            PGM        PARM(&LIST)                                     
            DCL        VAR(&LIST) TYPE(*CHAR) LEN(102)                 
            DCL        VAR(&ELEMENT) TYPE(*CHAR) LEN(10)               
            DCL        VAR(&COUNT) TYPE(*DEC) LEN(2 0)                 
            DCL        VAR(&COUNTC) TYPE(*CHAR) LEN(2)                 
            DCL        VAR(&ORDER) TYPE(*DEC) LEN(2 0) VALUE(3)        
            CHGVAR     VAR(&COUNTC) VALUE(%SST(&LIST 1 2))             
            CHGVAR     VAR(&COUNT) VALUE(%BIN(&COUNTC))                
LOOP:       CHGVAR     VAR(&ELEMENT) VALUE(%SST(&LIST &ORDER 10))      
            CRTLIB2    LIB(&ELEMENT)                                   
            CHGVAR     VAR(&ORDER) VALUE(&ORDER + 10)                  
            CHGVAR     VAR(&COUNT) VALUE(&COUNT - 1)                   
            IF         COND(&COUNT = 0) THEN(GOTO CMDLBL(END))         
            ELSE       CMD(GOTO CMDLBL(LOOP))                          
END:        ENDPGM                                                     

[Top Pageに戻る]

Ads by TOK2