コマンド

45. プログラム選択(CHOICEPGM)でリストはF4

 

IBMのユーティリティ・コマンドで「リストはF4」というパラメータの説明を
見たことがあるかも知れない。
例えば STRPDM で「3. メンバーの処理」を選択すると

                       処理するメンバーの指定                             
                                                                          
選択項目を入力して,実行キーを押してください。                            
                                                                          
  ファイル . . . . . . . .   QPNLSRC       名前,リストは F4              
                                                                          
    ライブラリー . . . . .     R610SRC     *LIBL, *CURLIB, 名前           
                                                                          
  メンバー:                                                              
    名前 . . . . . . . . .   STRHTPSVR*    *ALL, 名前, * 総称 *          
    タイプ . . . . . . . .   *ALL          *ALL, タイプ, * 総称 *, *BLANK

のようにしてファイルの説明に「名前,リストは F4」と表示されていて
ファイル名にカーソルをセットしてF4キーを押すと例えば次のようにリスト表示が
される。

                         PDM を使用したファイルの選択         
                                                              
 ライブラリー  . :   R610SRC                                  
                                                              
 位置指定  . . . . . . .                開始文字              
 名前によるサブセット      *ALL         *ALL, 名前, * 総称 * 
                                                              
 オプションを入力して,実行キーを押してください。             
   1= 選択                                                    
                                                              
 OPT      ファイル       属性           テキスト              
         EVFEVENT       PF-DTA                                
         H              PF-SRC                                
         H240           PF-SRC                                
         NSMAP          PF-SRC                                
         QAPWSRC        PF-SRC                                
         QCBLLESRC      PF-SRC                                
         QCBL5035       PF-SRC                                
         QCLLESRC       PF-SRC                                
         QCLSRC         PF-SRC                                
         QCLSRC2        PF-SRC                                

これはどのようにしてIBMは実現しているのだろうか?
これはコマンドの「プログラム選択(CHOICEPGM)」を利用している。

これを実現するコマンドを作ってみよう。

[サンプル・コマンド: PGM106 ]

                         商品マスター一覧表  (PGM106)               
                                                                    
選択項目を入力して,実行キーを押してください。                      
                                                                    
品種コード  . . . . . . . . . .                  から               
                                  9999           まで               
商品コード  . . . . . . . . . .                  から , リストは F4 
                                  9999999999     まで               
出力  . . . . . . . . . . . . .   *PDF          *PRINT, *PDF        
                                                                    

商品コードに「から , リストは F4」と説明されていることに注意して欲しい。
次にコマンドのソースを示す。

[サンプル・コマンド: PGM106 ]

0001.00              CMD        PROMPT(' 商品マスター一覧表 ')                   
0002.00              PARM       KWD(HNSFROM) TYPE(*CHAR) LEN(4) CHOICE(*PGM) +   
0003.00                           CHOICEPGM(QTROBJ/PGM106P) +                    
0004.00                           PROMPT(' 品種コード ')                         
0005.00              PARM       KWD(HNSEND) TYPE(*CHAR) LEN(4) DFT(9999) +       
0006.00                           CHOICE(*PGM) CHOICEPGM(QTROBJ/PGM106P)         
0007.00              PARM       KWD(SHFROM) TYPE(*CHAR) LEN(10) CHOICE(*PGM) +   
0008.00                           CHOICEPGM(QTROBJ/PGM106PE) +                   
0009.00                           PROMPT(' 商品コード ')                         
0010.00              PARM       KWD(SHEND) TYPE(*CHAR) LEN(10) +                 
0011.00                           DFT(9999999999) CHOICE(*PGM) +                 
0012.00                           CHOICEPGM(QTROBJ/PGM106P)                      
0013.00              PARM       KWD(OUTPUT) TYPE(*CHAR) LEN(8) RSTD(*YES) +      
0014.00                           DFT(*PDF) VALUES(*PRINT *PDF) +                
0015.00                           PROMPT(' 出力 ')                               

プログラム選択として2つのプログラムが使われている。
PGM106P と PGM106PE である。

[ 選択プログラム : PGM106P ]

