Tools

60. JOB番号を検索する RTVJOBNBR

JOB 名、USER 名に対するジョブ番号を検索するツール: RTVJOBNBR を紹介する。
例えばあるジョブがまだ活動中なのかそれとも既に終了しているのかを調べたいときがある。
例えば月次バッチ・ジョブを投入しておいてそれがもう既に終了したのか、
それともまだ実行中であるのかを調べたい。
特定のサブ・システム QBATCH などに絞って活動中のジョブ一覧表を
ユーザー・スペースなどに出力してそのジョブがあるかどうかを
調べる方法がありそうだが残念ながら
特定のサブ・システムを対象とするジョブの一覧を出力できる API は存在しない。
WRKACTJOB SBS ( QBATCH ) とは実行できるが WRKACTJOB コマンドは
表示かまたは印刷出力しかないので API: QUSLJOB は
すべてのジョブのリストを出力することになって
パフォーマンスはかなり悪いものとなってしまう。

そこで API: QUSRJOBI で JOB 名と USER 名だけ指定して検索して
エラーになればジョブは存在しないと判定することができる。
しかし残念なことに QUSRJOBI は JOB 番号までキッチリ指定しないと動作しない。
JOB 番号に *FIRST や *LAS などの形象定数が使えないのである。
なんとも不便な API であるる。
そこで登場するのがここで紹介する RTVJOBNBR である。
RTVJOBNBR は JOB 名と USER 名だけ与えればジョブ番号を戻してくれる
便利なツールである。
RTVJOBNBR からジョブ番号がブランクで戻ってきたら、そのジョブは
存在しないと判定してよい。

