CL

62. 特定の OUTQ に投入されたスプールを自動的に処理するには ?

ある特定の印刷待ち行列( DOUTQ ) をつねに監視していて、印刷スプールがその OUTQ に投入されたら、
次々と自動的に処理する方法を紹介する。
ここでは、特定の OUTQ にスプールが投入されたら SpoolライターCVTSPLF コマンドを使って、
次々と PDF 化して別の PC サーバーへ Ftpで投入する事例を紹介する。
このことを実現するには OUTQ に対してデータ待ち行列を関連づけて定義する。
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ソース

【 コマンド : MONOUTQ 】
--------------------------------------------------------------------------------
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(' ライブラリー ')      
--------------------------------------------------------------------------------
【 CLP : MONOUTQCL 】
--------------------------------------------------------------------------------
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化される。
または コマンド MONOUTQQSTRUPSBMJOB しておけば永続的に OUTQ を監視し続ける。
上記のサンプル CLP: MONOUTQCL では PDF 化された印刷スプールは削除するようにしているが
削除を指定していなくても、印刷スプールが重複して PDF 化されることはない。