CL

86. API : QUSLJOB : ジョブのリスト

QUSLOBJ はジョブのリストをユーザー・スペース(*USESPC)に出力する API であるが
ここでは QUSLOBJ の使い方と同時に、ジョブの一覧の意味の解説もかねて
QUSLOBJ を紹介する目的がある。

パラメータ

必須パラメータ・グループ:

1.修飾ユーザー・スペース名入力Char(20)
2.形式名入力Char(8)
3.修飾ジョブ名入力Char(26)
4.状況入力Char(10)

任意パラメータ・グループ1:

5.エラー・コード入出力Char(*)

任意パラメータ・グループ2 :

6.ジョブ・タイプ入力Char(1)
7.返されるフィールド数入出力Bynary(4)
8.返されるフィールドのキー入力Bynary(4)の配列

QUSLJOB API は修飾ユーザー・スペース名 ( *USRSPC ) として指定されたユーザー・スペース,
例えば 「USLOBJ   QTEMP」に指定されたジョブの一覧のリストを出力する。

・修飾ジョブ名

ここで指定する修飾ジョブ名とは、

ジョブ名 : * ,*CURRENT, *ALL またはジョブ名
ユーザー名 : ユーザーは、指定された特殊権限を所有していない。
ジョブ番号 : *ALL またはジョブ番号

である。
つまり、あるユーザーのジョブ情報 ( ジョブ名+ユーザー名+ジョブ番号 ) を調べるには
*ALL + (ユーザー名) + *ALL のジョブ情報で QUSLJOB を使って検索することができる。
またジョブ名だけでも検索することができる。

ジョブを特定するにはジョブ番号まで含めて正確に特定しなければならないので
ジョブ番号の検索に QUSLJOB は役に立つAPIである。

・状況

*ACTIVE

・・・・・・

活動ジョブ。ただしここで言う活動ジョブとは WRKACTJOB として表示されている
ジョブだけでなく、グループ・ジョブ、システム要求ジョブや切断されたジョブも含まれている。
QUSLJOB API の使い方で最も注意しなければならないのは、この部分である。
異常終了したジョブを次のサインオンで復活させることができるのは、ご存じだと思うが
あの異常終了したジョブは WRKACTJOB では表示されることはないが、切断されたジョブとして
システム内部に残っている。
QUSLJOB では *ACTIVE を指定しても切断ジョブも一緒に一覧として出力されてしまうので
この点に注意が必要である。
切断ジョブの見分け方については次の API : QUSRJOBI で説明する。

