QUALキー・ワードについて説明しよう。
PARMで説明したようにプログラムに渡すパラメータはあくまでも PARM として
記載された部分である。
その PARM の部分を分割して入力しやすくしているのが、ここで紹介する
QUAL文である。
[例: QUALのサンプル: TESTQAL ]
QUAL のテスト (TESTQAL) 選択項目を入力して,実行キーを押してください。 ソース・ファイル . . . . . . . QRPGLESRC 名前 , *PRV ライブラリー . . . . . . . . QTRSRC 名前 , *LIBL, *CURLIB, *PRV ソース・メンバー . . . . . . . PGM201 名前 , *PRV
[解説]
これはわかりやすいように STRSEU コマンドの実行に似せたコマンドである。
ソース・ファイルとライブラリーに分割されている部分が QUAL による記述である。
[ TESTQAL :コマンド・ソース ]
0001.00 CMD PROMPT('QUAL のテスト ') 0002.00 PARM KWD(SRCFILE) TYPE(SRCFILE) + 0003.00 PROMPT(' ソース・ファイル ') 0004.00 SRCFILE: QUAL TYPE(*NAME) LEN(10) DFT(*PRV) SPCVAL((*PRV)) 0005.00 QUAL TYPE(*NAME) LEN(10) SPCVAL((*LIBL) (*CURLIB) + 0006.00 (*PRV)) PROMPT(' ライブラリー ') 0007.00 PARM KWD(SRCMBR) TYPE(*NAME) LEN(10) DFT(*PRV) + 0008.00 SPCVAL((*PRV)) + 0009.00 PROMPT(' ソース・メンバー ')
[解説]
パラメータ : SRCFILE PROMPT(‘ ソース・ファイル ‘) =
SRCFILE: QUAL TYPE(*NAME) LEN(10) QUAL TYPE(*NAME) LEN(10) PROMPT(' ライブラリー ')
であり PARM SRCFILE は2つの QUAL文から成り立っていることに注意して欲しい。
従ってこのコマンドは
0001.00 CMD PROMPT('QUAL のテスト ') 0002.00 PARM KWD(SRCFILE) TYPE(SRCFILE) + 0003.00 PROMPT(' ソース・ファイル ') 0007.00 PARM KWD(SRCMBR) TYPE(*NAME) LEN(10) DFT(*PRV) + 0008.00 SPCVAL((*PRV)) + 0009.00 PROMPT(' ソース・メンバー ') 0004.00 SRCFILE: QUAL TYPE(*NAME) LEN(10) DFT(*PRV) SPCVAL((*PRV)) 0005.00 QUAL TYPE(*NAME) LEN(10) SPCVAL((*LIBL) (*CURLIB) + 0006.00 (*PRV)) PROMPT(' ライブラリー ')
のように記述しても構わない。
PARM SRCFILE PROMPT(‘ ソース・ファイル ‘) は SRCFILE として定義されており
SRCFILE の定義は
0004.00 SRCFILE: QUAL TYPE(*NAME) LEN(10) DFT(*PRV) SPCVAL((*PRV)) 0005.00 QUAL TYPE(*NAME) LEN(10) SPCVAL((*LIBL) (*CURLIB) + 0006.00 (*PRV)) PROMPT(' ライブラリー ')
として後述されていることになる。
しかしこの書き方では QUALの構成が多くなるは非常にわかりにくくなるので
やはり PARM に続けて QUALを記述することが望ましい。
ところでなぜ QUALとして分割して表現するのかというとライブラリーに所属している
オブジェクトをわかりやすく表現するためである。
IBM のユーティリティでも QUALは非常に多く使われている。
但し上記でわかるように QUALの変数のタイプは *NAME に限られている。
理由は不明であるが *CHAR や *DEC も QUALに使えないのはやや不便である。
[ QUALを受取るCLP : TESTQALCL ]
0001.00 PGM PARM(&SRCFILLIB &SRCMBR) 0002.00 /*-------------------------------------------------------------------*/ 0003.00 /* TESTQALCL : QUAL を受取るサンプル CLP */ 0004.00 /* */ 0005.00 /* 2019/12/25 作成 */ 0006.00 /*-------------------------------------------------------------------*/ 0007.00 DCL VAR(&SRCFILLIB) TYPE(*CHAR) LEN(20) 0008.00 DCL VAR(&SRCF) TYPE(*CHAR) LEN(10) 0009.00 DCL VAR(&SRCLIB) TYPE(*CHAR) LEN(10) 0010.00 DCL VAR(&SRCMBR) TYPE(*CHAR) LEN(10) 0011.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0012.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0013.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0014.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) 0015.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0016.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0017.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) 0018.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) + 0019.00 VALUE('*ESCAPE ') 0020.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) + 0021.00 VALUE(X'000074') /* 2 進数 */ 0022.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) + 0023.00 VALUE(X'00000000') 0024.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0025.00 0026.00 /*( 環境の取得 )*/ 0027.00 RTVJOBA TYPE(&TYPE) 0028.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */ 0029.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ') 0030.00 ENDDO /* バッチ */ 0031.00 ELSE CMD(DO) /* 対話式 */ 0032.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ') 0033.00 ENDDO /* 対話式 */ 0034.00 0035.00 /*( パラメータの取得 )*/ 0036.00 CHGVAR VAR(&SRCF) VALUE(%SST(&SRCFILLIB 01 10)) 0037.00 CHGVAR VAR(&SRCLIB) VALUE(%SST(&SRCFILLIB 11 10)) 0038.00 0039.00 /*( プログラムの実行 )*/ 0040.00 STRSEU SRCFILE(&SRCLIB/&SRCF) SRCMBR(&SRCMBR) 0041.00 RETURN 0042.00 0043.00 APIERR: 0044.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7)) 0045.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100)) 0046.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ') 0047.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ') 0048.00 GOTO SNDMSG 0049.00 0050.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) + 0051.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 0052.00 MSGFLIB(&MSGFLIB) 0053.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO) 0054.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) + 0055.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE) 0056.00 MONMSG MSGID(CPF2400) EXEC(RETURN) 0057.00 ENDDO 0058.00 ELSE CMD(DO) 0059.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 0060.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) + 0061.00 MSGTYPE(&MSGTYPE) 0062.00 MONMSG MSGID(CPF2400) EXEC(RETURN) 0063.00 ENDDO 0064.00 ENDPGM
[解説]
PARM がプログラムに渡るパラメータであると説明したように2つの QUAL文であっても
このプログラムに渡されるパラメータはひとつのパラメータとして渡されていることに
注目してほしい。
0001.00 PGM PARM(&SRCFILLIB &SRCMBR)
の変数: &SRCFILLIB 20バイトが ふたつのQUAL文から成るひとつのパラメータである。
0007.00 DCL VAR(&SRCFILLIB) TYPE(*CHAR) LEN(20) 0008.00 DCL VAR(&SRCF) TYPE(*CHAR) LEN(10) 0009.00 DCL VAR(&SRCLIB) TYPE(*CHAR) LEN(10)
に対して
0035.00 /*( パラメータの取得 )*/ 0036.00 CHGVAR VAR(&SRCF) VALUE(%SST(&SRCFILLIB 01 10)) 0037.00 CHGVAR VAR(&SRCLIB) VALUE(%SST(&SRCFILLIB 11 10))
によって2つの変数に分割して
0039.00 /*( プログラムの実行 )*/ 0040.00 STRSEU SRCFILE(&SRCLIB/&SRCF) SRCMBR(&SRCMBR)
で使うようにしている。
QUAL で複数として記述されていてもあくまでもパラメータ部分は PARM である。