CL

146. パラメータの有無を検査するCLP

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