CL

144. テンプレート・サンプルCLP AB1_SAMPLE

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              /*************************/

のあいだに処理を記述すればよい。