CL

127. テンプレート・サンプルCLP: AA2_SAMPLE

すべてのCLPのテンプレートとなるサンプル・ソース AA1_SAMPLE を
以前に公開したがこれはその続きのなるCLPテンプレートのソースであり
AA1_SAMPLE は APIを呼び出して実行する用途に適しているのに対して
今回の AA2_SAMPLE はプログラムを呼び出すパターンである。
プログラムを呼び出して処理するだけなら CALL 命令だけで
済みそうに思えるのだが特別な処理を工夫しているので
その部分を注意してご覧頂きたい。

[AA2_SAMPLE:テンプレート・サンプルCLP]

ソースはこちらから

0001.00              PGM                                                         
0002.00 /*-------------------------------------------------------------------*/  
0003.00 /*   AA2_SAMPLE :  テンプレート・サンプル CLP (PGM CALL)             */  
0004.00 /*                                                                   */  
0005.00 /*   2019/03/18  作成                                                */  
0006.00 /*-------------------------------------------------------------------*/  
0007.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                   
0008.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                   
0009.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)                   
0010.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)                
0011.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)                
0012.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                    
0013.00              DCL        VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)                 
0014.00              DCL        VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +              
0015.00                           VALUE('*ESCAPE   ')                            
0016.00              DCL        VAR(&ERR) TYPE(*CHAR) LEN(1)                     
0017.00              DCL        VAR(&NULL4) TYPE(*CHAR) LEN(4) +                 
0018.00                           VALUE(X'00000000')                             
0019.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))          
0020.00                                                                          
0021.00 /*( 環境の取得 )*/                                                       
0022.00              RTVJOBA    TYPE(&TYPE)                                      
0023.00              IF         COND(&TYPE *EQ '0') THEN(DO) /*  バッチ  */      
0024.00              CHGVAR     VAR(&TOPGMQ) VALUE('*SYSOPR   ')               
0025.00              ENDDO      /*  バッチ  */                                 
0026.00              ELSE       CMD(DO) /*  対話式  */                         
0027.00              CHGVAR     VAR(&TOPGMQ) VALUE('*TOPGMQ   ')               
0028.00              ENDDO      /*  対話式  */                                 
0029.00                                                                        
0030.00 /*( 入力パラメータの検査 )*/                                           
0031.00                                                                        
0032.00 /*( プログラムの実行 )*/                                               
0033.00              CALL       PGM(MYPGM) PARM(&ERR &MSG)                     
0034.00              IF         COND(&ERR *EQ ' ') THEN(DO)                    
0035.00              CHGVAR     VAR(&MSGTYPE) VALUE('*DIAG     ')              
0036.00              ENDDO                                                     
0037.00              IF         COND(&MSG *NE ' ') THEN(DO)                    
0038.00              GOTO       SNDMSG                                         
0039.00              ENDDO  
0040.00              RETURN                                                  
0041.00                                                                      
0042.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +          
0043.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +
0044.00                           MSGFLIB(&MSGFLIB)                          
0045.00  SNDMSG:     IF         COND(&MSGID *EQ ' ') THEN(DO)                
0046.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +  
0047.00                           TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)          
0048.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                  
0049.00              ENDDO                                                   
0050.00              ELSE       CMD(DO)                                      
0051.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +         
0052.00                           MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +          
0053.00                           MSGTYPE(&MSGTYPE)                          
0054.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                  
0055.00              ENDDO                                                   
0056.00              ENDPGM


                                                                                        

[解説]

特徴的であるのは

0032.00 /*( プログラムの実行 )*/                                               
0033.00              CALL       PGM(MYPGM) PARM(&ERR &MSG)                     
0034.00              IF         COND(&ERR *EQ ' ') THEN(DO)                    
0035.00              CHGVAR     VAR(&MSGTYPE) VALUE('*DIAG     ')              
0036.00              ENDDO                                                     
0037.00              IF         COND(&MSG *NE ' ') THEN(DO)                    
0038.00              GOTO       SNDMSG                                         
0039.00              ENDDO 

の部分でありプログラムはパラメータとして &ERR と &MSG を返すようにできている。
プログラム MYPGM でエラーがあった場合は &ERR に文字「E」を入れて
&MSG にエラーメッセージを戻すようにしている。
「完了しました」とような報告だけのメッセージの場合は
&MSG にはメッセージが入るが &ERR はブランクである。
このときメッセージ・タイプは初期で

0014.00              DCL        VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +              
0015.00                           VALUE('*ESCAPE   ')

としてエスケープ・メッセージとして定義されているので

0035.00              CHGVAR     VAR(&MSGTYPE) VALUE('*DIAG     ')

で変更してから

0037.00              IF         COND(&MSG *NE ' ') THEN(DO)                    
0038.00              GOTO       SNDMSG                                         
0039.00              ENDDO 

によってメッセージを出力するようにしている。