OUTQ にデータ待ち行列の名前を設定しておくと
OUTQ にスプールが投入されると設定しておいたデータ待ちに
i5/OSがデータを投入するのでこれを読めばOUTQのスプールを
処理することができるようになる。

[例]
CHGOUTQ OUTQ(QUSRSYS/MYOUTQ) DTAQ(OBJLIB/MYDTAQ)
としておくとOUTQ: QUSRSYS/MYOUTQ にスプールが投入されると
OBJLIB/MYDTAQ にデータが投入されるので
これを読むプログラムで作成して実行すれば
OUTQへの投入を監視することができる。
[ サンプルCLP: AB1_SAMPLE ]
ソースはこちらから
0001.00 PGM
0002.00 /*-------------------------------------------------------------------*/
0003.00 /* AB1_SAMPLE : OUTQ 設定のデータ待ち行列の読取り */
0004.00 /* */
0005.00 /* 2021/05/30 作成 */
0006.00 /*-------------------------------------------------------------------*/
0007.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
0008.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132)
0009.00 DCL VAR(&STMMSG) TYPE(*CHAR) LEN(132)
0010.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7)
0011.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10)
0012.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
0013.00 DCL VAR(&MSGKEY) TYPE(*CHAR) LEN(4)
0014.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132)
0015.00 DCL VAR(&ERRDTA) TYPE(*CHAR) LEN(132)
0016.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1)
0017.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)
0018.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +
0019.00 VALUE('*ESCAPE ')
0020.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) +
0021.00 VALUE(X'000074') /* 2 進数 */
0022.00 DCL VAR(&ERR) TYPE(*CHAR) LEN(1)
0023.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) +
0024.00 VALUE(X'00000000')
0025.00 /*( QRCVDTAQ の変数 )*/
0026.00 DCL VAR(&RCVDTA) TYPE(*CHAR) LEN(128)
0027.00 DCL VAR(&RCVLEN) TYPE(*DEC) LEN(5 0) VALUE(128)
0028.00 DCL VAR(&WAIT) TYPE(*DEC) LEN(5 0) VALUE(0)
0029.00 /*( DTAQ 情報 )*/
0030.00 DCL VAR(&JOB) TYPE(*CHAR) LEN(10)
0031.00 DCL VAR(&USER) TYPE(*CHAR) LEN(10)
0032.00 DCL VAR(&JOBNBR) TYPE(*CHAR) LEN(6)
0033.00 DCL VAR(&SPLF) TYPE(*CHAR) LEN(10)
0034.00 DCL VAR(&SPLNB) TYPE(*CHAR) LEN(4)
0035.00 DCL VAR(&SPLNO) TYPE(*DEC) LEN(6 0)
0036.00 DCL VAR(&SPLNOC) TYPE(*CHAR) LEN(6)
0037.00 DCL VAR(&OUTQ) TYPE(*CHAR) LEN(10)
0038.00 DCL VAR(&OUTQLIB) TYPE(*CHAR) LEN(10)
0039.00 DCL VAR(&SYSTEM) TYPE(*CHAR) LEN(8)
0040.00 MONMSG MSGID(CPF9999) EXEC(GOTO CMDLBL(ERROR))
0041.00
0042.00 /*( 環境の取得 )*/
0043.00 RTVJOBA TYPE(&TYPE)
0044.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */
0045.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ')
0046.00 ENDDO /* バッチ */
0047.00 ELSE CMD(DO) /* 対話式 */
0048.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ')
0049.00 ENDDO /* 対話式 */
0050.00
0051.00 /*( 待ち行列 DTAQ からのデータ取得 )*/
0052.00 READ: CALL PGM(QRCVDTAQ) PARM('MYDTAQ ' 'QTEMP ' +
0053.00 &RCVLEN &RCVDTA &WAIT)
0054.00 IF COND(&RCVLEN *EQ 0) THEN(GOTO CMDLBL(REDEND))
0055.00 CHGVAR VAR(&JOB) VALUE(%SST(&RCVDTA 13 10))
0056.00 CHGVAR VAR(&USER) VALUE(%SST(&RCVDTA 23 10))
0057.00 CHGVAR VAR(&JOBNBR) VALUE(%SST(&RCVDTA 33 6))
0058.00 CHGVAR VAR(&SPLF) VALUE(%SST(&RCVDTA 39 10))
0059.00 CHGVAR VAR(&SPLNB) VALUE(%SST(&RCVDTA 49 4))
0060.00 CHGVAR VAR(&SPLNO) VALUE(%BIN(&SPLNB))
0061.00 CHGVAR VAR(&SPLNOC) VALUE(&SPLNO)
0062.00 CHGVAR VAR(&OUTQ) VALUE(%SST(&RCVDTA 53 10))
0063.00 CHGVAR VAR(&OUTQLIB) VALUE(%SST(&RCVDTA 63 10))
0064.00 CHGVAR VAR(&SYSTEM) VALUE(%SST(&RCVDTA 73 8))
0065.00 /*************************/
0066.00 /* 処理の開始 - ここから */
0067.00 /*************************/
0068.00 /*************************/
0069.00 /* 処理の開始 - ここまで */
0070.00 /*************************/
0071.00 GOTO READ
0072.00 REDEND: RETURN
0073.00
0074.00 APIERR:
0075.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7))
0076.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))
0077.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ')
0078.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ')
0079.00 GOTO SNDMSG
0080.00
0081.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) KEYVAR(&MSGKEY) +
0082.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +
0083.00 MSGFLIB(&MSGFLIB)
0084.00 IF COND(&MSGID *EQ 'CPF9999') THEN(DO)
0085.00 CHGVAR VAR(&ERRDTA) VALUE(&MSGDTA)
0086.00 RCVMSG MSGTYPE(*PRV) MSGKEY(&MSGKEY) RMV(*NO) +
0087.00 MSG(&MSG) MSGDTA(&MSGDTA) MSGID(&MSGID) +
0088.00 MSGF(&MSGF) MSGFLIB(&MSGFLIB)
0089.00 CHGVAR VAR(&STMMSG) VALUE(' プログラム ' *CAT +
0090.00 %SST(&ERRDTA 8 10) *TCAT +
0091.00 ' のステートメント ' *CAT %SST(&ERRDTA +
0092.00 24 4) *CAT ' で次のエラーが発生しました。 ')
0093.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STMMSG) +
0094.00 TOMSGQ(&TOPGMQ) MSGTYPE(*DIAG)
0095.00 ENDDO
0096.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO)
0097.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +
0098.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)
0099.00 MONMSG MSGID(CPF2400) EXEC(RETURN)
0100.00 ENDDO
0101.00 ELSE CMD(DO)
0102.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
0103.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +
0104.00 MSGTYPE(&MSGTYPE)
0105.00 MONMSG MSGID(CPF2400) EXEC(RETURN)
0106.00 ENDDO
0107.00 ENDPGM
[解説]
051.00 /*( 待ち行列 DTAQ からのデータ取得 )*/
0052.00 READ: CALL PGM(QRCVDTAQ) PARM('MYDTAQ ' 'QTEMP ' +
0053.00 &RCVLEN &RCVDTA &WAIT)
でデータ待ち行列: MYDTAQ QTEMP からのデータを読み取って
0054.00 IF COND(&RCVLEN *EQ 0) THEN(GOTO CMDLBL(REDEND))
で読取り終了を検知している。
読取ったスプール情報は
0055.00 CHGVAR VAR(&JOB) VALUE(%SST(&RCVDTA 13 10)) 0056.00 CHGVAR VAR(&USER) VALUE(%SST(&RCVDTA 23 10)) 0057.00 CHGVAR VAR(&JOBNBR) VALUE(%SST(&RCVDTA 33 6)) 0058.00 CHGVAR VAR(&SPLF) VALUE(%SST(&RCVDTA 39 10)) 0059.00 CHGVAR VAR(&SPLNB) VALUE(%SST(&RCVDTA 49 4)) 0060.00 CHGVAR VAR(&SPLNO) VALUE(%BIN(&SPLNB)) 0061.00 CHGVAR VAR(&SPLNOC) VALUE(&SPLNO) 0062.00 CHGVAR VAR(&OUTQ) VALUE(%SST(&RCVDTA 53 10)) 0063.00 CHGVAR VAR(&OUTQLIB) VALUE(%SST(&RCVDTA 63 10)) 0064.00 CHGVAR VAR(&SYSTEM) VALUE(%SST(&RCVDTA 73 8))
すべて同じであるのでこれを変更する必要はない。
スプールを処理したいのであれば
0065.00 /*************************/ 0066.00 /* 処理の開始 - ここから */ 0067.00 /*************************/ 0068.00 /*************************/ 0069.00 /* 処理の開始 - ここまで */ 0070.00 /*************************/
のあいだに処理を記述すればよい。
