CL

128. テンプレート・サンプルCLP AA3_SAMPLE

テンプレート・サンプルCLP AA3_SAMPLE はコマンドプロンプト制御を
行うプログラムのサンプル・ソースである。

コマンドプロンプト制御とはコマンドの各パラメータを有効にして表示するか
どうかを判断することである。
コマンドのパラメータの制御の多くはその前に入力された値によって
判断することが多い。

プロンプト制御の例は「51.プロンプト制御」を参照 https://www.as400-net.com/cmd/5439/

プロンプト制御プログラムはこのようにパラメータの表示/非表示をプログラムによって
判断するものである。

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

ソースはこちらから

0001.00              PGM        PARM(&CMDCMDLIB &PARMVAL &RTNVAL)                     
0002.00 /*------------------------------------------------------------------------*/  
0003.00 /*   AA3_SAMPLE :  コマンドプロンプト制御プログラム                       */  
0004.00 /*                                                                        */  
0005.00 /*               -- このプログラムはコマンドのパラメータを検査します。    */  
0006.00 /*                   判定した結果を &RTNVAL に入れて戻します。            */  
0007.00 /*                   コマンドは &RTNVAL 別に PMTCTL を定義して            */  
0008.00 /*                   PMTCTL によって次に表示するパラメータを              */  
0009.00 /*                   制御することができます。                             */  
0010.00 /*                   *STATUS メッセージを送ってメッセージを               */  
0011.00 /*                   表示することができます。                             */  
0012.00 /*                                                                        */  
0013.00 /*   2019/12/01  作成                                                     */  
0014.00 /*------------------------------------------------------------------------*/  
0015.00              DCL        VAR(&CMDCMDLIB) TYPE(*CHAR) LEN(20)                   
0016.00              DCL        VAR(&PARMVAL) TYPE(*CHAR) LEN(20)                     
0017.00              DCL        VAR(&RTNVAL) TYPE(*CHAR) LEN(32)                      
0018.00              DCL        VAR(&DEV) TYPE(*CHAR) LEN(10)                         
0019.00              DCL        VAR(&BIN4) TYPE(*CHAR) LEN(4)                         
0020.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                        
0021.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                        
0022.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)                        
0023.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)                     
0024.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)                
0025.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                    
0026.00              DCL        VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)                 
0027.00              DCL        VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +              
0028.00                           VALUE('*ESCAPE   ')                            
0029.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(116) +              
0030.00                           VALUE(X'000074') /* 2 進数  */                 
0031.00              DCL        VAR(&NULL4) TYPE(*CHAR) LEN(4) +                 
0032.00                           VALUE(X'00000000')                             
0033.00              /*--------------------------------------------------*/      
0034.00              /*   以下は装置の初期値パラメータ                   */      
0035.00              /*--------------------------------------------------*/      
0036.00              DCL        VAR(&DEV_) TYPE(*CHAR) LEN(10)                   
0037.00              /*--------------------------------------------------*/      
0038.00              /*   以下は返信パラメータ                           */      
0039.00              /*--------------------------------------------------*/      
0040.00              DCL        VAR(&DEV)    TYPE(*CHAR) LEN(40) +               
0041.00                           VALUE(' ??DEV(')                               
0042.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))          
0043.00                                                                          
0044.00 /*( 環境の取得 )*/                                                       
0045.00              RTVJOBA    TYPE(&TYPE)                                      
0046.00              IF         COND(&TYPE *EQ '0') THEN(DO) /*  バッチ  */      
0047.00              CHGVAR     VAR(&TOPGMQ) VALUE('*SYSOPR   ')                 
0048.00              ENDDO      /*  バッチ  */                                    
0049.00              ELSE       CMD(DO) /*  対話式  */                            
0050.00              CHGVAR     VAR(&TOPGMQ) VALUE('*TOPGMQ   ')                  
0051.00              ENDDO      /*  対話式  */                                    
0052.00                                                                           
0053.00 /*( パラメータ値の取得 )*/                                                
0054.00              CHGVAR     VAR(&DEV) VALUE(%SST(&PARMVAL 1 10))              
0055.00              CHKOBJ     OBJ(&DEV) OBJTYPE(*DEVD)                          
0056.00              MONMSG     MSGID(CPF9800) EXEC(DO)                           
0057.00              CHGVAR     VAR(&RTNVAL) VALUE(*ERR)                          
0058.00              CHGVAR     VAR(&MSG) VALUE(' 装置 ' *CAT &DEV *TCAT +        
0059.00                           ' が見つかりません。 ')                         
0060.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +       
0061.00                           TOPGMQ(*EXT) MSGTYPE(*STATUS)                   
0062.00              RETURN                                                       
0063.00              ENDDO                                                        
0064.00              CHGVAR     VAR(&RTNVAL) VALUE(*IPADDR)                       
0065.00              RETURN                                                       
0066.00                                                                           
0067.00              /*( エラーがあったときは CPF0011 を *ESCAPE で戻す )*/       
0068.00 ERROR:       RCVMSG     RMV(*NO) MSG(&MSG)                                
0069.00 SNDMSG:      SNDPGMMSG  MSG(&MSG) MSGTYPE(*DIAG)                          
0070.00              SNDPGMMSG  MSGID(CPF0011) MSGF(QCPFMSG) MSGTYPE(*ESCAPE)     
0071.00              DSPJOBLOG  JOB(*) OUTPUT(*PRINT)                             
0072.00              ENDPGM


   

[解説]

プログラムで検査するのでファイルを調べたり自由にいろいろな検査を行うことができる。
コマンドでは簡単な検査しかできないとあきらめていた方もプログラムで検査できるとあれば
DSPFを作成して検査しなくてもコマンドで十分な検査ができることが
ご理解して頂けると思う。

バッチ処理で出力帳票の初期値をセットしたり入力値を検査したり
次に表示するバラメータを自由にコントロールできる。
バッチ処理の範囲指定はDSPFにするよりコマンドのほうがはるかに
統一性も取れて柔軟なシステムに仕上げることができる。