CL

139. 最後に出力されたスプールを調べるには

実行して最後に出力されたスプールはAPI: QSPRILSP によって
取得することができる。
QSPRILSP はあまり使われることがないAPIであるが
バッチ・ジョブ(QPRTJOB)のジョブ番号を検索したい場合などにも
役に立つAPIであるのでここでその使用方法を紹介する。

[サンプルAPI: TESTSPLN ]

ソースはこちらから

0001.00              PGM                                                       
0002.00 /*-------------------------------------------------------------------*/
0003.00 /*   TESTSPLN   :   最後に出力されたスプールの取得                   */
0004.00 /*                                                                   */
0005.00 /*   2021/04/10  作成                                                */
0006.00 /*-------------------------------------------------------------------*/
0007.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                 
0008.00              DCL        VAR(&STMMSG) TYPE(*CHAR) LEN(132)              
0009.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                 
0010.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)                 
0011.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)              
0012.00              DCL        VAR(&MSGKEY) TYPE(*CHAR) LEN(4)                
0013.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)              
0014.00              DCL        VAR(&ERRDTA) 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(&ERR) TYPE(*CHAR) LEN(1)                   
0022.00              DCL        VAR(&NULL4) TYPE(*CHAR) LEN(4) +               
0023.00                           VALUE(X'00000000')                           
0024.00  /*( QSPRILSP の変数 )*/                                           
0025.00              DCL        VAR(&RCVDTA) TYPE(*CHAR) LEN(128)          
0026.00              DCL        VAR(&RCVLEN) TYPE(*CHAR) LEN(4) +          
0027.00                           VALUE(X'00000080') /* 128 */             
0028.00              DCL        VAR(&SPLF) TYPE(*CHAR) LEN(10)             
0029.00              DCL        VAR(&JOB)  TYPE(*CHAR) LEN(10)             
0030.00              DCL        VAR(&USER) TYPE(*CHAR) LEN(10)             
0031.00              DCL        VAR(&JOBNBR) TYPE(*CHAR) LEN(6)            
0032.00              DCL        VAR(&SPLNB4) TYPE(*CHAR) LEN(4)            
0033.00              DCL        VAR(&SPLNO) TYPE(*DEC) LEN(6 0)            
0034.00              DCL        VAR(&SPLNOC) TYPE(*CHAR) LEN(6)            
0035.00              MONMSG     MSGID(CPF9999) EXEC(GOTO CMDLBL(ERROR))    
0036.00                                                                    
0037.00 /*( 環境の取得 )*/                                                 
0038.00              RTVJOBA    TYPE(&TYPE)                                
0039.00              IF         COND(&TYPE *EQ '0') THEN(DO) /*  バッチ  */
0040.00              CHGVAR     VAR(&TOPGMQ) VALUE('*SYSOPR   ')           
0041.00              ENDDO      /*  バッチ  */                             
0042.00              ELSE       CMD(DO) /*  対話式  */                     
0043.00              CHGVAR     VAR(&TOPGMQ) VALUE('*TOPGMQ   ')           
0044.00              ENDDO      /*  対話式  */                             
0045.00                                                                    
0046.00 /*( 印刷の出力 )*/                                                 
0047.00              RUNQRY     QRY(*NONE) QRYFILE((QTRFIL/SHOHIN)) +      
0048.00                           OUTTYPE(*PRINTER)                                  
0049.00                                                                              
0050.00 /*( 出力されたスプールを取得する )*/                                         
0051.00              CALL       PGM(QSPRILSP) PARM(&RCVDTA &RCVLEN +                 
0052.00                           'SPRL0100' &APIERR)                                
0053.00              IF         COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)          
0054.00              SNDPGMMSG  +                                                    
0055.00                           MSG('API: QSPRILSP の実行で次のエラーが発生 +      
0056.00                            しました。 ') MSGTYPE(*DIAG)                      
0057.00              GOTO       APIERR                                               
0058.00              ENDDO                                                           
0059.00              CHGVAR     VAR(&SPLF) VALUE(%SST(&RCVDTA 9 10))                 
0060.00              CHGVAR     VAR(&JOB) VALUE(%SST(&RCVDTA 19 10))                 
0061.00              CHGVAR     VAR(&USER) VALUE(%SST(&RCVDTA 29 10))                
0062.00              CHGVAR     VAR(&JOBNBR) VALUE(%SST(&RCVDTA 39 6))               
0063.00              CHGVAR     VAR(&SPLNB4) VALUE(%SST(&RCVDTA 45 4))               
0064.00              CHGVAR     VAR(&SPLNO) VALUE(%BIN(&SPLNB4))                     
0065.00              CHGVAR     VAR(&SPLNOC) VALUE(&SPLNO)                           
0066.00              CHGVAR     VAR(&MSG) VALUE(' 最後に出力されたスプールは ' *CAT +
0067.00                           &SPLF *TCAT '.' *CAT &JOB *TCAT '/' +              
0068.00                           *CAT &USER *TCAT '/' *CAT &JOBNBR *CAT +           
0069.00                           ' スプール番号 ' *CAT &SPLNOC *CAT +               
0070.00                           ' です。 ')                                        
0071.00              CHGVAR     VAR(&MSGTYPE) VALUE('*DIAG')                         
0072.00              GOTO       SNDMSG                                          
0073.00              RETURN                                                     
0074.00                                                                         
0075.00  APIERR:                                                                
0076.00              CHGVAR     VAR(&MSGID) VALUE(%SST(&APIERR 9 7))            
0077.00              CHGVAR     VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))        
0078.00              CHGVAR     VAR(&MSGF) VALUE('QCPFMSG   ')                  
0079.00              CHGVAR     VAR(&MSGFLIB) VALUE('QSYS      ')               
0080.00              GOTO       SNDMSG                                          
0081.00                                                                         
0082.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) KEYVAR(&MSGKEY) +       
0083.00                           MSGDTA(&MSGDTA) MSGID(&MSGID)                 
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              ENDDO                                                      
0090.00              CHGVAR     VAR(&STMMSG) VALUE(' プログラム ' *CAT +        
0091.00                           %SST(&ERRDTA 8 10) *TCAT +                    
0092.00                           ' のステートメント ' *CAT %SST(&ERRDTA +      
0093.00                           24 4) *CAT ' で次のエラーが発生しました。 ')  
0094.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STMMSG) +  
0095.00                           TOMSGQ(&TOPGMQ) MSGTYPE(*DIAG)                
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    


                                              

[コンパイル]

CRTCLPGM OBJLIB/TESTSPLN SRCFILE(MYSRCLIB/QCLSRC) AUT(*ALL)

[解説]

使用方法は解説するまでもないほど簡単である。

0051.00              CALL       PGM(QSPRILSP) PARM(&RCVDTA &RCVLEN +                 
0052.00                           'SPRL0100' &APIERR)

として実行するだけで &RCVDTA にスプール情報が戻される。