CL

53. 印刷直後の印刷スプールの属性を取得するには ?

50.バッチ印刷ジョブのジョブ番号を調べるには?」 で QPRTJOB の現在のジョブ番号を
取得する方法を紹介したが OS V5R2M0 からは、すべての場合に印刷スプールの

のすべてを取得することができるAPI : QSPRILSP が提供されるようになった。
通常、印刷スプールを OVRPRTFHOLD しておいてから CPYSPLF やその他のバッチ処理で
PDF 化したり、別の PCサーバーに転送したりするのに印刷スプールを特定するために
RTVJOBA によってジョブの属性を取得して、それが印刷スプールにも適用されるはずであったが
バッチ・ジョブの場合では ジョブ名は QPRTJOB となり、ジョブ番号は QPRTJOB のジョブ番号と
なることを既に説明した。
したがって RTVJOBA ではバッチ・ジョブの場合は有効ではない。しかしバッチで実行されることを
考慮して QPRTJOB のジョブ番号を探すのも面倒である。
API : QSPRILSP であれば対話式環境であってもバッチ・ジョブ環境であっても、つねに
正しい印刷スプールの属性を取得することができる。
社内で RTVJOBA を行っている CLP があれば、QSPRILSP に置き換えてみてはどうだろうか ?
API : QSPRILSP のIBM による解説は英文でしかないのでご存知の方も少ないかも知れないので
紹介することにした。

下記に実際に EnterpriseServer で使用されている QSPRILSP を使用サンプル・ソースを
示す。

0001.00              PGM        PARM(&SPLF &FILE &FILLIB)                        
0002.00 /*---------------------------------------------------------*/            
0003.00 /*   CVTBCHSPLF :   スプール・ファイルのファイル変換       */            
0004.00 /*---------------------------------------------------------*/            
0005.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(80)                    
0006.00              DCL        VAR(&SNDMSG) TYPE(*CHAR) LEN(132)                
0007.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                    
0008.00              DCL        VAR(&JOB) TYPE(*CHAR) LEN(10) +                  
0009.00                           VALUE('QPRTJOB   ')                            
0010.00              DCL        VAR(&USER) TYPE(*CHAR) LEN(10) +                 
0011.00                           VALUE('PGMR      ')                            
0012.00              DCL        VAR(&JOBNBR) TYPE(*CHAR) LEN(6)                  
0013.00              DCL        VAR(&FILE) TYPE(*CHAR) LEN(10)                   
0014.00              DCL        VAR(&FILLIB) TYPE(*CHAR) LEN(10)                 
0015.00              DCL        VAR(&SPLF) TYPE(*CHAR) LEN(10)                   
0016.00              DCL        VAR(&OS400) TYPE(*CHAR) LEN(6)                   
0017.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(4) +                
0018.00                           VALUE(X'00000000') /* 2 進数  */               
0019.00              DCL        VAR(&RCVDTA) TYPE(*CHAR) LEN(128)                
0020.00              DCL        VAR(&RCVLEN) TYPE(*CHAR) LEN(4)                  
0021.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))          
0022.00                                                                          
0023.00              RTVJOBA    TYPE(&TYPE)                                      
0024.00              RTVDTAARA  DTAARA(QGPL/QSS1MRI (1 6)) RTNVAR(&OS400)          
0025.00              CHKOBJ     OBJ(&FILLIB/&FILE) OBJTYPE(*FILE)                  
0026.00              MONMSG     MSGID(CPF9800) EXEC(DO)                            
0027.00              CRTPF      FILE(&FILLIB/&FILE) RCDLEN(132) IGCDTA(*YES) +     
0028.00                           LVLCHK(*NO) AUT(*ALL)                            
0029.00              ENDDO                                                         
0030.00              IF         COND(&OS400 *GE 'V5R2M0') THEN(DO) /* +            
0031.00                           V5R2M0 以上  */                                  
0032.00              CHGVAR     VAR(%BIN(&RCVLEN)) VALUE(128)                      
0033.00              CALL       PGM(QSPRILSP) PARM(&RCVDTA &RCVLEN +               
0034.00                           'SPRL0100' &APIERR)                              
0035.00              CHGVAR     VAR(&SPLF) VALUE(%SST(&RCVDTA 9 10))               
0036.00              CHGVAR     VAR(&JOB) VALUE(%SST(&RCVDTA 19 10))               
0037.00              CHGVAR     VAR(&USER) VALUE(%SST(&RCVDTA 29 10))              
0038.00              CHGVAR     VAR(&JOBNBR) VALUE(%SST(&RCVDTA 39 6))             
0039.00              ENDDO      /* V5R2M0 以上  */                                 
0040.00              ELSE       CMD(DO) /* V5R1M0 以下  */                         
0041.00              CALL       PGM(ASNET.COM/PRTJOBNO) PARM(&USER &JOBNBR)        
0042.00              ENDDO      /* V5R1M0 以下  */                                 
0043.00              CPYSPLF    FILE(&SPLF) TOFILE(&FILLIB/&FILE) +                
0044.00                           JOB(&JOBNBR/&USER/&JOB) SPLNBR(*LAST) +          
0045.00                           MBROPT(*REPLACE) CTLCHAR(*NONE)                  
0046.00         /*( スプールの削除 )*/                                             
0047.00              DLTSPLF    FILE(&SPLF) JOB(&JOBNBR/&USER/&JOB) +              
0048.00                           SPLNBR(*LAST)                               
0049.00              MONMSG     CPF0000                                       
0050.00              RETURN                                                   
0051.00                                                                       
0052.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG)             
0053.00  SNDMSG:                                                              
0054.00              IF         COND(&TYPE *EQ '0') THEN(DO)                  
0055.00              CHGVAR     VAR(&SNDMSG) VALUE('(CVTBCHSPLF)-' *CAT +     
0056.00                           &MSG)                                       
0057.00              SNDPGMMSG  MSG(&SNDMSG) TOMSGQ(*SYSOPR) MSGTYPE(*COMP)   
0058.00              DMPCLPGM                                                 
0059.00              ENDDO                                                    
0060.00              ELSE       CMD(DO)                                       
0061.00              SNDPGMMSG  MSG(&MSG) TOMSGQ(*TOPGMQ) MSGTYPE(*DIAG)      
0062.00              ENDDO                                                    
0063.00              ENDPGM                                                   
【 解説 】

eStudioCtrl + F7キーを押してコンパイルが指定されたときには、直後にコンパイル・リストが
eStudio (ブラウザ) に転送される。
このとき &FILE = COMPILE, &FILLIB = QTEMP として QTEMP/COMPILE という一時的な物理ファイルを
作成してここにスプール・ファイルが CPYSPLF によって複製される。
OS が V5R2M0 以上であれば API: QSPRILSP を使って直前に印刷したコンパイル・リストの
属性を取得してから CPYSPLF を実行するようにしている。