CL

131. オープン・リストAPI : QGYRPRTL

オープン・リストAPI : QGYRPRTLは装置の一覧を出力するAPIであり
今回は API:QGYRPRTLで出力された結果の検索方法も含めて紹介する。

[ CLP: TESTPRTL : API:QGYRPRTL のテスト ]

ソースはこちらから

0001.00              PGM                                                          
0002.00 /*-------------------------------------------------------------------*/   
0003.00 /*   TESTPRTL   : API:QGYRPRTL のテスト                              */   
0004.00 /*                                                                   */   
0005.00 /*   2020/07/31  作成                                                */   
0006.00 /*-------------------------------------------------------------------*/   
0007.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                    
0008.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                    
0009.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)                    
0010.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)                 
0011.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)                 
0012.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                     
0013.00              DCL        VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)                  
0014.00              DCL        VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +               
0015.00                           VALUE('*ESCAPE   ')                             
0016.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(116) +               
0017.00                           VALUE(X'000074') /* 2 進数  */                  
0018.00              DCL        VAR(&ERR) TYPE(*CHAR) LEN(1)                      
0019.00              DCL        VAR(&NULL4) TYPE(*CHAR) LEN(4) +                  
0020.00                           VALUE(X'00000000')                              
0021.00 /*( QGYRPRTL に必要な変数 )*/                                             
0022.00              DCL        VAR(&RCVBUF) TYPE(*CHAR) LEN(32000)               
0023.00              DCL        VAR(&RCVLEN) TYPE(*CHAR) LEN(4) +                 
0024.00                           VALUE(X'00007D00')                    
0025.00              DCL        VAR(&LISTINFO) TYPE(*CHAR) LEN(80)      
0026.00              DCL        VAR(&LISTSU) TYPE(*CHAR) LEN(4) +       
0027.00                           VALUE(X'0000000A')                    
0028.00              DCL        VAR(&NBRRCD) TYPE(*CHAR) LEN(4) +       
0029.00                           VALUE(X'000001F4') /* 500 個  */      
0030.00              DCL        VAR(&FILTER) TYPE(*CHAR) LEN(40)        
0031.00              DCL        VAR(&BIN0) TYPE(*CHAR) LEN(4) +         
0032.00                           VALUE(X'00000000')                    
0033.00              DCL        VAR(&BIN1) TYPE(*CHAR) LEN(4) +         
0034.00                           VALUE(X'00000001')                    
0035.00              DCL        VAR(&BIN4) TYPE(*CHAR) LEN(4)           
0036.00              DCL        VAR(&PRINTER) TYPE(*CHAR) LEN(10)       
0037.00              DCL        VAR(&OUTQQLIB) TYPE(*CHAR) LEN(20)      
0038.00              DCL        VAR(&RTNSU) TYPE(*DEC) LEN(5 0)         
0039.00              DCL        VAR(&RTNSUC) TYPE(*CHAR) LEN(5)         
0040.00   /*( QGYGTLE  に必要な変数 )*/                                 
0041.00              DCL        VAR(&LSTHND) TYPE(*CHAR) LEN(4)         
0042.00              DCL        VAR(&RCVVAR) TYPE(*CHAR) LEN(64)        
0043.00              DCL        VAR(&N) TYPE(*DEC) LEN(7 0)             
0044.00              DCL        VAR(&STRCNV) TYPE(*CHAR) LEN(4)         
0045.00              DCL        VAR(&TEXT) TYPE(*CHAR) LEN(50)          
0046.00              DCL        VAR(&STSBIN) TYPE(*CHAR) LEN(4)         
0047.00   /*( QDCRDEVD  に必要な変数 )*/                                
0048.00              DCL        VAR(&RCVDEV) TYPE(*CHAR) LEN(1024)             
0049.00              DCL        VAR(&DEVLEN) TYPE(*CHAR) LEN(4) +              
0050.00                           VALUE(X'00000400')                           
0051.00              DCL        VAR(&DEV) TYPE(*CHAR) LEN(10)                  
0052.00              DCL        VAR(&CLASS) TYPE(*CHAR) LEN(10)                
0053.00              DCL        VAR(&COUNT) TYPE(*DEC) LEN(5 0)                
0054.00              DCL        VAR(&COUNTC) TYPE(*CHAR) LEN(5)                
0055.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))        
0056.00                                                                        
0057.00 /*( 環境の取得 )*/                                                     
0058.00              RTVJOBA    TYPE(&TYPE)                                    
0059.00              IF         COND(&TYPE *EQ '0') THEN(DO) /*  バッチ  */    
0060.00              CHGVAR     VAR(&TOPGMQ) VALUE('*SYSOPR   ')               
0061.00              ENDDO      /*  バッチ  */                                 
0062.00              ELSE       CMD(DO) /*  対話式  */                         
0063.00              CHGVAR     VAR(&TOPGMQ) VALUE('*TOPGMQ   ')               
0064.00              ENDDO      /*  対話式  */                                 
0065.00                                                                        
0066.00 /*( プリンタ・リストのオープン )*/                                     
0067.00              CHGVAR     VAR(%SST(&LISTINFO 1 4)) VALUE(&LISTSU)        
0068.00              CHGVAR     VAR(&FILTER) VALUE(&BIN0 *CAT &BIN0)           
0069.00              CALL       PGM(QGYRPRTL) PARM(&RCVBUF &RCVLEN &LISTINFO + 
0070.00                           &NBRRCD &FILTER 'PRTL0100' &APIERR)          
0071.00              IF         COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)    
0072.00              SNDPGMMSG  +                                                 
0073.00                           MSG('API: QGYRPRTL の実行で次のエラーが発生 +   
0074.00                            しました。 ') MSGTYPE(*DIAG)                   
0075.00              GOTO       APIERR                                            
0076.00              ENDDO                                                        
0077.00              CHGVAR     VAR(&BIN4) VALUE(%SST(&LISTINFO 1 4))             
0078.00              CHGVAR     VAR(&RTNSU) VALUE(%BIN(&BIN4))                    
0079.00              IF         COND(&RTNSU *EQ 0) THEN(DO) /* +                  
0080.00                            戻り数がない  */                               
0081.00              GOTO       ENDLIST                                           
0082.00              ENDDO      /*  戻り数がない  */                              
0083.00 /*( リスト検索の開始 )*/                                                  
0084.00              IF         COND(&RTNSU > 0) THEN(DO) /*  戻り数 >0 */        
0085.00              CHGVAR     VAR(&LSTHND) VALUE(%SST(&LISTINFO 9 4))           
0086.00              CHGVAR     VAR(&N) VALUE(1)                                  
0087.00              CHGVAR     VAR(%BIN(&NBRRCD)) VALUE(1)                       
0088.00              CHGVAR     VAR(%BIN(&STRCNV)) VALUE(1)                       
0089.00              CHGVAR     VAR(%BIN(&RCVLEN)) VALUE(64)                      
0090.00              CHGVAR     VAR(&COUNT) VALUE(0)                              
0091.00  LOOP:       CALL       PGM(QGYGTLE) PARM(&RCVVAR &RCVLEN &LSTHND +       
0092.00                           &LISTINFO &NBRRCD &STRCNV &APIERR)              
0093.00              IF         COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)       
0094.00              SNDPGMMSG  +                                                 
0095.00                           MSG('API: QGYGTLE の実行で次のエラーが発生 +    
0096.00                            しました。 ') MSGTYPE(*DIAG)                
0097.00              GOTO       APIERR                                         
0098.00              ENDDO                                                     
0099.00              /*( 戻り値を取得する )*/                                  
0100.00              CHGVAR     VAR(&PRINTER) VALUE(%SST(&RCVVAR 1 10))        
0101.00              CHGVAR     VAR(&TEXT) VALUE(%SST(&RCVVAR 11 50))          
0102.00              CHGVAR     VAR(&STSBIN) VALUE(%SST(&RCVVAR 61 4))         
0103.00  /*( *VRT のプリンタだけを選択する )*/                                 
0104.00              /*( 装置のクラスを調べる )*/                              
0105.00              CHGVAR     VAR(&DEV) VALUE(&PRINTER)                      
0106.00              CALL       PGM(QDCRDEVD) PARM(&RCVDEV &DEVLEN +           
0107.00                           'DEVD1100' &DEV &APIERR)                     
0108.00              IF         COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)    
0109.00              SNDPGMMSG  +                                              
0110.00                           MSG('API: QDCRDEVD の実行で次のエラーが発生 +
0111.00                            しました。 ') MSGTYPE(*DIAG)                
0112.00              GOTO       APIERR                                         
0113.00              ENDDO                                                     
0114.00              CHGVAR     VAR(&CLASS) VALUE(%SST(&RCVDEV 153 10))        
0115.00              IF         COND(&CLASS *NE '*VRT') THEN(DO)               
0116.00              GOTO       BYPAS                                          
0117.00              ENDDO                                                     
0118.00              SNDPGMMSG  MSG('PRINTER=' *CAT &PRINTER) +                
0119.00                           MSGTYPE(*DIAG)                               
0120.00              CHGVAR     VAR(&COUNT) VALUE(&COUNT + 1)                     
0121.00  BYPAS:      IF         COND(&N < &RTNSU) THEN(DO)                        
0122.00              CHGVAR     VAR(&N) VALUE(&N + 1)                             
0123.00              CHGVAR     VAR(%BIN(&STRCNV)) VALUE(%BIN(&STRCNV) + 1)       
0124.00              GOTO       LOOP                                              
0125.00              ENDDO                                                        
0126.00              CHGVAR     VAR(&COUNTC) VALUE(&COUNT)                        
0127.00  NXTCNT:     IF         COND(%SST(&COUNTC 1 1) = '0') THEN(DO)            
0128.00              CHGVAR     VAR(&COUNTC) VALUE(%SST(&COUNTC 2 4))             
0129.00              GOTO       NXTCNT                                            
0130.00              ENDDO                                                        
0131.00              CHGVAR     VAR(&MSG) VALUE(&COUNTC *TCAT +                   
0132.00                           ' 個のプリンターが見つかりました。 ')           
0133.00              CHGVAR     VAR(&MSGTYPE) VALUE('*DIAG     ')                 
0134.00              SNDPGMMSG  MSG(&MSG) MSGTYPE(*DIAG)                          
0135.00              RETURN                                                       
0136.00              ENDDO      /*  戻り数 >0 */                                  
0137.00  ENDLIST:    CALL       PGM(QGYCLST) PARM(&LSTHND &APIERR)                
0138.00              RETURN                                                       
0139.00                                                                           
0140.00  APIERR:                                                                  
0141.00              CHGVAR     VAR(&MSGID) VALUE(%SST(&APIERR 9 7))              
0142.00              CHGVAR     VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))          
0143.00              IF         COND(%SST(&MSGID 1 3) *EQ 'GUI') THEN(DO)         
0144.00              CHGVAR     VAR(&MSGF) VALUE('QGUIMSG   ')                
0145.00              ENDDO                                                    
0146.00              ELSE       CMD(DO)                                       
0147.00              CHGVAR     VAR(&MSGF) VALUE('QCPFMSG   ')                
0148.00              ENDDO                                                    
0149.00              CHGVAR     VAR(&MSGFLIB) VALUE('QSYS      ')             
0150.00              GOTO       SNDMSG                                        
0151.00                                                                       
0152.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +           
0153.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 
0154.00                           MSGFLIB(&MSGFLIB)                           
0155.00  SNDMSG:     IF         COND(&MSGID *EQ ' ') THEN(DO)                 
0156.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +   
0157.00                           TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)           
0158.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                   
0159.00              ENDDO                                                    
0160.00              ELSE       CMD(DO)                                       
0161.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +          
0162.00                           MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +           
0163.00                           MSGTYPE(&MSGTYPE)                           
0164.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                   
0165.00              ENDDO                                                    
0166.00              ENDPGM   


                                                  

