コマンド

52. プロンプト一時変更プログラム

プロンプト一時変更プログラム(PMTOVRPGM)とはコマンドが表示される直前に
呼び出されてコマンド・パラメータの初期値をセットするプログラムのことである。
いわばコマンドの初期設定プログラムと言ったほうがわかりやすいかも知れない。

コマンドは呼び出される直前にそのときの環境や状態を読み取って動的に
パラメータの初期値を変化させたい場合がある。
このようなときにプロンプト一時変更プログラム(PMTOVRPGM)が使われる。

[売上明細表: URIAGE ]

                              売上明細表  (URIAGE)     
                                                       
 選択項目を入力して,実行キーを押してください。        
                                                       
 売上年月日から  . . . . . . . .                  数値 
      まで  . . . . . . . .                  数値 
                                                       

                                                                         終り
 F3= 終了    F4=プロンプト   F5= 最新表示    F12= 取り消し                      
 F13= この画面の使用法                    F24= キーの続き                    

[解説]

この売上明細表を出力するには売上日の開始日と終了日を入力しなければならない。
初期値として開始日と終了日をセットするにはどうすればよいか?

[コマンド:URIAGE ]

0001.00              CMD        PROMPT(' 売上明細表 ') +          
0002.00                           PMTOVRPGM(QUATTRO/URIINZ)       
0003.00              PARM       KWD(URFROM) TYPE(*DEC) LEN(8 0) + 
0004.00                           PROMPT(' 売上年月日から ')      
0005.00              PARM       KWD(URTO) TYPE(*DEC) LEN(8 0) +   
0006.00                           PROMPT('      まで ')      

[解説]

このようにプロンプト一時変更プログラム(PMTOVRPGM)を指定する。
プロンプト一時変更プログラム(PMTOVRPGM)はコマンドのコンパイル時に

  CRTCMD CMD(QUATTRO/URIAGE) PGM(QUATTRO/URIAGECL) SRCFILE(R610SRC/QCMDSRC)
 PMTOVRPGM(QUATTRO/URIINZ) AUT(*ALL)                                     

のように指定してもよいが再コンパイルのときにも毎回指定しなければならない。
それならば

0001.00              CMD        PROMPT(' 売上明細表 ') +          
0002.00                           PMTOVRPGM(QUATTRO/URIINZ) 

と指定しておけばコンパイルには何も指定する必要はない。

 CRTCMD CMD(QUATTRO/URIAGE) PGM(QUATTRO/URIAGECL) SRCFILE(R610SRC/QCMDSRC)
 AUT(*ALL)                                                               

で十分である。

次にプロンプト一時変更プログラム(PMTOVRPGM)のCLPソースを紹介する。

[URIINZ:プロンプト一時変更プログラム(PMTOVRPGM)]

ソースはこちらから