0001.00              PGM        PARM(&CMDPRM1 &RTNVAR)                       
0002.00              DCL        VAR(&CMDPRM1) TYPE(*CHAR) LEN(21)            
0003.00              DCL        VAR(&CMD) TYPE(*CHAR) LEN(10)                
0004.00              DCL        VAR(&KWD) TYPE(*CHAR) LEN(10)                
0005.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                
0006.00              DCL        VAR(&RTNVAR) TYPE(*CHAR) LEN(2000)           
0007.00                                                                      
0008.00              CHGVAR     VAR(&CMD) VALUE(%SST(&CMDPRM1 1 10))         
0009.00              CHGVAR     VAR(&KWD) VALUE(%SST(&CMDPRM1 11 10))        
0010.00              CHGVAR     VAR(&TYPE) VALUE(%SST(&CMDPRM1 21 1))        
0011.00 /*( テキスト )*/                                                     
0012.00              IF         COND(&TYPE *EQ 'C') THEN(DO)                 
0013.00              IF         COND((&KWD *EQ 'HNSFROM   ') *OR (&KWD *EQ + 
0014.00                           'SHFROM    ') *OR (&KWD *EQ 'TKFROM    ') +
0015.00                           *OR (&KWD *EQ 'SRFROM    ')) THEN(DO)      
0016.00              CHGVAR     VAR(&RTNVAR) VALUE(' から ')                 
0017.00              ENDDO                                                   
0018.00              ELSE       CMD(DO)                                      
0019.00              CHGVAR     VAR(&RTNVAR) VALUE(' まで ')                 
0020.00              ENDDO                                                   
0021.00              RETURN                                                  
0022.00              ENDDO                                                   
0023.00                                                                      
0024.00              ENDPGM 

[解説]

このPGM106Pは簡単でパラメータは2つと決まっていて

0001.00              PGM        PARM(&CMDPRM1 &RTNVAR)                       
0002.00              DCL        VAR(&CMDPRM1) TYPE(*CHAR) LEN(21)
 :
0006.00              DCL        VAR(&RTNVAR) TYPE(*CHAR) LEN(2000)

として &CMDPARM1 にはコマンド名+ キー・ワード名 + 処理タイプが渡されるので

0008.00              CHGVAR     VAR(&CMD) VALUE(%SST(&CMDPRM1 1 10))         
0009.00              CHGVAR     VAR(&KWD) VALUE(%SST(&CMDPRM1 11 10))        
0010.00              CHGVAR     VAR(&TYPE) VALUE(%SST(&CMDPRM1 21 1))

によってコマンド名: &CMD, キー・ワード名: &KWD と 処理タイプ: &TYPE
受取る。
そしてキー・ワード名が HNSFROM, SHFROM または SRFROMなどの
開始を示すフィールド名であれば文字列「から」を

0016.00              CHGVAR     VAR(&RTNVAR) VALUE(' から ') 

のようにして戻す。それ以外であれば

0019.00              CHGVAR     VAR(&RTNVAR) VALUE(' まで ')

のようにして「まで」を戻す。
このようにして「から」「まで」をキー・ワードの後続に表示することができる。

次にリスト表示を行う選択プログラム: PGM106PE を紹介しよう。

[ 選択プログラム : PGM106PE ]

0001.00              PGM        PARM(&CMDPRM1 &RTNVAR)                            
0002.00              DCL        VAR(&CMDPRM1) TYPE(*CHAR) LEN(21)                 
0003.00              DCL        VAR(&CMD) TYPE(*CHAR) LEN(10)                     
0004.00              DCL        VAR(&KWD) TYPE(*CHAR) LEN(10)                     
0005.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                     
0006.00              DCL        VAR(&RTNVAR) TYPE(*CHAR) LEN(2000)                
0007.00                                                                           
0008.00              CHGVAR     VAR(&CMD) VALUE(%SST(&CMDPRM1 1 10))              
0009.00              CHGVAR     VAR(&KWD) VALUE(%SST(&CMDPRM1 11 10))             
0010.00              CHGVAR     VAR(&TYPE) VALUE(%SST(&CMDPRM1 21 1))             
0011.00                                                                           
0012.00              SELECT                                                       
0013.00 /*( テキスト )*/                                                          
0014.00              WHEN       COND(&TYPE *EQ 'C') THEN(DO)                      
0015.00              IF         COND((&KWD *EQ 'HNSFROM   ') *OR (&KWD *EQ +      
0016.00                           'SHFROM    ') *OR (&KWD *EQ 'TKFROM    ') +     
0017.00                           *OR (&KWD *EQ 'SRFROM    ')) THEN(DO)           
0018.00              CHGVAR     VAR(&RTNVAR) VALUE(' から , リストは F4')         
0019.00              ENDDO                                                        
0020.00              ELSE       CMD(DO)                                           
0021.00              CHGVAR     VAR(&RTNVAR) VALUE(' まで ')                      
0022.00              ENDDO                                                        
0023.00              RETURN                                                       
0024.00              ENDDO                                        
0025.00 /*( リストは F4 )*/                                       
0026.00              WHEN       COND(&TYPE *EQ 'P') THEN(DO)      
0027.00              CALL       PGM(QTROBJ/PGM106F) PARM(&RTNVAR) 
0028.00              RETURN                                       
0029.00              ENDDO                                        
0030.00              ENDSELECT                                    
0031.00                                                           
0032.00              ENDPGM                                       

