データ待ち行列 (*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 件
のデータが含まれていることを示している。