CLPはプログラムであるのでパラメータつきで
呼び出すことが普通であるがパラメータのいくつかを
省略して呼び出したい場合やCGIとして利用するときは
完全にパラメータなしで呼び出すことになる。
そこで呼び出されたCLP側でパラメータつきで
呼ばれたのか、またはパラメータなしで呼ばれたのかを
どのようにして判断するばよいのだろうか?
パラメータがない場合はパラメータは NULLであるとして
PGM PARM(&PRM001 &PRM002)
:
/*( バラメータの取得 )*/
IF COND(&PRM001 *EQ &NULL) THEN(DO)
SNDPGMMSG MSG(' パラメータなし ') MSGTYPE(*DIAG)
ENDDO
ELSE CMD(DO)
SNDPGMMSG MSG(' パラメータあり ') MSGTYPE(*DIAG)
ENDDO
のように判断したのでは
CALL で渡されたパラメーターが必要なパラメーターと一致していない CALL コマンドでエラーが見つかった。
と、たちまちのうちにエラーとなってしまう。
パラメータ &PRM001, &PRM002 は渡されていないので
比較のために使用しようとするだけでエラーになってしまうのである。
そこで API: CEETSTA を使ってパラメータを検査する方法を紹介しよう。
[ CLP: TESTPRM2 ]
ソースはこちらから
0001.00 PGM PARM(&PRM001 &PRM002)
0002.00 /*--------------------------------------------------------------------------*/
0003.00 /* TESTPRM2 : パラメータのテスト */
0004.00 /* */
0005.00 /* 2021/10/13 作成 SRCTYPE: CLLE */
0006.00 /* */
0007.00 /* CRTBNDCL PGM(TEST.COM/TESTPRM2) SRCFILE(R610SRC/QCLSRC) DFTACTGRP(*NO) */
0008.00 /* ACTGRP(*NEW) AUT(*ALL) DBGVIEW(*SOURCE) */
0009.00 /* */
0010.00 /*--------------------------------------------------------------------------*/
0011.00 DCL VAR(&PRM001) TYPE(*CHAR) LEN(10)
0012.00 DCL VAR(&PRM002_P) TYPE(*PTR)
0013.00 DCL VAR(&PRM002) TYPE(*CHAR) STG(*BASED) LEN(10) +
0014.00 BASPTR(&PRM002_P)
0015.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132)
0016.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7)
0017.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10)
0018.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
0019.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132)
0020.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1)
0021.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)
0022.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +
0023.00 VALUE('*ESCAPE ')
0024.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) +
0025.00 VALUE(X'000074') /* 2 進数 */
0026.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) +
0027.00 VALUE(X'00000000')
0028.00 DCL VAR(&NULL) TYPE(*CHAR) LEN(10) +
0029.00 VALUE(X'00000000000000000000')
0030.00 /*( CEERSTA の変数 )*/
0031.00 DCL VAR(&PARMS) TYPE(*INT) LEN(4)
0032.00 DCL VAR(&ARGNUM) TYPE(*INT) LEN(4) VALUE(1)
0033.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
0034.00
0035.00 /*( 環境の取得 )*/
0036.00 RTVJOBA TYPE(&TYPE)
0037.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */
0038.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ')
0039.00 ENDDO /* バッチ */
0040.00 ELSE CMD(DO) /* 対話式 */
0041.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ')
0042.00 ENDDO /* 対話式 */
0043.00
0044.00 /*( 入力パラメータの検査 )*/
0045.00 CALLPRC PRC(CEETSTA) PARM((&PARMS) (&ARGNUM))
0046.00 IF COND(&PARMS *EQ 1) THEN(DO)
0047.00 /* パラメータが存在する */
0048.00 SNDPGMMSG MSG(' パラメータあり ') MSGTYPE(*DIAG)
0049.00 ENDDO
0050.00 ELSE CMD(DO)
0051.00 /* パラメータが存在しない = CGI である */
0052.00 SNDPGMMSG MSG(' パラメータなし ') MSGTYPE(*DIAG)
0053.00 ENDDO
0054.00
0055.00 RETURN
0056.00
0057.00 APIERR:
0058.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7))
0059.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))
0060.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ')
0061.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ')
0062.00 GOTO SNDMSG
0063.00
0064.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +
0065.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +
0066.00 MSGFLIB(&MSGFLIB)
0067.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO)
0068.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +
0069.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)
0070.00 ENDDO
0071.00 ELSE CMD(DO)
0072.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
0073.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +
0074.00 MSGTYPE(&MSGTYPE)
0075.00 ENDDO
0076.00 ENDPGM
[解説]
API: CEETSTA の戻り値 &PARMS にパラメータの数が戻されるので
この値が 1以上であればパラメータがあると判断することができる。
このAPIを使うためにはCLPはソース・タイプは CLLE としてILE-CLPとして定義しておいて
コンパイルも CRTBNDCL によってコンパイルしなければならない。
