コマンド

54. コマンドの妥当性検査プログラム AA5_SAMPLE

コマンドの妥当性検査プログラムというのはコマンドでユーザーが入力した値が
正しいかどうかの妥当性検査を行うプログラムである。

最初に妥当性検査プログラムの使用例を示すと妥当性検査プログラムの
有用性を臨沂して頂けると思う。

                              印刷の出力  (OUTPUT)                             
                                                                               
 選択項目を入力して,実行キーを押してください。                                
                                                                               
 担当者コード  . . . . . . . . .                  名前,リストは F4            
 出力オプション  . . . . . . . .   *PRINT        *PRINT, *OUTFILE              
                                                                               
                                                                              
                                                                               
                                                                        終り   
F3= 終了    F4=プロンプト   F5= 最新表示    F12= 取り消し                         
F13= この画面の使用法                    F24= キーの続き                       

[解説]

これは印刷の出力を指示する画面をコマンドで作成した例である。
このコマンドで入力する「担当者コード」が正しいかどうかを
妥当性検査プログラムでチッェクするものとする。

[コマンド: OUTPUT]

ソースはこちらから

0001.00              CMD        PROMPT(' 印刷の出力 ') VLDCKR(QUATTRO/OUTCHK)
0002.00              PARM       KWD(TANCOD) TYPE(*CHAR) LEN(4) MIN(1) +      
0003.00                           CHOICE(*PGM) CHOICEPGM(QUATTRO/OUTCHO) +   
0004.00                           PROMPT(' 担当者コード ')                   
0005.00              PARM       KWD(OPTION) TYPE(*CHAR) LEN(10) RSTD(*YES) + 
0006.00                           DFT(*PRINT) VALUES(*PRINT *OUTFILE) +      
0007.00                           PROMPT(' 出力オプション ')  


               

[コンパイル]

妥当性検査プログラムは CMDで VLDCKR(QUATTRO/OUTCHK)として示されているので
コンパイルで指定する必要はない。

CRTCMD OBJLIB/OUTPUT PGM(OBJLIB/OUTPUTCL) SRCFILE(SRCLIB/QCMDSRC( AUT(*ALL)

[ 妥当性検査プログラム OUTCHK ]

 

ソースはこちらから

0001.00              PGM        PARM(&TANCOD &OPTION)                            
0002.00 /*-------------------------------------------------------------------*/  
0003.00 /*   OUTCHK    :   コマンドの妥当性検査プログラム  VLDCKR            */  
0004.00 /*                                                                   */  
0005.00 /*   2020/04/11  作成                                                */  
0006.00 /*-------------------------------------------------------------------*/  
0007.00              DCL        VAR(&TANCOD) TYPE(*CHAR) LEN(4)                  
0008.00              DCL        VAR(&OPTION) TYPE(*CHAR) LEN(10)                 
0009.00              DCL        VAR(&DEV) TYPE(*CHAR) LEN(10)                    
0010.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                   
0011.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                   
0012.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)                   
0013.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)                
0014.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)                
0015.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                    
0016.00              DCL        VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)                 
0017.00              DCL        VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +              
0018.00                           VALUE('*ESCAPE   ')                            
0019.00              DCL        VAR(&ERR) TYPE(*CHAR) LEN(1)                     
0020.00              DCL        VAR(&NULL4) TYPE(*CHAR) LEN(4) +                 
0021.00                           VALUE(X'00000000')                             
0022.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))          
0023.00                                                                          
0024.00 /*( 環境の取得 )*/                                                      
0025.00              RTVJOBA    TYPE(&TYPE)                                     
0026.00              IF         COND(&TYPE *EQ '0') THEN(DO) /*  バッチ  */     
0027.00              CHGVAR     VAR(&TOPGMQ) VALUE('*SYSOPR   ')                
0028.00              ENDDO      /*  バッチ  */                                  
0029.00              ELSE       CMD(DO) /*  対話式  */                          
0030.00              CHGVAR     VAR(&TOPGMQ) VALUE('*TOPGMQ   ')                
0031.00              ENDDO      /*  対話式  */                                  
0032.00                                                                         
0033.00 /*( 入力パラメータの検査 )*/                                            
0034.00              IF         COND(&TANCOD *EQ ' ') THEN(DO)                  
0035.00              CHGVAR     VAR(&MSG) +                                     
0036.00                           VALUE(' 担当者コードが入力されていません。 ') 
0037.00              GOTO       SNDMSG                                          
0038.00              ENDDO                                                      
0039.00                                                                         
0040.00 /*( プログラムの実行 )*/                                                
0041.00              IF         COND((&TANCOD *EQ '0001') *OR (&TANCOD *EQ +    
0042.00                           '0002') *OR (&TANCOD *EQ '0003')) THEN(DO)    
0043.00              RETURN                                                     
0044.00              ENDDO                                                      
0045.00              ELSE       CMD(DO)                                         
0046.00              CHGVAR     VAR(&MSG) VALUE(' 担当者コード ' *CAT +         
0047.00                           &TANCOD *TCAT ' の誤りです。 ')               
0048.00              GOTO       SNDMSG                                          
0049.00              ENDDO                                                      
0050.00                                                                         
0051.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +             
0052.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +   
0053.00                           MSGFLIB(&MSGFLIB)                             
0054.00  SNDMSG:     CHGVAR     VAR(&MSGDTA) VALUE('0000' *CAT &MSG)            
0055.00              /*( 妥当性検査のエラーは最初に CPD0006 を戻します )*/      
0056.00              SNDPGMMSG  MSGID(CPD0006) MSGF(QCPFMSG) MSGDTA(&MSGDTA) +  
0057.00                           MSGTYPE(*DIAG)                                
0058.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                     
0059.00              /*( 妥当性検査のエラーは CPF0002 を戻します )*/            
0060.00              SNDPGMMSG  MSGID(CPF0002) MSGF(QCPFMSG) MSGTYPE(*ESCAPE)   
0061.00              ENDPGM   


                                                  

