オープン・リスト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解説はこちら
