コマンド

47. 値を戻すコマンド

コマンドの活用方法のひとつで値を戻すコマンドは非常に効果的である。
CALLでプログラムを呼び出してパラメータで値を受取るよりは
コマンドであれば F4キーでプロンプト表示させることができるので
開発も簡単になる。
このように値を戻すようにコマンドを作っておくと多くの業務で
再利用することができる。
ここでは値を戻すコマンドの作成方法を紹介しよう。

[ サンプル・コマンド: RTVCCSID ] ファイルのCCSIDを取得する RTVCCSID

ソースはこちらから

0001.00              CMD        PROMPT(' ファィルの CCSID の検索 ')           
0002.00              PARM       KWD(FILE) TYPE(FILE) +                        
0003.00                           PROMPT(' ファイル ')                        
0004.00  FILE:       QUAL       TYPE(*NAME) LEN(10)                           
0005.00              QUAL       TYPE(*CHAR) LEN(10) DFT(*LIBL) +              
0006.00                           PROMPT(' ライブラリー ')                    
0007.00              PARM       KWD(CCSID) TYPE(*DEC) LEN(5 0) RTNVAL(*YES) + 
0008.00                           PROMPT(' CCSID ')                      

[解説]

0007.00 PARM KWD(CCSID) TYPE(*DEC) LEN(5 0) RTNVAL(*YES) +
0008.00 PROMPT(‘ CCSID ‘)

RTNVAL(*YES) の部分がこのキー・ワード CCSIDが値を戻すことを示している。
さらにコンパイルには少し工夫が要る。

[コンパイル]

CRTCMD CMD(OBJLIB/RTVCCSID) PGM(OBJLIB/QCMDSRC) SRCFILE(MYSRCLIB/QCMDSRC)
ALLOW(*BPGM *IPGM) AUT(*ALL)

[解説]

ALLOW(*BPGM *IPGM) はこのコマンドがバッチ環境のみで動作することを示している。
つまり対話式環境で直接、エンド・ユーザーが RTVCCSIDと打鍵すると

CPD0031: この設定値にコマンド RTVCCSID を使用することはできない

とのエラーが発生して対話式環境では利用することはできないのである。

ところでこのコマンド RTVCCSIDはコンパイルの都度に ALLOW(*BPGM *IPGM)
指示してコンパイルすることを覚えておかねばならないのだろうか?
そこでもうひとつのテクニックを紹介する。
それは CMDパラメータにコンパイルの方法を仕組んでおくことである。

0001.00              CMD        PROMPT(' ファィルの CCSID の検索 ') + 
0002.00                           ALLOW(*BPGM *IPGM)                  

のようにして CMDパラメータに ALLOW(*PGM *IPGM) を埋めておくと通常のコンパイル
でも ALLOW(*BPGM *IPGM) が生かされることになる。

参考までにこのコマンドを処理するCLPも紹介しておこう。

[ サンプルCLP: RTVCCSIDCL ]

ファイルのCCSIDを取得する RTVCCSIDCL

ソースはこちらから

0001.00              PGM        PARM(&FILFILLIB &CCSID)                              
0002.00 /*---------------------------------------------------------*/                
0003.00 /*   RTVCCSID    :    ファィルの CCSID の検索              */                
0004.00 /*---------------------------------------------------------*/                
0005.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                       
0006.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                       
0007.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)                    
0008.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10) +                     
0009.00                           VALUE('QCPFMSG   ')                                
0010.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) +                  
0011.00                           VALUE('*LIBL     ')                                
0012.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                        
0013.00              DCL        VAR(&FILFILLIB) TYPE(*CHAR) LEN(20)                  
0014.00              DCL        VAR(&FILE) TYPE(*CHAR) LEN(10)                       
0015.00              DCL        VAR(&FILLIB) TYPE(*CHAR) LEN(10)                     
0016.00              DCL        VAR(&CCSID) TYPE(*DEC) LEN(5 0)                      
0017.00              DCL        VAR(&RCVVAR) TYPE(*CHAR) LEN(512)                    
0018.00              DCL        VAR(&RCVLEN) TYPE(*CHAR) LEN(4)                      
0019.00              DCL        VAR(&CCSID1) TYPE(*DEC) LEN(7 0) /*  FILE +          
0020.00                           CCSID       */                                     
0021.00              DCL        VAR(&RTNNAM) TYPE(*CHAR) LEN(20) /* RETURNED +       
0022.00                           FILE NAME  */                                      
0023.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(116) +                  
0024.00                           VALUE(X'000074') /* 2 進数  */              
0025.00              DCL        VAR(&NULL4) TYPE(*CHAR) LEN(4) +              
0026.00                           VALUE(X'00000000')                          
0027.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))       
0028.00                                                                       
0029.00              RTVJOBA    TYPE(&TYPE)                                   
0030.00              CHGVAR     VAR(&FILE) VALUE(%SST(&FILFILLIB 01 10))      
0031.00              CHGVAR     VAR(&FILLIB) VALUE(%SST(&FILFILLIB 11 10))    
0032.00              CHGVAR     VAR(%BIN(&RCVLEN)) VALUE(512)                 
0033.00              CALL       PGM(QDBRTVFD) PARM(&RCVVAR &RCVLEN &RTNNAM +  
0034.00                           'FILD0200' &FILFILLIB '*FIRST    ' '0' +    
0035.00                           '*FILETYPE' '*INT' &APIERR)                 
0036.00   /*( API エラー )*/                                                  
0037.00              IF         COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)   
0038.00              CHGVAR     VAR(&MSGID) VALUE(%SST(&APIERR 9 7))          
0039.00              CHGVAR     VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))      
0040.00              GOTO       SNDMSG                                        
0041.00              ENDDO                                                    
0042.00   /*( 正常に取得成功 )*/                                              
0043.00              CHGVAR     VAR(&CCSID1) VALUE(%BIN(&RCVVAR 46 2))        
0044.00              CHGVAR     VAR(&CCSID) VALUE(&CCSID1)                    
0045.00              IF         COND(&CCSID *EQ -1) THEN(CHGVAR VAR(&CCSID) + 
0046.00                           VALUE(65535))                               
0047.00              RETURN                                                   
0048.00                                                                          
0049.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +              
0050.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +    
0051.00                           MSGFLIB(&MSGFLIB)                              
0052.00  SNDMSG:                                                                 
0053.00              IF         COND(&TYPE *EQ '0') THEN(DO)                     
0054.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +             
0055.00                           MSGDTA(&MSGDTA) TOMSGQ(*SYSOPR) +              
0056.00                           MSGTYPE(*COMP)                                 
0057.00              ENDDO                                                       
0058.00              ELSE       CMD(DO)                                          
0059.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +             
0060.00                           MSGDTA(&MSGDTA) TOMSGQ(*TOPGMQ) +              
0061.00                           MSGTYPE(*ESCAPE)                               
0062.00              ENDDO                                                       
0063.00              ENDPGM 


                                                     

[解説]

API : QDBRTVFD を呼び出してファイル属性を調べて戻している。