[解説]

API: QGYRPRTL はプリンター・リストを抽出するAPIである。

API: QGYRPRTL によって得られた &RCVVAR に対して取得したレコード数は
リスト情報に入っているので前回にも示したように

 
0077.00              CHGVAR     VAR(&BIN4) VALUE(%SST(&LISTINFO 1 4))             
0078.00              CHGVAR     VAR(&RTNSU) VALUE(%BIN(&BIN4)) 

で取得することができる。
今回はさらに新しいAPI : QGYGTLE を使ってオープン・リストAPIで得られた情報を
検索する。
前回では : API: QGYOLSPL でスプール情報を検索したのだが
QGYOLSPLの結果も今回の QGYRPRTL の結果もどちらも QGYGTLE を使って
検索することができる。
つまりオープン・リストAPIの結果を検索する場合はどのAPIであっても
いつも同じ QGYGTLE を使って検索することになることを覚えていて欲しい。

さて QGYGTLE を使っての検索ではバッファーの開始位置を自分でカウント・アップしたり
する必要はない。
ポイントなるのは &STRCNV という会話指数である。
これを 1からレコード数分、次々とカウント・アップしていけばよいことになる。
このことは IBM のマニュアルにも書かれていない重要なことであるが
IBMマニュアルにサンプル・ソースもないので検索の方法が想像できないと
このAPIを使うのは不可能になってしまう。
このように解説とサンプルの少なさ(=というか無い)ことがオープン・リストAPIの
使い方を難しくしている。

それともうひとつのポイントは

0085.00              CHGVAR     VAR(&LSTHND) VALUE(%SST(&LISTINFO 9 4)) 

のようにリスト情報からハンドルを取得して
ハンドルと会話指数の組合せで情報をLOOPして取得することである。

最後には次のようにしてハンドルを閉じるのをお忘れなく。

0137.00  ENDLIST:    CALL       PGM(QGYCLST) PARM(&LSTHND &APIERR) 

オープン・リストAPIは最近になって追加されたものではなく
昔から存在して公開されているのだが解説が複雑でしかも十分ではない。

最近は英文のみなので一層、日本人には馴染みのないものとなってしまっている。

 QGYRPRTLのIBM Knowledge Center解説はこちら

QGYGTLE のIBM Knowledge Center解説はこちら