データ待ち行列 ( *DTAQ ) は、プロセス間通信などのプログラム間の
情報通信によく利用される。
データ待ち行列の作成は CRTDTAQ コマンドで作成することができるし
削除は DLTDTAQ コマンドによって削除することができる。
ところがデータ待ち行列 ( *DTAQ ) の中身をクリヤー(消去)するための
コマンドは用意されていない。
そこで CLRDTAQ というコマンドをここで用意した。
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(' ライブラリー ')
CRTCMD CMD(MYLIB/CLRDTAQ) PGM(MYLIB/CLRDTAQCL) SRCFILE(MYSRCLIB/QCMDSRC)AUT(*ALL)
0001.00 PGM PARM(&DTAQLIB)
0002.00 /*-------------------------------------------------------------------*/
0003.00 /* CLRDTAQCL : データ待ち行列のクリヤー */
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 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
0024.00
0025.00 /*( 環境の取得 )*/
0026.00 RTVJOBA TYPE(&TYPE)
0027.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */
0028.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ')
0029.00 ENDDO /* バッチ */
0030.00 ELSE CMD(DO) /* 対話式 */
0031.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ')
0032.00 ENDDO /* 対話式 */
0033.00
0034.00 /*( パラメータの取得 )*/
0035.00 CHGVAR VAR(&DTAQ) VALUE(%SST(&DTAQLIB 01 10))
0036.00 CHGVAR VAR(&DTALIB) VALUE(%SST(&DTAQLIB 11 10))
0037.00
0038.00 /*( DTAQ のクリヤー )*/
0039.00 CALL PGM(QCLRDTAQ) PARM(&DTAQ &DTALIB)
0040.00
0041.00 /*( 完了メッセージ )*/
0042.00 CHGVAR VAR(&MSG) VALUE(' データ待ち行列 ' *CAT +
0043.00 &DTALIB *TCAT '/' *CAT &DTAQ *TCAT +
0044.00 ' をクリヤーしました。 ')
0045.00 CHGVAR VAR(&MSGTYPE) VALUE('*DIAG ')
0046.00 GOTO SNDMSG
0047.00 RETURN
0048.00
0049.00 APIERR:
0050.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7))
0051.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))
0052.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ')
0053.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ')
0054.00 GOTO SNDMSG
0055.00
0056.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +
0057.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +
0058.00 MSGFLIB(&MSGFLIB)
0059.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO)
0060.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +
0061.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)
0062.00 ENDDO
0063.00 ELSE CMD(DO)
0064.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
0065.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +
0066.00 MSGTYPE(&MSGTYPE)
0067.00 ENDDO
0068.00 ENDPGM
CRTCLPGM PGM(MYLIB/CLROUTQCL) SRCFILE(MYSRCLIB/QCLSRC) AUT(*ALL)
データ待ち行列をクリヤーする API : QCLRDTAQ が i5/OS によって用意されているので、
これを呼び出して実行するだけの簡単なものである。