RPGでは %PARMSという組込み関数で受け取ったパラメータの数を
検査することができるが CLP でも %PARMS() という組込み関数があって
やはり受け取ったパラメータの数をチェックすることができる。
ただしi5/OS Ver7.4以上にの場合に限られる。
それ以前のOSバージョンでもパラメータを検査する方法はないのだろうか?
そこでここに紹介するのは i5/OS Ver6.1でも使えるパラメータの検査の方法である。
[ CLP: TESTPRM3CL ]
ソースはこちらから
0001.00 PGM PARM(&FILE) 0002.00 /*-------------------------------------------------------------------*/ 0003.00 /* TESTPRM2CL : パラメータのテスト */ 0004.00 /* */ 0005.00 /* 2021/05/26 作成 */ 0006.00 /*-------------------------------------------------------------------*/ 0007.00 DCL VAR(&FILE) TYPE(*CHAR) LEN(10) 0008.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0009.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0010.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) 0011.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) + 0012.00 VALUE('*ESCAPE ') 0013.00 DCL VAR(&PARMS) TYPE(*INT) LEN(4) 0014.00 DCL VAR(&ARGNUM) TYPE(*INT) LEN(4) VALUE(1) 0015.00 0016.00 CALLPRC PRC(CEETSTA) PARM((&PARMS) (&ARGNUM)) 0017.00 IF COND(&PARMS *EQ 1) THEN(DO) 0018.00 /* パラメータが存在する */ 0019.00 ENDDO 0020.00 SNDPGMMSG MSG(' バラメータはありません。 ') + 0021.00 MSGTYPE(*DIAG) 0022.00 RETURN 0023.00 ENDPGM
[コンパイル]
CRTBNDCL PGM(OBJLIB/TESTPRM3CL) SRCFILE(MYSRCLIB/QCLSRC) DFTACTGRP(*NO) ACTGRP(*NEW) AUT(*ALL)
[解説]
SEU のソース・タイプは CLP ではなく CLLE で作成する。
使用しているAPIはあまり見慣れない
0016.00 CALLPRC PRC(CEETSTA) PARM((&PARMS) (&ARGNUM))
である。
これは &ARGNUM = 1番目のパラメータが存在している場合は &PARMS は 1を戻し
存在しない場合は 0 を戻す。
これによってパラメータが入力されたのかどうかを判定することができる。
例えば
コマンド入力
> call test.com/testprm3cl
バラメータはありません。
という結果となる。
弊社がCLPのパラメータの判定にこだわっている理由はCLPをCGIとしても通常のコマンド処理のPGM
としても使いたいからである。
CGIとして使う場合は別のCLPとしてしまえばよい話であるが、それでは
2つのCLPを両方とも保守しなければならない。
修正が必要になった場合は片方を修正するのを忘れるとバグを発生させる要因となってしまう。
保守するプログラムはできるだけ少なくしたほうが障害の発生要因を少なくすることができる。
製品の保守となるとそれほどの気の使いようが必要となる。