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 で解説することとする。