コマンド

43. QUALキー・ワード

QUALキー・ワードについて説明しよう。
PARMで説明したようにプログラムに渡すパラメータはあくまでも PARM として
記載された部分である。
その PARM の部分を分割して入力しやすくしているのが、ここで紹介する
QUAL文である。

[例: QUALのサンプル: TESTQAL ]

                           QUAL のテスト  (TESTQAL)                            
                                                                               
 選択項目を入力して,実行キーを押してください。                                
                                                                               
 ソース・ファイル  . . . . . . .   QRPGLESRC      名前 , *PRV                  
   ライブラリー  . . . . . . . .     QTRSRC       名前 , *LIBL, *CURLIB, *PRV  
 ソース・メンバー  . . . . . . .   PGM201         名前 , *PRV                  

[解説]

これはわかりやすいように STRSEU コマンドの実行に似せたコマンドである。
ソース・ファイルとライブラリーに分割されている部分が QUAL による記述である。

[ TESTQAL :コマンド・ソース ]

0001.00              CMD        PROMPT('QUAL のテスト ')                       
0002.00              PARM       KWD(SRCFILE) TYPE(SRCFILE) +                   
0003.00                           PROMPT(' ソース・ファイル ')                 
0004.00  SRCFILE:    QUAL       TYPE(*NAME) LEN(10) DFT(*PRV) SPCVAL((*PRV))   
0005.00              QUAL       TYPE(*NAME) LEN(10) SPCVAL((*LIBL) (*CURLIB) + 
0006.00                           (*PRV)) PROMPT(' ライブラリー ')             
0007.00              PARM       KWD(SRCMBR) TYPE(*NAME) LEN(10) DFT(*PRV) +    
0008.00                           SPCVAL((*PRV)) +                             
0009.00                           PROMPT(' ソース・メンバー ')                 

[解説]

パラメータ : SRCFILE PROMPT(‘ ソース・ファイル ‘) =


         SRCFILE:    QUAL       TYPE(*NAME) LEN(10) 
                     QUAL       TYPE(*NAME) LEN(10) PROMPT(' ライブラリー ')

であり PARM SRCFILE は2つの QUAL文から成り立っていることに注意して欲しい。
従ってこのコマンドは

0001.00              CMD        PROMPT('QUAL のテスト ')                       
0002.00              PARM       KWD(SRCFILE) TYPE(SRCFILE) +                   
0003.00                           PROMPT(' ソース・ファイル ')                 
            
0007.00              PARM       KWD(SRCMBR) TYPE(*NAME) LEN(10) DFT(*PRV) +    
0008.00                           SPCVAL((*PRV)) +                             
0009.00                           PROMPT(' ソース・メンバー ') 

0004.00  SRCFILE:    QUAL       TYPE(*NAME) LEN(10) DFT(*PRV) SPCVAL((*PRV))   
0005.00              QUAL       TYPE(*NAME) LEN(10) SPCVAL((*LIBL) (*CURLIB) + 
0006.00                           (*PRV)) PROMPT(' ライブラリー ')                 

のように記述しても構わない。
PARM SRCFILE PROMPT(‘ ソース・ファイル ‘)SRCFILE として定義されており
SRCFILE の定義は

0004.00  SRCFILE:    QUAL       TYPE(*NAME) LEN(10) DFT(*PRV) SPCVAL((*PRV))   
0005.00              QUAL       TYPE(*NAME) LEN(10) SPCVAL((*LIBL) (*CURLIB) + 
0006.00                           (*PRV)) PROMPT(' ライブラリー ')

として後述されていることになる。
しかしこの書き方では QUALの構成が多くなるは非常にわかりにくくなるので
やはり PARM に続けて QUALを記述することが望ましい。

ところでなぜ QUALとして分割して表現するのかというとライブラリーに所属している
オブジェクトをわかりやすく表現するためである。
IBM のユーティリティでも QUALは非常に多く使われている。

但し上記でわかるように QUALの変数のタイプは *NAME に限られている。
理由は不明であるが *CHAR*DECQUALに使えないのはやや不便である。

[ QUALを受取るCLP : TESTQALCL ]

