CL

141. CLPでパラメータを検査するには

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を両方とも保守しなければならない。
修正が必要になった場合は片方を修正するのを忘れるとバグを発生させる要因となってしまう。
保守するプログラムはできるだけ少なくしたほうが障害の発生要因を少なくすることができる。
製品の保守となるとそれほどの気の使いようが必要となる。