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 によってコンパイルしなければならない。