[解説]

妥当性検査プログラムへ渡されるパラメータはコマンドを処理するプログラムに渡されるパラメータと
同じものが同じ個数の分だけ渡される。

0001.00              PGM        PARM(&TANCOD &OPTION)

それらの受取ったパラメータを使って自由にチェックして問題がなく正しければ
ただ RETURN するだけでよい。

0041.00              IF         COND((&TANCOD *EQ '0001') *OR (&TANCOD *EQ +    
0042.00                           '0002') *OR (&TANCOD *EQ '0003')) THEN(DO)    
0043.00              RETURN                                                     
0044.00              ENDDO 

エラーがあれば最初に CPD0006 を戻して続けて CPF0002 を戻すように決められているので
それに従えばよい。

0054.00  SNDMSG:     CHGVAR     VAR(&MSGDTA) VALUE('0000' *CAT &MSG)            
0055.00              /*( 妥当性検査のエラーは最初に CPD0006 を戻します )*/      
0056.00              SNDPGMMSG  MSGID(CPD0006) MSGF(QCPFMSG) MSGDTA(&MSGDTA) +  
0057.00                           MSGTYPE(*DIAG)                                
0058.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                     
0059.00              /*( 妥当性検査のエラーは CPF0002 を戻します )*/            
0060.00              SNDPGMMSG  MSGID(CPF0002) MSGF(QCPFMSG) MSGTYPE(*ESCAPE)   
0061.00              ENDPGM 

上記の妥当性検査プログラムをテンプレートにしたものが
次に紹介する AA5_SAMPLE である。

[妥当性検査プログラム: AA5_SAMPLE ]

ソースはこちらから

