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 からジョブ番号がブランクで戻ってきたら、そのジョブは
存在しないと判定してよい。
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)