[解説]

PGM006E は CLPでも使用可能になった SELECT-WHEN を使って記述している。

   SELECT
   WHEN
    :
   ENDSELECT

のような書き方であり ILE-RPGの SELECT- ENDSL と似ている。

さてエンド・ユーザーが「から , リストは F4」のキー・ワードにカーソルを合わせて
F4キーを押すと &TYPEには文字 P が入るのでこのとき次のILE-RPG : PGM006Fが
呼び出されて実行される。

[ ILE-RPG: PGM006F ]

0001.00 H DFTNAME(PGM106F) DATEDIT(*YMD/)                                                  
0002.00 F******** CHOICEPGM : 商品マスターを検索 ***************************               
0003.00 FSHOHIN    IF   E           K DISK                                                 
0004.00 F                                     EXTFILE('QTRFIL/SHOHIN')                     
0005.00 F*******************************************************************               
0006.00 D N               S              4S 0                                              
0007.00 D POS             S              4S 0 INZ(3)                                       
0008.00                                                                                    
0009.00 DRECL#            DS                                                               
0010.00 D  RECL                   1      2B 0 INZ(10)                                      
0011.00                                                                                    
0012.00 DTOTAL#           DS                                                               
0013.00 D  TOTAL                  1      2B 0 INZ(0)                                       
0014.00 C*-------------------------------------------------------------------------+       
0015.00 C     *ENTRY        PLIST                                                  |       
0016.00 C                   PARM                    RTNVAR         2000            |       
0017.00 C*-------------------------------------------------------------------------+       
0018.00 C     *LOVAL        SETLL     SHOHIN                                               
0019.00 C     1             DO        *HIVAL        N                                      
0020.00 C                   SETOFF                                       50                
0021.00 C                   READ      SHOHIN                                 50            
0022.00 C   50              LEAVE                                                          
0023.00  *( レコード長 10 バイトを更新 )                                                   
0024.00 C                   EVAL      %SUBST(RTNVAR:POS:2)  = RECL#          
0025.00 C                   EVAL      POS += 2                               
0026.00  *( 商品コードを更新 )                                               
0027.00 C                   EVAL      %SUBST(RTNVAR:POS:10) = SHCODE         
0028.00 C                   EVAL      POS += 10                              
0029.00 C                   ENDDO                                            
0030.00  *( 合計数を書き込む )                                               
0031.00 C                   EVAL      TOTAL = N -1                           
0032.00 C                   EVAL      %SUBST(RTNVAR:1:2) = TOTAL#            
0033.00 C                   SETON                                        LR  
0034.00 C                   RETURN                                           

[解説]

商品マスター: SHOHINを読み取って RTNVAR という2000バイトの変数に入れているだけの
簡単なプログラムである。
ただし RTNVAR は

合計数
2バイト
1番目 2番目 ….. N番目
長さ レコード 長さ レコード ….. 長さ レコード
2バイト 2バイト 2バイト
















というように構成しなければならない。

エンド・ユーザーがF4キーを押すと次のように表示される。

                    パラメーターの値の指定    SHFROM 
                                                     
 選択項目を入力して,実行キーを押してください。      
                                                     
 タイプ  . . . . . . . . . . . :   文字              
 商品コード  . . . . . . . . . .                     
                                                     
NV-BS30S                             RX-DT75         
NV-BS50S                             SC-CH150        
NV-CF1                               SC-CH505        
NV-CF2                               SC-CH655        
NV-CF81                              SC-CH950        
NV-CF9                               SF-SDCD         
NV-F850                              TH-19VS30       
NV-HK1                               TH-21VS30       
NV-H1T-S                             TH-25GF10       
NV-SX10                              TH-25GV10       
NV-W1                                TH-25VS30       
RX-AZ1                               TH-29GF10       
RX-BZ1                               TH-29GV10       

[解説]

これは良くIBM iのユーティリティ・コマンドで見かけるコマンドの検索と同じである。
開発者のこのような検索機能のためにDSPFもSFLも開発する必要はない。
しかもコマンドで提供される機能なのでバグも発生しない。

この「F4=リスト」による検索方法はスマートで洗練されている。
是非社内の適用業務にも利用して頂きたい。