データ待ち行列 (*DTAQ) は読取った途端に中身は消えてしまうことは
前にも紹介した。
それではデータ待ち行列 (*DTAQ) に中身があるのか、ないのかを
どのようにすれば知ることができるのだろうか?
API: QRCVDTAQ でデータ待ち行列 (*DTAQ) を読取ればわかるのだが
読取った途端に *DTAQ の中身は消滅してしまうので
*DTAQ として再利用はできなくなってしまう。
幸い、*DTAQ の属性を調べる API: QMHQRDQD が用意されているので
これを利用すると属性を知ることができる。
0001.00 CMD PROMPT(' データ待ち行列の記述 ')
0002.00 PARM KWD(DTAQ) TYPE(DTAQ) +
0003.00 PROMPT(' データ待ち行列 ')
0004.00 DTAQ: QUAL TYPE(*NAME) LEN(10) MIN(1)
0005.00 QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) +
0006.00 SPCVAL((*LIBL) (*CURLIB)) +
0007.00 PROMPT(' ライブラリー ')
0001.00 PGM PARM(&DTAQLIB)
0002.00 /*-------------------------------------------------------------------*/
0003.00 /* DSPDTAQDCL: データ待ち行列の記述 */
0004.00 /* */
0005.00 /* 2017/06/17 作成 */
0006.00 /*-------------------------------------------------------------------*/
0007.00 DCL VAR(&DTAQLIB) TYPE(*CHAR) LEN(20)
0008.00 DCL VAR(&DTAQ) TYPE(*CHAR) LEN(10)
0009.00 DCL VAR(&DTALIB) TYPE(*CHAR) LEN(10)
0010.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132)
0011.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7)
0012.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10)
0013.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
0014.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132)
0015.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1)
0016.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)
0017.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +
0018.00 VALUE('*ESCAPE ')
0019.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) +
0020.00 VALUE(X'000074') /* 2 進数 */
0021.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) +
0022.00 VALUE(X'00000000')
0023.00 /*( API : QMHQRDQD 用の変数 )*/
0024.00 DCL VAR(&RCVVAR) TYPE(*CHAR) LEN(1024)
0025.00 DCL VAR(&RCVLEN) TYPE(*CHAR) LEN(4) VALUE(X'0400')
0026.00 DCL VAR(&BIN4) TYPE(*CHAR) LEN(4)
0027.00 DCL VAR(&MSGLEN) TYPE(*DEC) LEN(8 0)
0028.00 DCL VAR(&KKMSU) TYPE(*DEC) LEN(8 0)
0029.00 DCL VAR(&CHAR8) TYPE(*CHAR) LEN(8)
0030.00 DCL VAR(&MSGLENC) TYPE(*CHAR) LEN(8)
0031.00 DCL VAR(&KKMSUC) TYPE(*CHAR) LEN(8)
0032.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
0033.00
0034.00 /*( 環境の取得 )*/
0035.00 RTVJOBA TYPE(&TYPE)
0036.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */
0037.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ')
0038.00 ENDDO /* バッチ */
0039.00 ELSE CMD(DO) /* 対話式 */
0040.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ')
0041.00 ENDDO /* 対話式 */
0042.00
0043.00 /*( パラメータの取得 )*/
0044.00 CHGVAR VAR(&DTAQ) VALUE(%SST(&DTAQLIB 01 10))
0045.00 CHGVAR VAR(&DTALIB) VALUE(%SST(&DTAQLIB 11 10))
0046.00
0047.00 /*( DTAQ 属性の検索 )*/
0048.00 CALL PGM(QMHQRDQD) PARM(&RCVVAR &RCVLEN +
0049.00 'RDQD0100' &DTAQLIB)
0050.00 /*( 属性の取出し )*/
0051.00 CHGVAR VAR(&BIN4) VALUE(%SST(&RCVVAR 9 4))
0052.00 CHGVAR VAR(&MSGLEN) VALUE(%BIN(&BIN4))
0053.00 CHGVAR VAR(&MSGLENC) VALUE(&MSGLEN)
0054.00 MSGLEN_: IF COND(%SST(&MSGLENC 1 1) *EQ '0') THEN(DO)
0055.00 CHGVAR VAR(&MSGLENC) VALUE(%SST(&MSGLENC 2 7))
0056.00 GOTO MSGLEN_
0057.00 ENDDO
0058.00
0059.00 CHGVAR VAR(&BIN4) VALUE(%SST(&RCVVAR 73 4))
0060.00 CHGVAR VAR(&KKMSU) VALUE(%BIN(&BIN4))
0061.00 CHGVAR VAR(&KKMSUC) VALUE(&KKMSU)
0062.00 KKMSUC_: IF COND(%SST(&KKMSUC 1 1) *EQ '0') THEN(DO)
0063.00 CHGVAR VAR(&KKMSUC) VALUE(%SST(&KKMSUC 2 7))
0064.00 GOTO KKMSUC_
0065.00 ENDDO
0066.00 IF COND(&KKMSUC = ' ') THEN(DO)
0067.00 CHGVAR VAR(&KKMSUC) VALUE('0')
0068.00 ENDDO
0069.00 /*( 完了メッセージ )*/
0070.00 CHGVAR VAR(&MSG) VALUE(&DTALIB *TCAT '/' *CAT &DTAQ +
0071.00 *TCAT ' のレコード長は ' *CAT &MSGLENC +
0072.00 *TCAT ', 項目数は ' *CAT &KKMSUC *TCAT +
0073.00 ' です。 ')
0074.00 CHGVAR VAR(&MSGTYPE) VALUE('*DIAG ')
0075.00 GOTO SNDMSG
0076.00
0077.00 RETURN
0078.00
0079.00 APIERR:
0080.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7))
0081.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))
0082.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ')
0083.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ')
0084.00 GOTO SNDMSG
0085.00
0086.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +
0087.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +
0088.00 MSGFLIB(&MSGFLIB)
0089.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO)
0090.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +
0091.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)
0092.00 ENDDO
0093.00 ELSE CMD(DO)
0094.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
0095.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +
0096.00 MSGTYPE(&MSGTYPE)
0097.00 ENDDO
0098.00 ENDPGM
コマンド: DSPDTAQD は *DTAQ の項目の長さ ( = 1 レコード長) と
項目数 ( = レコード件数) を調べてメッセージとして出力する。
例えば
> DSPDTAQD DTAQ(QGPLTEMP/VTDTAQ) QGPLTEMP/VTDTAQ のレコード長は 1024, 項目数は 6 です。
のように結果を示す。
これは *DTAQ : QGPLTEMP/VTDTAQ の中には
6 件のデータが含まれていることを示している。