ある特定の印刷待ち行列( DOUTQ
) をつねに監視していて、印刷スプールがその OUTQ に投入されたら、
次々と自動的に処理する方法を紹介する。
ここでは、特定の OUTQ にスプールが投入されたら Spoolライターの CVTSPLF
コマンドを使って、
次々と PDF 化して別の PC サーバーへ Ftpで投入する事例を紹介する。
このことを実現するには OUTQ に対してデータ待ち行列を関連づけて定義する。
OUTQ に印刷スプールが投入されると、その情報がデータ待ち行列に送られるので監視プログラムが
それを察知して、印刷スプールを処理するという方法である。
1. 印刷スプールの投入を検知するためのデータ待ち行列を作成する。
CRTDTAQ DTAQ(QGPL/PDFQ) MAXLEN(128) TEXT('PDFデータ待ち行列') AUT(*ALL)
2. OUTQ に対してデータ待ち行列を関連づける。
CRTOUTQ OUTQ(QGPL/PDFQ) DTAQ(QGPL/PDFQ) AUT(*ALL)
または
CHGOUTQ OUTQ(QGPL/PDFQ) DTAQ(QGPL/PDFQ)
3. サンプルCLPソース
-------------------------------------------------------------------------------- 0001.00 CMD PROMPT('OUTQ 監視 ') 0002.00 PARM KWD(DTAQ) TYPE(DTAQ) PROMPT(' データ待ち行列 ') 0003.00 DTAQ: QUAL TYPE(*NAME) LEN(10) MIN(1) 0004.00 QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) + 0005.00 SPCVAL((*LIBL)) PROMPT(' ライブラリー ') --------------------------------------------------------------------------------
-------------------------------------------------------------------------------- 0001.00 PGM PARM(&DTAQQLIB) 0002.00 /*---------------------------------------------------------*/ 0003.00 /* MONOUTQCL : OUTQ 監視プログラム */ 0004.00 /*---------------------------------------------------------*/ 0005.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0006.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0007.00 DCL VAR(&DTAQQLIB) 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(&JOBINFO) TYPE(*CHAR) LEN(26) 0011.00 DCL VAR(&WAIT) TYPE(*DEC) LEN(5 0) VALUE(99999) + 0012.00 /* 永続待機 */ 0013.00 DCL VAR(&RCVDTA) TYPE(*CHAR) LEN(128) 0014.00 DCL VAR(&SPLF) TYPE(*CHAR) LEN(128) 0015.00 DCL VAR(&JOB) TYPE(*CHAR) LEN(10) 0016.00 DCL VAR(&USER) TYPE(*CHAR) LEN(10) 0017.00 DCL VAR(&JOBNBR) TYPE(*CHAR) LEN(6) 0018.00 DCL VAR(&OUTQQLIB) TYPE(*CHAR) LEN(20) 0019.00 DCL VAR(&OUTQ) TYPE(*CHAR) LEN(10) 0020.00 DCL VAR(&OUTLIB) TYPE(*CHAR) LEN(10) 0021.00 DCL VAR(&SPLNBR) TYPE(*CHAR) LEN(4) 0022.00 DCL VAR(&SPLNO) TYPE(*DEC) LEN(4 0) 0023.00 DCL VAR(&PDF) TYPE(*CHAR) LEN(32) /* + 0024.00 PDF ファイル名 */ 0025.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0026.00 0027.00 RTVJOBA TYPE(&TYPE) 0028.00 CHGVAR VAR(&DTAQ) VALUE(%SST(&DTAQQLIB 01 10)) 0029.00 CHGVAR VAR(&DTALIB) VALUE(%SST(&DTAQQLIB 11 10)) 0030.00 0031.00 /*( 1 ) データ待ち行列から情報を取得 */ 0032.00 READ: CALL PGM(QRCVDTAQ) PARM(&DTAQ &DTALIB 128 + 0033.00 &RCVDTA &WAIT) 0034.00 CHGVAR VAR(&JOBINFO) VALUE(%SST(&RCVDTA 13 26)) 0035.00 CHGVAR VAR(&SPLF) VALUE(%SST(&RCVDTA 39 10)) 0036.00 CHGVAR VAR(&SPLNBR) VALUE(%SST(&RCVDTA 49 4)) 0037.00 CHGVAR VAR(&OUTQQLIB) VALUE(%SST(&RCVDTA 53 20)) 0038.00 0039.00 CHGVAR VAR(&JOB) VALUE(%SST(&JOBINFO 01 10)) 0040.00 CHGVAR VAR(&USER) VALUE(%SST(&JOBINFO 11 10)) 0041.00 CHGVAR VAR(&JOBNBR) VALUE(%SST(&JOBINFO 21 6)) 0042.00 CHGVAR VAR(&SPLNO) VALUE(%BIN(&SPLNBR)) 0043.00 CHGVAR VAR(&OUTQ) VALUE(%SST(&OUTQQLIB 01 10)) 0044.00 CHGVAR VAR(&OUTLIB) VALUE(%SST(&OUTQQLIB 11 10)) 0045.00 0046.00 /*( 2 ) 印刷スプールを SPOOL ライターによって PDF 化する */ 0047.00 /* ( SPLNO は *LAST を指定してもよい ) */ 0048.00 /* ( 印刷スプールは別の PC サーバーへ転送することもできる )*/ 0049.00 CHGVAR VAR(&PDF) VALUE(&SPLF *TCAT '.PDF') 0050.00 SPOOLWTR/CVTSPLF SPLF(&SPLF) JOB(&JOBNBR/&USER/&JOB) + 0051.00 SPLNO(&SPLNO) OUTPUT(*PDF) OPTION(*IFS) + 0052.00 TOSTMF(&PDF) TODIR('/A001') 0053.00 0054.00 /*( 3 ) PDF 化した印刷スプールを削除する */ 0055.00 /* ( スプール・ファイルは削除しなくても処理は重複しない )*/ 0056.00 DLTSPLF FILE(&SPLF) JOB(&JOBNBR/&USER/&JOB) + 0057.00 SPLNBR(&SPLNO) 0058.00 GOTO READ 0059.00 0060.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) 0061.00 SNDMSG: 0062.00 IF COND(&TYPE *EQ '0') THEN(DO) 0063.00 SNDPGMMSG MSG(&MSG) TOMSGQ(*SYSOPR) MSGTYPE(*COMP) 0064.00 ENDDO 0065.00 ELSE CMD(DO) 0066.00 SNDPGMMSG MSG(&MSG) TOMSGQ(*TOPGMQ) MSGTYPE(*DIAG) 0067.00 ENDDO 0068.00 ENDPGM --------------------------------------------------------------------------------
コマンド MONOUTQ
を対話式環境で実行すれば OUTQ
の中のすべての印刷スプールが PDF化される。
または コマンド MONOUTQ
を QSTRUP
で SBMJOB
しておけば永続的に OUTQ を監視し続ける。
上記のサンプル CLP: MONOUTQCL
では PDF 化された印刷スプールは削除するようにしているが
削除を指定していなくても、印刷スプールが重複して PDF 化されることはない。