RPG

554. F4=プロンプト検索は34バイトまでの制限がある

コマンド入力でオブジェクト名を
検索するためには

             PARM       KWD(GOOGLE) TYPE(*CHAR) LEN(40) CASE(*MIXED) + 
                          CHOICE(*PGM) CHOICEPGM(CHAO.COM/GOOGLE) +    
                          PMTCTL(GOOGLE) PROMPT('Google モデル ')      

のようにして CHOICEPGM を指定すれば良い。
CHOICEPGM とは次のような例であり非常に便利になる機能である。

                                                                         
仮想印刷装置  . . . . . . . .                    リストは F4 または *ALL 
                                                                         

CHOICEPGMでは通常表示の場合とF4=検索キーを押された場合を
受け取ったパラメータで識別できるので
F4キーを押されたときはデータを読んで戻せばよい。
戻す形式は

[2バイト戻り項目数] + [2バイト:レコードの長さ + レコード] +
[2バイト:レコードの長さ + レコード] +
:
[2バイト:レコードの長さ + レコード] +

の形式で戻せばよい。
IBMコマンドのようにF4キーで動的に検索できれば
わかりやすくてユーザーの操作性も良くなる。

[CHOICEPGMサンプル]

ソースはこちらから

0001.00              PGM        PARM(&RCVCMD  &SNDPRM)                          
0002.00 /*-------------------------------------------------------------------*/ 
0003.00 /*   GOOGLE    :  プロンプト選択プログラム  (CHOICEPGM)              */ 
0004.00 /*                GOOGLE モデルの検索                                */ 
0005.00 /*                                                                   */ 
0006.00 /*   2020/04/01  作成                                                */ 
0007.00 /*-------------------------------------------------------------------*/ 
0008.00              DCL        VAR(&RCVCMD) TYPE(*CHAR) LEN(21)                
0009.00              DCL        VAR(&CMD) TYPE(*CHAR) LEN(10)                   
0010.00              DCL        VAR(&KWD) TYPE(*CHAR) LEN(10)                   
0011.00              DCL        VAR(&ACT) TYPE(*CHAR) LEN(1)                    
0012.00              DCL        VAR(&SNDPRM) TYPE(*CHAR) LEN(2000)              
0013.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                  
0014.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                  
0015.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)                  
0016.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)               
0017.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)               
0018.00              DCL        VAR(&DEC08) TYPE(*DEC) LEN(8 0)                 
0019.00              DCL        VAR(&DTALEN) TYPE(*CHAR) LEN(4) /* 2 進数  */   
0020.00              DCL        VAR(&BIN4)   TYPE(*CHAR) LEN(4) /* 2 進数  */   
0021.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(116) +             
0022.00                           VALUE(X'0000007400000000') /* 2 進数  */      
0023.00              DCL        VAR(&PRMHED) TYPE(*CHAR) LEN(30)                
0024.00              DCL        VAR(&TOTAL) TYPE(*CHAR) LEN(2)                   
0025.00              DCL        VAR(&PRM1992) TYPE(*CHAR) LEN(1992)              
0026.00              DCL        VAR(&LEN) TYPE(*DEC) LEN(8 0)                    
0027.00              DCL        VAR(&NULL) TYPE(*CHAR) LEN(1) VALUE(X'00')       
0028.00              DCL        VAR(&COUNT) TYPE(*DEC) LEN(8 0)                  
0029.00              DCL        VAR(&RECORD) TYPE(*CHAR) LEN(42)                 
0030.00              DCL        VAR(&RECLEN) TYPE(*CHAR) LEN(2) VALUE(X'0022')   
0031.00              DCL        VAR(&KBN) TYPE(*CHAR) LEN(1)                     
0032.00              DCL        VAR(&OBJOBJLIB) TYPE(*CHAR) LEN(20) +            
0033.00                           VALUE('オブジェクト/ライブラリー')                      
0034.00              DCL        VAR(&STRPOS) TYPE(*CHAR) LEN(4) +                
0035.00                           VALUE(X'0000007D') /* 2 進数開始位置  : +      
0036.00                           125 */                                         
0037.00              DCL        VAR(&LENDTA) TYPE(*CHAR) LEN(4) +                
0038.00                           VALUE(X'00000010') /* 2 進数受取長さ  : 16 */  
0039.00              DCL        VAR(&RCVVAR) TYPE(*CHAR) LEN(16) +               
0040.00                           VALUE(X'0000000000000000')                     
0041.00              DCL        VAR(&OFFSET) TYPE(*CHAR) LEN(4) /* +             
0042.00                           2 進数 オフセット */                                
0043.00              DCL        VAR(&NOENTR) TYPE(*CHAR) LEN(4) /* +             
0044.00                           2 進数項目数  */                               
0045.00              DCL        VAR(&LSTSIZ) TYPE(*CHAR) LEN(4) /* +             
0046.00                           2 進数リストサイズ  */                         
0047.00              DCL        VAR(&ADDLEN) TYPE(*DEC) LEN(8 0) /* WORK */      
0048.00              DCL        VAR(&NOENT) TYPE(*DEC) LEN(8 0) /* WORK */        
0049.00              DCL        VAR(&N) TYPE(*DEC) LEN(8 0) VALUE(1) /* WORK */   
0050.00              DCL        VAR(&RCVDTA) TYPE(*CHAR) LEN(1024) /* +           
0051.00                            受取データ  */                                 
0052.00              DCL        VAR(&DEC08) TYPE(*DEC) LEN(8 0)                   
0053.00              DCL        VAR(&FLD8) TYPE(*CHAR) LEN(8)                     
0054.00              DCL        VAR(&DEV) TYPE(*CHAR) LEN(10)                     
0055.00              DCL        VAR(&OBJATR) TYPE(*CHAR) LEN(10)                  
0056.00 /*( MODEL の検索 )*/                                                      
0057.00              DCLF       FILE(CHAO.USR/MODEL)                              
0058.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))           
0059.00                                                                           
0060.00              CHGVAR     VAR(&CMD) VALUE(%SST(&RCVCMD 01 10))              
0061.00              CHGVAR     VAR(&KWD) VALUE(%SST(&RCVCMD 11 10))              
0062.00              CHGVAR     VAR(&ACT) VALUE(%SST(&RCVCMD 21 1))               
0063.00              IF         COND(&ACT *EQ &NULL) THEN(DO)                     
0064.00              CHGVAR    VAR(&SNDPRM) VALUE('F4=PROMOT')                    
0065.00              RETURN                                                       
0066.00              ENDDO                                                        
0067.00              IF         COND(&ACT *EQ 'C') THEN(DO)                       
0068.00              CHGVAR    VAR(&SNDPRM) VALUE(' 名前,リストは F4')           
0069.00              RETURN                                                       
0070.00  ENDC:       ENDDO                                                        
0071.00 /*      ************************************************    */            
0072.00 /*          モデルの検索                                    */      
0073.00 /*      ************************************************    */      
0074.00              CHGVAR     VAR(&LEN) VALUE(0)                          
0075.00              CHGVAR     VAR(&COUNT) VALUE(0)                        
0076.00  READ:       RCVF       RCDFMT(MODELR)                              
0077.00              MONMSG     MSGID(CPF0864) EXEC(DO)                     
0078.00              RCVMSG     RMV(*YES)                                   
0079.00              GOTO       REDEND                                      
0080.00              ENDDO                                                  
0081.00              /*( 処理の開始 )*/                                     
0082.00              IF         COND(%SCAN('Google' &AINAME) > 0) THEN(DO)  
0083.00              CHGVAR     VAR(&COUNT) VALUE(&COUNT + 1)               
0084.00              CHGVAR     VAR(&RECORD) VALUE(&RECLEN *CAT &MODEL)     
0085.00              IF         COND(&COUNT *EQ 1) THEN(DO) /*  最初  */    
0086.00              CHGVAR     VAR(&PRM1992) VALUE(&RECORD)                
0087.00              ENDDO      /*  最初  */                                
0088.00              ELSE       CMD(DO) /* 2 番目以降  */                   
0089.00              CHGVAR     VAR(&PRM1992) VALUE(%SST(&PRM1992 1 &LEN) + 
0090.00                           *CAT &RECORD)                             
0091.00              ENDDO      /* 2 番目以降  */                           
0092.00              CHGVAR     VAR(&LEN) VALUE(&LEN + 36)                  
0093.00              ENDDO                                                  
0094.00              /*( 処理の終了 )*/                                     
0095.00              GOTO       READ                                        
0096.00  REDEND:                                                              
0097.00  /*( 合計を記述する )*/                                               
0098.00              CHGVAR     VAR(%BIN(&TOTAL)) VALUE(&COUNT)               
0099.00              CHGVAR     VAR(&SNDPRM) VALUE(&TOTAL *CAT &PRM1992)      
0100.00              RETURN                                                   
0101.00                                                                       
0102.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +           
0103.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 
0104.00                           SNDMSGFLIB(&MSGFLIB)                        
0105.00  SNDMSG:     IF         COND(&MSGID *EQ ' ') THEN(DO)                 
0106.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +   
0107.00                           MSGTYPE(*ESCAPE)                            
0108.00              ENDDO                                                    
0109.00              ELSE       CMD(DO)                                       
0110.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +          
0111.00                           MSGDTA(&MSGDTA) TOMSGQ(*TOPGMQ) +           
0112.00                           MSGTYPE(*ESCAPE)                            
0113.00              ENDDO                                                    
0114.00              DSPJOBLOG  JOB(*) OUTPUT(*PRINT)                         
0115.00  ENDPGM:     ENDPGM    


                                                

[解説]

このCHOICEPGMは「Google」という文字列を含んでいるMODELというファイルの
レコードだけを抽出して選択の候補としてコマンドに戻している。

ところで戻すフィールド: AINAMEは実は40バイトであるが
この40バイトを戻そうとするとどうしても実行時には

許容値のリストに正しくない長さが定義された。

のエラーが発生してしまう。非常にわかりにくい日本語である。
この原因が不明で苦労して最寄りのAIに相談してみたが
いろいろとアドバイスはあったのだが2時間ほど試しても
解決できないので社員に頼むと10分ばかりで
原因は戻すフィールドの長さは34バイトという制限があることが
わかった。
AIもこれは見逃していたようでもう少ししっかりマニュアルを
調べて欲しいものである。