ジョブ情報を検索するのであれば 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 マニュアルのどこにも書かれていないので、これはバグと言えるものでは
ないだろうか。