2つ以上のパラメータからなる複合パラメータの取得の方法について
紹介する。
複合パラメータとは例えば次のようなパラメータである。
プリンターの開始1 (TESTCMD1) 選択項目を入力して,実行キーを押してください。 ページ・サイズ : 用紙 . . . . . . . . . . . . *SPLF *SPLF, *A3, *A4, *A5, *A6... 用紙方向 . . . . . . . . . . *LANDSCAPE, *PORTRAIT
このような例はOS400のユーティリティでよく見かける。
SEU 開始 (STRSEU) 選択項目を入力して,実行キーを押してください。 ソース・ファイル . . . . . . . > QCLSRC 名前 , *PRV ライブラリー . . . . . . . . > R610SRC 名前 , *LIBL, *CURLIB, *PRV ソース・メンバー . . . . . . . > TESTCMD1CL 名前 , *PRV, *SELECT ソース仕様タイプ . . . . . . . > CLP 名前 , *SAME, BAS, BASP... オプション . . . . . . . . . . *BLANK *BLANK, ' ', 2, 5, 6 テキスト ' 記述 ' . . . . . . . > ' プリンターの開始 1'
上記の
ソース・ファイル . . . . . . . > QCLSRC 名前 , *PRV ライブラリー . . . . . . . > R610SRC 名前 , *LIBL, *CURLIB, *PRV
の部分も複合パラメータとして定義されている。
さて先に紹介した複合パラメータのソースは次のようなものである。
0001.00 CMD PROMPT(' プリンターの開始1 ') 0002.00 PARM KWD(PAGESIZE) TYPE(PAGESIZE) DFT(*SPLF) + 0003.00 SNGVAL((*SPLF)) CHOICE(*NONE) + 0004.00 PROMPT(' ページ・サイズ ') 0005.00 PAGESIZE: ELEM TYPE(*CHAR) LEN(7) RSTD(*YES) VALUES(*A3 *A4 + 0006.00 *A5 *A6 *B3 *B4 *B5 *LETTER *LEGAL) + 0007.00 PROMPT(' 用紙 ') 0008.00 ELEM TYPE(*CHAR) LEN(10) RSTD(*YES) + 0009.00 DFT(*LANDSCAPE) VALUES(*LANDSCAPE + 0010.00 *PORTRAIT) PROMPT(' 用紙方向 ')
もう一度このパラメータの実行を見てみよう。
プリンターの開始1 (TESTCMD1) 選択項目を入力して,実行キーを押してください。 ページ・サイズ : 用紙 . . . . . . . . . . . . *SPLF *SPLF, *A3, *A4, *A5, *A6... 用紙方向 . . . . . . . . . . *LANDSCAPE, *PORTRAIT
ページ・サイズという複合のパラメータは *SPLF のように最初のひとつだけ入力される
場合もあるし
ページ・サイズ : 用紙 . . . . . . . . . . . . *A4 *SPLF, *A3, *A4, *A5, *A6.. 用紙方向 . . . . . . . . . . *PORTRAIT *LANDSCAPE, *PORTRAIT
のように *A4
と *PORTRAIT
の2つのパラメータを入力する場合がある。
「用紙」パラメータは
0005.00 PAGESIZE: ELEM TYPE(*CHAR) LEN(7) RSTD(*YES) VALUES(*A3 *A4 + 0006.00 *A5 *A6 *B3 *B4 *B5 *LETTER *LEGAL) + 0007.00 PROMPT(' 用紙 ')
として 10バイトで定義されている。
従ってこのコマンドを処理するプログラム (多くの場合はCLP) に 10 + 7 = 17バイトとして
値が渡るのではなく
のようにして先頭にパラメータ数を示す 2バイトが付加された形式でプログラムに渡される。
つまり常に同じ長さのパラメータとして渡されるのではなく、
エンド・ユーザーが入力したパラメータ数に応じて動的に変化する。
従ってプログラムでは最初の 2バイト(=2進数)を読んで判断する必要がある。
この判断を加えたCLPをサンプルとして次に示す。
0001.00 PGM PARM(&PAGESIZEP) 0002.00 /*-------------------------------------------------------------------*/ 0003.00 /* TESTCMD1 : プリンターの開始 1 */ 0004.00 /*-------------------------------------------------------------------*/ 0005.00 DCL VAR(&PAGESIZEP) TYPE(*CHAR) LEN(19) 0006.00 DCL VAR(&PAGESIZE) TYPE(*CHAR) LEN(17) 0007.00 DCL VAR(&FORM) TYPE(*CHAR) LEN(7) 0008.00 DCL VAR(&DIRECTION) TYPE(*CHAR) LEN(10) 0009.00 DCL VAR(&PRMSU) TYPE(*CHAR) LEN(2) /* 2 進数 */ 0010.00 0011.00 /*( PAGESIZE パラメータの取得 )*/ 0012.00 CHGVAR VAR(&PRMSU) VALUE(%SST(&PAGESIZEP 1 2)) 0013.00 IF COND(%BIN(&PRMSU) *EQ 1) THEN(DO) 0014.00 CHGVAR VAR(&FORM) VALUE(%SST(&PAGESIZEP 3 7)) 0015.00 ENDDO 0016.00 ELSE CMD(DO) 0017.00 CHGVAR VAR(&FORM) VALUE(%SST(&PAGESIZEP 3 7)) 0018.00 CHGVAR VAR(&DIRECTION) VALUE(%SST(&PAGESIZEP 10 10)) 0019.00 ENDDO 0020.00 CHGVAR VAR(&PAGESIZE) VALUE(&FORM *CAT &DIRECTION) 0021.00 0022.00 SNDPGMMSG MSG('PAGESIZE = ' *CAT &PAGESIZE) + 0023.00 MSGTYPE(*DIAG) 0024.00 ENDPGM
受取りパラメータの長さは 7 + 10 = 17バイトに先頭のパラメータ数の 2バイトを加えて
17 + 2 = 19バイトとして
DCL VAR(&PAGESIZEP) TYPE(*CHAR) LEN(19)
上記のように定義している。
求めたいのは
DCL VAR(&FORM) TYPE(*CHAR) LEN(7) に
DCL VAR(&DIRECTION) TYPE(*CHAR) LEN(10)を加えた
DCL VAR(&PAGESIZE) TYPE(*CHAR) LEN(17)
という 17バイトである。
最初に
0012.00 CHGVAR VAR(&PRMSU) VALUE(%SST(&PAGESIZEP 1 2))
上記で先頭の 2バイトのパラメータ数を取得して
パラメータ数が 1 か 2によって処理を行う。
0013.00 IF COND(%BIN(&PRMSU) *EQ 1) THEN(DO) 0014.00 CHGVAR VAR(&FORM) VALUE(%SST(&PAGESIZEP 3 7)) 0015.00 ENDDO 0016.00 ELSE CMD(DO) 0017.00 CHGVAR VAR(&FORM) VALUE(%SST(&PAGESIZEP 3 7)) 0018.00 CHGVAR VAR(&DIRECTION) VALUE(%SST(&PAGESIZEP 10 10)) 0019.00 ENDDO
パラメータ数を取得してから
0020.00 CHGVAR VAR(&PAGESIZE) VALUE(&FORM *CAT &DIRECTION)
を求めている。
このように複合パラメータをコマンドで定義した場合は
パラメータ数を判断して処理を分岐させる必要がある。