ジョブ情報を検索するのであれば API を使わなくてもコマンド RTVJOBA を
使えば十分ではないかと諸兄は考えるかも知れないが、実は RTVJOBA を
うかつに信用してしまうと、とんでもないことになる場合がある。
実は、
RTVJOBA : ジョブ情報の検索は自分のジョブしか検索することができない
のである。
例えばバッチ・ジョブや他のジョブの情報を RTVJOBA コマンドを使って

のように検索したいとする。
指定したジョブの情報が得られるかと思いきや、実は戻り値として戻ってくるのは
指定したジョブではなくて、この RTVJOBA コマンドを実行した自分自身のジョブの
情報が戻ってくるだけである。
これには長い間気づかなかった。
指定したジョブ情報を正しく取得するには API: QUSRJOBI を使って検索しなければならない。
次は API: QUSRJOBI を使って RTVJOBA と同じ情報を戻す CL のサンプルである。
【サンプル・ソース: RTVJOBA】
0001.00 PGM PARM(&JOB &USER &NBR &OUTQ &OUTQLIB &DATE +
0002.00 &TYPE &PRTDEV &LANGID &CNTRYID &CCSID +
0003.00 &DFTCCSID &CYMDDATE &SBMMSGQ &SBMMSGQLIB)
0004.00 /*---------------------------------------------------------*/
0005.00 /* RTVJOBA : Retrieve Job Attribute for C/400 PGM */
0006.00 /*---------------------------------------------------------*/
0007.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(80)
0008.00 DCL VAR(&JOBINFO) TYPE(*CHAR) LEN(26)
0009.00 DCL VAR(&JOBID) TYPE(*CHAR) LEN(16)
0010.00 DCL VAR(&JOB) TYPE(*CHAR) LEN(10)
0011.00 DCL VAR(&USER) TYPE(*CHAR) LEN(10)
0012.00 DCL VAR(&NBR) TYPE(*CHAR) LEN(6)
0013.00 DCL VAR(&OUTQ) TYPE(*CHAR) LEN(10)
0014.00 DCL VAR(&OUTQLIB) TYPE(*CHAR) LEN(10)
0015.00 DCL VAR(&DATE) TYPE(*CHAR) LEN(6)
0016.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1)
0017.00 DCL VAR(&PRTDEV) TYPE(*CHAR) LEN(10)
0018.00 DCL VAR(&LANGID) TYPE(*CHAR) LEN(3)
0019.00 DCL VAR(&CNTRYID) TYPE(*CHAR) LEN(2)
0020.00 DCL VAR(&CCSID) TYPE(*DEC) LEN(5 0)
0021.00 DCL VAR(&CCSID_C) TYPE(*CHAR) LEN(5)
0022.00 DCL VAR(&DFTCCSID) TYPE(*DEC) LEN(5 0)
0023.00 DCL VAR(&DFTCCSID_C) TYPE(*CHAR) LEN(5)
0024.00 DCL VAR(&CYMDDATE) TYPE(*CHAR) LEN(7)
0025.00 DCL VAR(&SBMMSGQ) TYPE(*CHAR) LEN(10)
0026.00 DCL VAR(&SBMMSGQLIB) TYPE(*CHAR) LEN(10)
0027.00 DCL VAR(&SWS) TYPE(*CHAR) LEN(8)
0028.00 DCL VAR(&JOBVAR) TYPE(*CHAR) LEN(512)
0029.00 DCL VAR(&JOBLEN) TYPE(*CHAR) LEN(4)
0030.00 DCL VAR(&BIN4) TYPE(*CHAR) LEN(4)
0031.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(4) +
0032.00 VALUE(X'00000000') /* 2 進数 */
0033.00
0034.00 CHGVAR VAR(%BIN(&JOBLEN)) VALUE(512)
0035.00 IF COND(&JOB *EQ '* ') THEN(DO)
0036.00 RTVJOBA JOB(&JOB) USER(&USER) NBR(&NBR)
0037.00 ENDDO
0038.00 CHGVAR VAR(&JOBINFO) VALUE(&JOB *CAT &USER *CAT &NBR)
0039.00 CALL PGM(QUSRJOBI) PARM(&JOBVAR &JOBLEN +
0040.00 'JOBI0300' &JOBINFO &JOBID &APIERR)
0041.00 CHGVAR VAR(&JOBID) VALUE(%SST(&JOBVAR 35 16))
0042.00 CHGVAR VAR(&OUTQ) VALUE(%SST(&JOBVAR 85 10))
0043.00 CHGVAR VAR(&OUTQLIB) VALUE(%SST(&JOBVAR 95 10))
0044.00 CHGVAR VAR(&DATE) VALUE(%SST(&JOBVAR 182 6))
0045.00 CHGVAR VAR(&TYPE) VALUE(%SST(&JOBVAR 61 1))
0046.00 IF COND(&TYPE *EQ 'B') THEN(CHGVAR VAR(&TYPE) +
0047.00 VALUE('0'))
0048.00 IF COND(&TYPE *EQ 'I') THEN(CHGVAR VAR(&TYPE) +
0049.00 VALUE('1'))
0050.00 CHGVAR VAR(&SBMMSGQ) VALUE(%SST(&JOBVAR 143 10))
0051.00 CHGVAR VAR(&SBMMSGQLIB) VALUE(%SST(&JOBVAR 153 10))
0052.00 CHGVAR VAR(&PRTDEV) VALUE(%SST(&JOBVAR 107 10))
0053.00
0054.00 CHGVAR VAR(%BIN(&JOBLEN)) VALUE(512)
0055.00 CALL PGM(QUSRJOBI) PARM(&JOBVAR &JOBLEN +
0056.00 'JOBI0400' '*INT ' &JOBID +
0057.00 &APIERR)
0058.00 CHGVAR VAR(&LANGID) VALUE(%SST(&JOBVAR 343 3))
0059.00 CHGVAR VAR(&CNTRYID) VALUE(%SST(&JOBVAR 346 2))
0060.00 CHGVAR VAR(&BIN4) VALUE(%SST(&JOBVAR 301 4))
0061.00 CHGVAR VAR(&CCSID) VALUE(%BIN(&BIN4))
0062.00 CHGVAR VAR(&BIN4) VALUE(%SST(&JOBVAR 373 4))
0063.00 CHGVAR VAR(&DFTCCSID) VALUE(%BIN(&BIN4))
0064.00 CHGVAR VAR(&SWS) VALUE(%SST(&JOBVAR 350 8))
0065.00 CHGVAR VAR(&CYMDDATE) VALUE('1' *CAT &DATE)
0066.00 IF COND(%SST(&SWS 1 1) *EQ '1') THEN(DO)
0067.00 CHGVAR VAR(&LANGID) VALUE('DBG')
0068.00 ENDDO
0069.00 RETURN
0070.00
0071.00 ENDPGM
【解説】
API: QUSRJOBI の JOBI0300 と JOBI0400 の2つの機能による呼び出しによって
コマンド : RTVJOBA と同じ機能を再現しようととているのであるが
0046.00 IF COND(&TYPE *EQ 'B') THEN(CHGVAR VAR(&TYPE) +
0047.00 VALUE('0'))
0048.00 IF COND(&TYPE *EQ 'I') THEN(CHGVAR VAR(&TYPE) +
0049.00 VALUE('1'))
にも注意して頂きたい。API: QUSRJOBI による実行ジョブのタイプを取得すると
バッチ・ジョブの場合は「B」が入り、対話式ジョブの場合は「I」が入る。
これに対して RTVJOBA コマンドの場合は、バッチ・ジョブの場合は「0」が入り、
対話式ジョブの場合は「1」が入る。
従って QUSRJOBI の戻り値をうっかりそのまま信用してしまうと、ここでも
「落とし穴」にはまってしまうようである。
使用頻度が最も高いと思われる RTVJOBA コマンドには、このように
いくつもの盲点が潜んでいる。自分自身のジョブしか検索することはできない、とは
IBM マニュアルのどこにも書かれていないので、これはバグと言えるものでは
ないだろうか。
