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 である。