【 CLP: RTVJOBNBR 】
0001.00              PGM        PARM(&JOB &USER &JOBNBR)                        
0002.00 /*---------------------------------------------------------*/           
0003.00 /*   RTVJOBNBR   :   JOB 番号の検索                        */           
0004.00 /*                                                         */           
0005.00 /*         JOB, USER  から JOB 番号を検索します            */           
0006.00 /*                                                         */           
0007.00 /*---------------------------------------------------------*/           
0008.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(80)                   
0009.00              DCL        VAR(&JOB) TYPE(*CHAR) LEN(10)                   
0010.00              DCL        VAR(&USER) TYPE(*CHAR) LEN(10)                  
0011.00              DCL        VAR(&JOBNBR) TYPE(*CHAR) LEN(6)                 
0012.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(4) +               
0013.00                           VALUE(X'00000000') /* 2 進数  */              
0014.00              DCL        VAR(&JOBUSRNBR) TYPE(*CHAR) LEN(26)             
0015.00              DCL        VAR(&STRPOS) TYPE(*CHAR) LEN(4) +               
0016.00                           VALUE(X'0000007D') /* 2 進数開始位置  : +     
0017.00                           125 */                                        
0018.00              DCL        VAR(&DTALEN) TYPE(*CHAR) LEN(4) /* 2 進数  */   
0019.00              DCL        VAR(&RCVVAR) TYPE(*CHAR) LEN(16) +              
0020.00                           VALUE(X'0000000000000000')                    
0021.00              DCL        VAR(&OFFSET) TYPE(*CHAR) LEN(4) /* +            
0022.00                           2 進数 オフセット */                               
0023.00              DCL        VAR(&NOENTR) TYPE(*CHAR) LEN(4) /* +            
0024.00                           2 進数項目数  */                              
0025.00              DCL        VAR(&LSTSIZ) TYPE(*CHAR) LEN(4) /* +            
0026.00                           2 進数リストサイズ  */                        
0027.00              DCL        VAR(&DEC08) TYPE(*DEC) LEN(8 0)                 
0028.00              DCL        VAR(&LENDTA) TYPE(*CHAR) LEN(4) +               
0029.00                           VALUE(X'00000010') /* 2 進数受取長さ  : 16 */ 
0030.00              DCL        VAR(&ADDLEN) TYPE(*DEC) LEN(8 0) /* WORK */     
0031.00              DCL        VAR(&NOENT) TYPE(*DEC) LEN(8 0) /* WORK */      
0032.00              DCL        VAR(&N) TYPE(*DEC) LEN(8 0) VALUE(1) /* WORK */ 
0033.00              DCL        VAR(&RCVDTA) TYPE(*CHAR) LEN(80)                
0034.00              DCL        VAR(&STATUS) TYPE(*CHAR) LEN(10)                
0035.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))         
0036.00                                                                         
0037.00              CHGVAR     VAR(&JOBNBR) VALUE('      ')                    
0038.00     /*( ユーザー・スペース の作成 )*/                                          
0039.00              CALL       PGM(QUSCRTUS) PARM('USLJOB    QTEMP     ' +     
0040.00                     'PF        ' 1000 ' ' '*ALL      ' +                
0041.00                     'QUSLJOB 用ユーザー空間 ' '*YES      ' &APIERR)     
0042.00     /*( QUSLJOB API ジョブ・リスト)*/                                      
0043.00              CHGVAR     VAR(&JOBUSRNBR) VALUE(&JOB *CAT &USER *CAT +  
0044.00                           '*ALL  ')                                   
0045.00              CALL       PGM(QUSLJOB) PARM('USLJOB    QTEMP     ' +    
0046.00                           'JOBL0100' &JOBUSRNBR '*ALL   ' &APIERR)    
0047.00     /*( ユーザー・スペース を検索 )*/                                        
0048.00              CHGVAR     VAR(&N) VALUE(1)                              
0049.00              CHGVAR     VAR(%BIN(&STRPOS)) VALUE(125)                 
0050.00              CHGVAR     VAR(%BIN(&DTALEN)) VALUE(16)                  
0051.00              CALL       PGM(QUSRTVUS) PARM('USLJOB    QTEMP     ' +   
0052.00                           &STRPOS  &DTALEN  &RCVVAR)                  
0053.00   /*( リストデータセクション の項目数を検索 )*/                                 
0054.00              CHGVAR     VAR(&OFFSET) VALUE(%SST(&RCVVAR 1 4))         
0055.00              CHGVAR     VAR(&NOENTR) VALUE(%SST(&RCVVAR 9 4))         
0056.00              CHGVAR     VAR(&LSTSIZ) VALUE(%SST(&RCVVAR 13 4))        
0057.00          /*( RCVVAR によって OFFSET,LSTSIZ を受取った )*/             
0058.00              CHGVAR     VAR(&STRPOS) VALUE(&OFFSET)                   
0059.00              CHGVAR     VAR(&DEC08) VALUE(%BIN(&STRPOS))              
0060.00              CHGVAR     VAR(&DEC08) VALUE(&DEC08 + 1)                 
0061.00              CHGVAR     VAR(%BIN(&STRPOS)) VALUE(&DEC08)              
0062.00              CHGVAR     VAR(&LENDTA) VALUE(&LSTSIZ)                   
0063.00              CHGVAR     VAR(&ADDLEN) VALUE(%BIN(&LENDTA))          
0064.00              CHGVAR     VAR(&NOENT) VALUE(%BIN(&NOENTR))           
0065.00   /*( オフセット 値 + 1 から 36 バイト を検索して ジョブ 名を得る )*/      
0066.00 NXTRTV:                                                            
0067.00              CALL       PGM(QUSRTVUS) PARM('USLJOB    QTEMP     ' +
0068.00                           &STRPOS  &LENDTA  &RCVDTA)               
0069.00              /*( 処理の開始 )*/                                    
0070.00              CHGVAR     VAR(&STATUS) VALUE(%SST(&RCVDTA 43 10))    
0071.00              IF         COND(&STATUS *EQ '*OUTQ     ') THEN(GOTO + 
0072.00                           CMDLBL(PASS))                            
0073.00              IF         COND(&STATUS *EQ '*ACTIVE   ') THEN(DO)    
0074.00              CHGVAR     VAR(&USER) VALUE(%SST(&RCVDTA 11 10))      
0075.00              CHGVAR     VAR(&JOBNBR) VALUE(%SST(&RCVDTA 21 6))     
0076.00              RETURN                                                
0077.00              ENDDO                                                 
0078.00              /*( 処理の終了 )*/                                    
0079.00  PASS:       IF         COND(&N < &NOENT) THEN(DO)                 
0080.00              CHGVAR     VAR(&N) VALUE(&N + 1)                      
0081.00              CHGVAR     VAR(&DEC08)  VALUE(%BIN(&STRPOS))          
0082.00              CHGVAR     VAR(&DEC08) VALUE(&DEC08 + &ADDLEN)        
0083.00              CHGVAR     VAR(%BIN(&STRPOS)) VALUE(&DEC08)           
0084.00              GOTO       NXTRTV                     
0085.00              ENDDO                                 
0086.00 OUTRTV:                                            
0087.00              RETURN                                
0088.00                                                    
0089.00  ERROR:      RCVMSG     RMV(*NO) MSG(&MSG)         
0090.00  SNDMSG:     SNDPGMMSG  MSG(&MSG) TOMSGQ(*SYSOPR)  
0091.00              ENDPGM                                
[ コンパイル ]
CRTCLPGM PGM(MYLIB/RTVJOBNBR) SRCFILE(MYSRCLIB/QCLSRC) AUT(*ALL)