0001.00              PGM        PARM(&CMDNAME  &STRING)                                
0002.00 /*------------------------------------------------------------------------*/   
0003.00 /*   URIINZ    :  コマンド一時変更プログラム                              */   
0004.00 /*               -- このプログラムはコマンドの初期値を設定します。        */   
0005.00 /*                  &STRING に長さとパラメータの初期値を戻します。        */   
0006.00 /*                                                                        */   
0007.00 /*   2020/04/12  作成                                                     */   
0008.00 /*------------------------------------------------------------------------*/   
0009.00              DCL        VAR(&CMDNAME) TYPE(*CHAR) LEN(20)                      
0010.00              DCL        VAR(&STRING)  TYPE(*CHAR) LEN(5700)                    
0011.00              DCL        VAR(&STRINGLEN) TYPE(*DEC) LEN(8 0) VALUE(1024)        
0012.00              DCL        VAR(&BIN2) TYPE(*CHAR) LEN(2) VALUE(X'0400') +         
0013.00                           /*  長さ 1024 バイト  */                             
0014.00              DCL        VAR(&BIN4) TYPE(*CHAR) LEN(4)                          
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              /*--------------------------------------------------*/   
0029.00              /*   以下は装置の初期値パラメータ                   */   
0030.00              /*--------------------------------------------------*/   
0031.00              DCL        VAR(&DEV_) TYPE(*CHAR) LEN(10)                
0032.00              /*--------------------------------------------------*/   
0033.00              /*   以下は返信パラメータ                           */   
0034.00              /*--------------------------------------------------*/   
0035.00              DCL        VAR(&URFROM)    TYPE(*CHAR) LEN(40) +         
0036.00                           VALUE(' ??URFROM(')                         
0037.00              DCL        VAR(&URTO)    TYPE(*CHAR) LEN(40) +           
0038.00                           VALUE(' ??URTO(')                           
0039.00              /*--------------------------------------------------*/   
0040.00              /*   以下は作業用の変数                             */   
0041.00              /*--------------------------------------------------*/   
0042.00              DCL        VAR(&DATE) TYPE(*CHAR) LEN(6)                 
0043.00              DCL        VAR(&YY) TYPE(*CHAR) LEN(2)                   
0044.00              DCL        VAR(&MM) TYPE(*CHAR) LEN(2)                   
0045.00              DCL        VAR(&DD) TYPE(*CHAR) LEN(2)                   
0046.00              DCL        VAR(&CYY) TYPE(*CHAR) LEN(4)                  
0047.00              DCL        VAR(&FROMYMD) TYPE(*CHAR) LEN(8)              
0048.00              DCL        VAR(&TOYMD) TYPE(*CHAR) LEN(8)                 
0049.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))        
0050.00                                                                        
0051.00 /*( 環境の取得 )*/                                                     
0052.00              RTVJOBA    TYPE(&TYPE) DATE(&DATE)                        
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 /*                  返信パラメータの作成                    */         
0062.00 /*      ************************************************    */         
0063.00              CHGVAR     VAR(&YY) VALUE(%SST(&DATE 01 02))              
0064.00              CHGVAR     VAR(&MM) VALUE(%SST(&DATE 03 02))              
0065.00              CHGVAR     VAR(&DD) VALUE(%SST(&DATE 05 02))              
0066.00              CHGVAR     VAR(&CYY) VALUE('20' *CAT &YY)                 
0067.00         /*( 開始日 )*/                                                 
0068.00              CHGVAR     VAR(&FROMYMD) VALUE(&CYY *CAT &MM *CAT +       
0069.00                           '01')                                        
0070.00              CHGVAR     VAR(&URFROM) VALUE(&URFROM *TCAT &FROMYMD +    
0071.00                           *TCAT ') ')                                  
0072.00         /*( 終了日 )*/                               
0073.00              SELECT                                  
0074.00              WHEN       COND(&MM = '01') THEN(DO)    
0075.00              CHGVAR     VAR(&DD) VALUE('31')         
0076.00              ENDDO                                   
0077.00              WHEN       COND(&MM = '02') THEN(DO)    
0078.00              CHGVAR     VAR(&DD) VALUE('28')         
0079.00              ENDDO                                   
0080.00              WHEN       COND(&MM = '03') THEN(DO)    
0081.00              CHGVAR     VAR(&DD) VALUE('31')         
0082.00              ENDDO                                   
0083.00              WHEN       COND(&MM = '04') THEN(DO)    
0084.00              CHGVAR     VAR(&DD) VALUE('30')         
0085.00              ENDDO                                   
0086.00              WHEN       COND(&MM = '05') THEN(DO)    
0087.00              CHGVAR     VAR(&DD) VALUE('31')         
0088.00              ENDDO                                   
0089.00              WHEN       COND(&MM = '06') THEN(DO)    
0090.00              CHGVAR     VAR(&DD) VALUE('30')         
0091.00              ENDDO                                   
0092.00              WHEN       COND(&MM = '07') THEN(DO)    
0093.00              CHGVAR     VAR(&DD) VALUE('31')         
0094.00              ENDDO                                   
0095.00              WHEN       COND(&MM = '08') THEN(DO)    
0096.00              CHGVAR     VAR(&DD) VALUE('31')                          
0097.00              ENDDO                                                    
0098.00              WHEN       COND(&MM = '09') THEN(DO)                     
0099.00              CHGVAR     VAR(&DD) VALUE('30')                          
0100.00              ENDDO                                                    
0101.00              WHEN       COND(&MM = '10') THEN(DO)                     
0102.00              CHGVAR     VAR(&DD) VALUE('31')                          
0103.00              ENDDO                                                    
0104.00              WHEN       COND(&MM = '11') THEN(DO)                     
0105.00              CHGVAR     VAR(&DD) VALUE('30')                          
0106.00              ENDDO                                                    
0107.00              WHEN       COND(&MM = '12') THEN(DO)                     
0108.00              CHGVAR     VAR(&DD) VALUE('31')                          
0109.00              ENDDO                                                    
0110.00              ENDSELECT                                                
0111.00              CHGVAR     VAR(&TOYMD) VALUE(&CYY *CAT &MM *CAT &DD)     
0112.00              CHGVAR     VAR(&URTO) VALUE(&URTO *TCAT &TOYMD *TCAT ')')
0113.00 /*      ************************************************    */        
0114.00 /*                  返信ストリングの作成                    */        
0115.00 /*      ************************************************    */        
0116.00              CHGVAR     VAR(&STRING) VALUE(&BIN2) /*  長さ  */        
0117.00              CHGVAR     VAR(&STRING) VALUE(&STRING *TCAT &URFROM)     
0118.00              CHGVAR     VAR(&STRING) VALUE(&STRING *TCAT &URTO)       
0119.00              RETURN                                                   
0120.00                                                                       
0121.00 ERROR:       /*( エラーがあったときは CPF0011 を *ESCAPE で戻す )*/   
0122.00              RCVMSG     RMV(*NO) MSG(&MSG)                            
0123.00              SNDPGMMSG  MSG(&MSG) MSGTYPE(*DIAG)                      
0124.00              SNDPGMMSG  MSGID(CPF0011) MSGF(QCPFMSG) MSGTYPE(*ESCAPE) 
0125.00              ENDPGM    


                                                   

[解説]

プロンプト一時変更プログラムが受取るパラメータは常に一定であって

0001.00              PGM        PARM(&CMDNAME  &STRING)
  :
0009.00              DCL        VAR(&CMDNAME) TYPE(*CHAR) LEN(20)                      
0010.00              DCL        VAR(&STRING)  TYPE(*CHAR) LEN(5700)

である。
この &STRING が戻すパラメータであるがこの中に

 ??URFROM(20200401) ??URTO(20200430)

のように値を入れて戻せばよい。
この結果は次のような画面になる。

                              売上明細表  (URIAGE)      
                                                        
 選択項目を入力して,実行キーを押してください。         
                                                        
 売上年月日から  . . . . . . . .  20200401       数値  
      まで  . . . . . . . .   20200430       数値  
                                                        


                                                                             
                                                                        終り
F3= 終了    F4=プロンプト   F5= 最新表示    F12= 取り消し                      
F13= この画面の使用法                    F24= キーの続き                    

…このようにプロンプト一時変更プログラム(PMTOVRPGM)はコマンドの初期値を
自由に設定することができる。