Tools

54. データ待ち行列の特性を調べる DSPDTAQD

データ待ち行列 (*DTAQ) は読取った途端に中身は消えてしまうことは
前にも紹介した。
それではデータ待ち行列 (*DTAQ) に中身があるのか、ないのかを
どのようにすれば知ることができるのだろうか?
API: QRCVDTAQ でデータ待ち行列 (*DTAQ) を読取ればわかるのだが
読取った途端に *DTAQ の中身は消滅してしまうので
*DTAQ として再利用はできなくなってしまう。
幸い、*DTAQ の属性を調べる API: QMHQRDQD が用意されているので
これを利用すると属性を知ることができる。

【 コマンド: DSPDTAQD 】
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(' ライブラリー ')
【 実行 CLP: DSPDTAQDCL 】
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 件のデータが含まれていることを示している。