*JOBQ・・・・・・現在、ジョブ待ち行列にあるジョブ
*OUTQ・・・・・・実行は完了したものの、その出力がまだ出力待ち行列にあるジョブ
*ALL・・・・・・状況にかかわらず、すべてのジョブ
【 サンプル・ソース:TESTUSLJOB 】
0001.00              PGM                                                      
0002.00 /*---------------------------------------------------------*/         
0003.00 /*   TESTUSLJOB :   ジョブのリスト                         */         
0004.00 /*---------------------------------------------------------*/         
0005.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                
0006.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                
0007.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)             
0008.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)                
0009.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)             
0010.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(116) +           
0011.00                           VALUE(X'000074') /* 2 進数  */              
0012.00              DCL        VAR(&NULL4) TYPE(*CHAR) LEN(4) +              
0013.00                           VALUE(X'00000000')                          
0014.00              DCL        VAR(&STMNT) TYPE(*CHAR) LEN(7)                
0015.00              DCL        VAR(&JOBINFO) TYPE(*CHAR) LEN(26) +           
0016.00                           VALUE('*ALL      QTMHHTTP  *ALL  ')         
0017.00              DCL        VAR(&CMPINFO) TYPE(*CHAR) LEN(26)             
0018.00              DCL        VAR(&STRPOS) TYPE(*CHAR) LEN(4) +             
0019.00                           VALUE(X'0000007D') /* 2 進数開始位置  : +   
0020.00                           125 */                                      
0021.00              DCL        VAR(&LENDTA) TYPE(*CHAR) LEN(4) +               
0022.00                           VALUE(X'00000010') /* 2 進数受取長さ  : 16 */ 
0023.00              DCL        VAR(&RCVVAR) TYPE(*CHAR) LEN(16) +              
0024.00                           VALUE(X'0000000000000000')                    
0025.00              DCL        VAR(&OFFSET) TYPE(*CHAR) LEN(4) /* +            
0026.00                           2 進数 オフセット */                               
0027.00              DCL        VAR(&ADDLEN) TYPE(*DEC) LEN(8 0) /* WORK */     
0028.00              DCL        VAR(&NOENTR) TYPE(*CHAR) LEN(4) /* +            
0029.00                           2 進数項目数  */                              
0030.00              DCL        VAR(&LSTSIZ) TYPE(*CHAR) LEN(4) /* +            
0031.00                           2 進数リストサイズ  */                        
0032.00              DCL        VAR(&NOENT) TYPE(*DEC) LEN(8 0) /* WORK */      
0033.00              DCL        VAR(&N) TYPE(*DEC) LEN(8 0) VALUE(1) /* WORK */ 
0034.00              DCL        VAR(&RCVDTA) TYPE(*CHAR) LEN(256) /* +          
0035.00                            受取データ  */                               
0036.00              DCL        VAR(&INCD) TYPE(*CHAR) LEN(16)                  
0037.00              DCL        VAR(&FLD8) TYPE(*CHAR) LEN(8)                   
0038.00              DCL        VAR(&JOBVAR) TYPE(*CHAR) LEN(512)               
0039.00              DCL        VAR(&JOBLEN) TYPE(*CHAR) LEN(4) +               
0040.00                           VALUE(X'00000200')                            
0041.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))         
0042.00                                                                         
0043.00  /*(1) QUSCRTUS : ユーザー・スペースの作成 */                           
0044.00              CALL       PGM(QUSCRTUS) PARM('USLJOB    +                 
0045.00                           QTEMP     ' 'PF        ' 1000 ' ' +           
0046.00                           '*ALL      ' 'USLJOB 用ユーザー空間 ' +       
0047.00                           '*YES      ' &APIERR)                         
0048.00              MONMSG     CPF9870                                         
0049.00              IF         COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)     
0050.00              CHGVAR     VAR(&STMNT) VALUE('24.00')                      
0051.00              GOTO       APIERR                                          
0052.00              ENDDO                                                      
0053.00                                                                         
0054.00 /*(2) QUSLJOB :  ユーザー  QTMHHTTP のジョブ一覧を出力する */           
0055.00              CALL       PGM(QUSLJOB) PARM('USLJOB    QTEMP     ' +      
0056.00                           'JOBL0100' &JOBINFO '*ACTIVE   ' &APIERR)     
0057.00              IF         COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)     
0058.00              CHGVAR     VAR(&STMNT) VALUE('34.00')                      
0059.00              GOTO       APIERR                                          
0060.00              ENDDO                                                      
0061.00                                                                         
0062.00 /*(3) QUSRTVUS :  ユーザー・スペースのヘッダー情報を読み取る */         
0063.00              CHGVAR     VAR(&STRPOS) VALUE(X'0000007D')                 
0064.00              CHGVAR     VAR(&LENDTA) VALUE(X'00000010')                 
0065.00              CALL       PGM(QUSRTVUS) PARM('USLJOB    QTEMP     ' +     
0066.00                           &STRPOS &LENDTA &RCVVAR)                      
0067.00              IF         COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)     
0068.00              CHGVAR     VAR(&STMNT) VALUE('34.00')                      
0069.00              GOTO       APIERR                                          
0070.00              ENDDO                                                      
0071.00              CHGVAR     VAR(&OFFSET) VALUE(%SST(&RCVVAR 1 4))           
0072.00              CHGVAR     VAR(&NOENTR) VALUE(%SST(&RCVVAR 9 4))           
0073.00              CHGVAR     VAR(&LSTSIZ) VALUE(%SST(&RCVVAR 13 4))          
0074.00                                                                         
0075.00          /*( RCVVAR によって OFFSET,LSTSIZ を受取った )*/               
0076.00              CHGVAR     VAR(&STRPOS) VALUE(&OFFSET)                     
0077.00              CHGVAR     VAR(%BIN(&STRPOS)) VALUE(%BIN(&STRPOS) + 1)     
0078.00              CHGVAR     VAR(&LENDTA) VALUE(&LSTSIZ)                     
0079.00              CHGVAR     VAR(&ADDLEN) VALUE(%BIN(&LENDTA))               
0080.00              CHGVAR     VAR(&NOENT) VALUE(%BIN(&NOENTR))                
0081.00              IF         COND(&NOENT *EQ 0) THEN(DO)                     
0082.00              CHGVAR     VAR(&MSGDTA) VALUE(' ジョブ ' *CAT &JOBINFO +   
0083.00                           *TCAT ' がありません。 ')                     
0084.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSGDTA) + 
0085.00                           MSGTYPE(*ESCAPE)                             
0086.00              RETURN                                                    
0087.00              ENDDO                                                     
0088.00                                                                        
0089.00 /*(4) QUSRTVUS で LOOP してジョブ名を読み取る */                       
0090.00                                                                        
0091.00              CHGVAR     VAR(&FLD8) VALUE(&NOENT)                       
0092.00  ZERO_SUP:   IF         COND(%SST(&FLD8 1 1) *EQ '0') THEN(DO)         
0093.00              CHGVAR     VAR(&FLD8) VALUE(%SST(&FLD8 2 7))              
0094.00              GOTO       ZERO_SUP                                       
0095.00              ENDDO                                                     
0096.00              SNDPGMMSG  MSG(&FLD8 *TCAT +                              
0097.00                           ' 個のジョブが見つかりました ') +            
0098.00                           MSGTYPE(*DIAG)                               
0099.00              CHGVAR     VAR(&N) VALUE(1)                               
0100.00 NXTJOB:                                                                
0101.00              CALL       PGM(QUSRTVUS) PARM('USLJOB    QTEMP     ' +    
0102.00                           &STRPOS &LENDTA &RCVDTA)                     
0103.00              /*( 処理の開始 )*/                                        
0104.00              CHGVAR     VAR(&CMPINFO) VALUE(%SST(&RCVDTA 1 26))        
0105.00              SNDPGMMSG  MSG('JOB=' *CAT &CMPINFO) MSGTYPE(*DIAG)        
0106.00              CALL       PGM(QUSRJOBI) PARM(&JOBVAR &JOBLEN +            
0107.00                           'JOBI0200' &CMPINFO &INCD &APIERR)            
0108.00              IF         COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)     
0109.00              CHGVAR     VAR(&STMNT) VALUE('466.00')                     
0110.00              GOTO       APIERR                                          
0111.00              ENDDO                                                      
0112.00              /*( 処理の終了 )*/                                         
0113.00  BYPAS_JOB:  IF         COND(&N < &NOENT) THEN(DO)                      
0114.00              CHGVAR     VAR(&N) VALUE(&N + 1)                           
0115.00              CHGVAR     VAR(%BIN(&STRPOS)) VALUE(%BIN(&STRPOS) + +      
0116.00                           &ADDLEN)                                      
0117.00              GOTO       NXTJOB                                          
0118.00              ENDDO                                                      
0119.00  JOBEND:                                                                
0120.00              RETURN                                                     
0121.00                                                                         
0122.00  APIERR:                                                                
0123.00              CHGVAR     VAR(&MSGID) VALUE(%SST(&APIERR 9 7))            
0124.00              CHGVAR     VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))        
0125.00              SNDPGMMSG  MSGID(&MSGID) MSGF(QCPFMSG) MSGDTA(&MSGDTA) +   
0126.00                           TOMSGQ(*SYSOPR) MSGTYPE(*COMP)                
0127.00              SNDPGMMSG  MSG(' ステートメント ' *CAT &STMNT *CAT +       
0128.00                           ' でエラーがありました。 ') +                 
0129.00                           TOMSGQ(*TOPGMQ) MSGTYPE(*DIAG)                
0130.00              GOTO       SNDMSG                                          
0131.00                                                                         
0132.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +             
0133.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +   
0134.00                           MSGFLIB(&MSGFLIB)                             
0135.00  SNDMSG:     IF         COND(&MSGID *EQ ' ') THEN(DO)                   
0136.00              SNDPGMMSG  MSG(&MSG) TOMSGQ(*TOPGMQ) MSGTYPE(*DIAG)        
0137.00              ENDDO                                                      
0138.00              ELSE       CMD(DO)                                         
0139.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +            
0140.00                           MSGDTA(&MSGDTA) TOMSGQ(*TOPGMQ) +             
0141.00                           MSGTYPE(*ESCAPE)                              
0142.00              ENDDO                                                      
0143.00              ENDPGM                                                     
【解説】

最初に QUSCRTUS API を使って QTEMP/USLJOB *USRSPC を作成しておく。
次に QUSLJOB API によって

0015.00              DCL        VAR(&JOBINFO) TYPE(*CHAR) LEN(26) +           
0016.00                           VALUE('*ALL      QTMHHTTP  *ALL  ')
                     :
                     :
0055.00              CALL       PGM(QUSLJOB) PARM('USLJOB    QTEMP     ' +      
0056.00                           'JOBL0100' &JOBINFO '*ACTIVE   ' &APIERR)

のようにしてユーザー QTMHHTTP のジョブをユーザー・スペース QTEMP/USLJOB に出力する。
ただし出力されたジョブは活動中のジョブだけでなく異常終了したジョブも含まれている場合が
ある。

異常終了したジョブの見分け方は次のAPI : QUSRJOBI で解説することとする。

【実行結果】

TESTUSLJOB