0001.00              PGM        PARM(&DEV &IPADDR &PDT &SMBLOGIN &PRINTER +    
0002.00                           &LPRLOGIN &OUTQQLIB &MSGQQLIB &OPTION +      
0003.00                           &OUTIFS &PAGESIZEP &FONTINFOP &DRAWER +      
0004.00                           &DUPLEX &COPIES &CODEPAGE &TEXT &AUT +       
0005.00                           &ERRMSG)                                     
0006.00 /*-------------------------------------------------------------------*/
0007.00 /*   AA5_SAMPLE:   コマンドの妥当性検査プログラム  VLDCKR            */
0008.00 /*                                                                   */
0009.00 /*   2019/12/13  作成                                                */
0010.00 /*-------------------------------------------------------------------*/
0011.00              DCL        VAR(&DEV) TYPE(*CHAR) LEN(10)                  
0012.00              DCL        VAR(&IPADDR) TYPE(*CHAR) LEN(15)               
0013.00              DCL        VAR(&PDT) TYPE(*CHAR) LEN(32)                  
0014.00              DCL        VAR(&SMBLOGIN) TYPE(*CHAR) LEN(128)            
0015.00              DCL        VAR(&PRINTER) TYPE(*CHAR) LEN(32)              
0016.00              DCL        VAR(&LPRLOGIN) TYPE(*CHAR) LEN(64)             
0017.00              DCL        VAR(&OUTQQLIB) TYPE(*CHAR) LEN(20)             
0018.00              DCL        VAR(&OUTQ) TYPE(*CHAR) LEN(10)                 
0019.00              DCL        VAR(&OUTLIB) TYPE(*CHAR) LEN(10)               
0020.00              DCL        VAR(&MSGQWLIB) TYPE(*CHAR) LEN(20)             
0021.00              DCL        VAR(&MSGQQLIB) TYPE(*CHAR) LEN(20)             
0022.00              DCL        VAR(&MSGQ) TYPE(*CHAR) LEN(10)                 
0023.00              DCL        VAR(&MSGQLIB) TYPE(*CHAR) LEN(10)              
0024.00              DCL        VAR(&OPTION) TYPE(*CHAR) LEN(6)          
0025.00              DCL        VAR(&OUTIFS) TYPE(*CHAR) LEN(128)        
0026.00              DCL        VAR(&PAGESIZEP) TYPE(*CHAR) LEN(19)      
0027.00              DCL        VAR(&PAGESIZE) TYPE(*CHAR) LEN(17)       
0028.00              DCL        VAR(&FONTINFOP) TYPE(*CHAR) LEN(18)      
0029.00              DCL        VAR(&FONTINFO) TYPE(*CHAR) LEN(16)       
0030.00              DCL        VAR(&DRAWER) TYPE(*CHAR) LEN(2)          
0031.00              DCL        VAR(&DUPLEX) TYPE(*CHAR) LEN(1)          
0032.00              DCL        VAR(&COPIES) TYPE(*CHAR) LEN(2)          
0033.00              DCL        VAR(&CODEPAGE) TYPE(*CHAR) LEN(5)        
0034.00              DCL        VAR(&TEXT) TYPE(*CHAR) LEN(50)           
0035.00              DCL        VAR(&AUT) TYPE(*CHAR) LEN(10)            
0036.00              DCL        VAR(&ERRMSG) TYPE(*CHAR) LEN(4)          
0037.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)           
0038.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)           
0039.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)           
0040.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)        
0041.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)        
0042.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)            
0043.00              DCL        VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)         
0044.00              DCL        VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +      
0045.00                           VALUE('*ESCAPE   ')                    
0046.00              DCL        VAR(&ERR) TYPE(*CHAR) LEN(1)             
0047.00              DCL        VAR(&NULL4) TYPE(*CHAR) LEN(4) +         
0048.00                           VALUE(X'00000000')                              
0049.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))           
0050.00                                                                           
0051.00 /*( 環境の取得 )*/                                                        
0052.00              RTVJOBA    TYPE(&TYPE)                                       
0053.00              IF         COND(&TYPE *EQ '0') THEN(DO) /*  バッチ  */       
0054.00              CHGVAR     VAR(&TOPGMQ) VALUE('*SYSOPR   ')                  
0055.00              ENDDO      /*  バッチ  */                                    
0056.00              ELSE       CMD(DO) /*  対話式  */                            
0057.00              CHGVAR     VAR(&TOPGMQ) VALUE('*TOPGMQ   ')                  
0058.00              ENDDO      /*  対話式  */                                    
0059.00                                                                           
0060.00 /*( 入力パラメータの検査 )*/                                              
0061.00              IF         COND(&PRINTER *EQ ' ') THEN(DO)                   
0062.00              CHGVAR     VAR(&MSG) +                                       
0063.00                           VALUE(' プリンター名が入力されていません。 ')   
0064.00              GOTO       SNDMSG                                            
0065.00              ENDDO                                                        
0066.00                                                                           
0067.00 /*( プログラムの実行 )*/                                                  
0068.00              CALL       PGM(MYPGM) PARM(&ERR &MSG)                        
0069.00              IF         COND(&ERR *EQ ' ') THEN(DO)                       
0070.00              CHGVAR     VAR(&MSGTYPE) VALUE('*DIAG     ')                 
0071.00              ENDDO                                                        
0072.00              IF         COND(&MSG *NE ' ') THEN(DO)                    
0073.00              GOTO       SNDMSG                                         
0074.00              ENDDO                                                     
0075.00                                                                        
0076.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +            
0077.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +  
0078.00                           MSGFLIB(&MSGFLIB)                            
0079.00  SNDMSG:     CHGVAR     VAR(&MSGDTA) VALUE('0000' *CAT &MSG)           
0080.00              /*( 妥当性検査のエラーは最初に CPD0006 を戻します )*/     
0081.00              SNDPGMMSG  MSGID(CPD0006) MSGF(QCPFMSG) MSGDTA(&MSGDTA) + 
0082.00                           MSGTYPE(*DIAG)                               
0083.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                    
0084.00              /*( 妥当性検査のエラーは CPF0002 を戻します )*/           
0085.00              SNDPGMMSG  MSGID(CPF0002) MSGF(QCPFMSG) MSGTYPE(*ESCAPE)  
0086.00              ENDPGM