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である。
・状況
| ・・・・・・ | 活動ジョブ。ただしここで言う活動ジョブとは |
*JOBQ | ・・・・・・ | 現在、ジョブ待ち行列にあるジョブ |
*OUTQ | ・・・・・・ | 実行は完了したものの、その出力がまだ出力待ち行列にあるジョブ |
*ALL | ・・・・・・ | 状況にかかわらず、すべてのジョブ |
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
で解説することとする。