0001.00              PGM        PARM(&SRCFILLIB &SRCMBR)                       
0002.00 /*-------------------------------------------------------------------*/
0003.00 /*   TESTQALCL :  QUAL を受取るサンプル CLP                          */
0004.00 /*                                                                   */
0005.00 /*   2019/12/25  作成                                                */
0006.00 /*-------------------------------------------------------------------*/
0007.00              DCL        VAR(&SRCFILLIB) TYPE(*CHAR) LEN(20)            
0008.00              DCL        VAR(&SRCF) TYPE(*CHAR) LEN(10)                 
0009.00              DCL        VAR(&SRCLIB) TYPE(*CHAR) LEN(10)               
0010.00              DCL        VAR(&SRCMBR) TYPE(*CHAR) LEN(10)               
0011.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                 
0012.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                 
0013.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)                 
0014.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)              
0015.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)              
0016.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                  
0017.00              DCL        VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)               
0018.00              DCL        VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +            
0019.00                           VALUE('*ESCAPE   ')                          
0020.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(116) +            
0021.00                           VALUE(X'000074') /* 2 進数  */               
0022.00              DCL        VAR(&NULL4) TYPE(*CHAR) LEN(4) +               
0023.00                           VALUE(X'00000000')                           
0024.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))         
0025.00                                                                         
0026.00 /*( 環境の取得 )*/                                                      
0027.00              RTVJOBA    TYPE(&TYPE)                                     
0028.00              IF         COND(&TYPE *EQ '0') THEN(DO) /*  バッチ  */     
0029.00              CHGVAR     VAR(&TOPGMQ) VALUE('*SYSOPR   ')                
0030.00              ENDDO      /*  バッチ  */                                  
0031.00              ELSE       CMD(DO) /*  対話式  */                          
0032.00              CHGVAR     VAR(&TOPGMQ) VALUE('*TOPGMQ   ')                
0033.00              ENDDO      /*  対話式  */                                  
0034.00                                                                         
0035.00 /*( パラメータの取得 )*/                                                
0036.00              CHGVAR     VAR(&SRCF) VALUE(%SST(&SRCFILLIB 01 10))        
0037.00              CHGVAR     VAR(&SRCLIB) VALUE(%SST(&SRCFILLIB 11 10))      
0038.00                                                                         
0039.00 /*( プログラムの実行 )*/                                                
0040.00              STRSEU     SRCFILE(&SRCLIB/&SRCF) SRCMBR(&SRCMBR)          
0041.00              RETURN                                                     
0042.00                                                                         
0043.00  APIERR:                                                                
0044.00              CHGVAR     VAR(&MSGID) VALUE(%SST(&APIERR 9 7))            
0045.00              CHGVAR     VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))        
0046.00              CHGVAR     VAR(&MSGF) VALUE('QCPFMSG   ')                  
0047.00              CHGVAR     VAR(&MSGFLIB) VALUE('QSYS      ')               
0048.00              GOTO       SNDMSG                                        
0049.00                                                                       
0050.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +           
0051.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 
0052.00                           MSGFLIB(&MSGFLIB)                           
0053.00  SNDMSG:     IF         COND(&MSGID *EQ ' ') THEN(DO)                 
0054.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +   
0055.00                           TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)           
0056.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                   
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(&MSGTYPE)                           
0062.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                   
0063.00              ENDDO                                                    
0064.00              ENDPGM                                                   

[解説]

PARM がプログラムに渡るパラメータであると説明したように2つの QUAL文であっても
このプログラムに渡されるパラメータはひとつのパラメータとして渡されていることに
注目してほしい。


0001.00              PGM        PARM(&SRCFILLIB &SRCMBR) 

 

の変数: &SRCFILLIB 20バイトが ふたつのQUAL文から成るひとつのパラメータである。

0007.00              DCL        VAR(&SRCFILLIB) TYPE(*CHAR) LEN(20)            
0008.00              DCL        VAR(&SRCF) TYPE(*CHAR) LEN(10)                 
0009.00              DCL        VAR(&SRCLIB) TYPE(*CHAR) LEN(10) 

に対して

0035.00 /*( パラメータの取得 )*/                                                
0036.00              CHGVAR     VAR(&SRCF) VALUE(%SST(&SRCFILLIB 01 10))        
0037.00              CHGVAR     VAR(&SRCLIB) VALUE(%SST(&SRCFILLIB 11 10))

によって2つの変数に分割して

0039.00 /*( プログラムの実行 )*/                                                
0040.00              STRSEU     SRCFILE(&SRCLIB/&SRCF) SRCMBR(&SRCMBR)

で使うようにしている。
QUAL で複数として記述されていてもあくまでもパラメータ部分は PARM である。