CL

79. API: QUSRJOBI による正しいジョブ情報の検索

ジョブ情報を検索するのであれば API を使わなくてもコマンド RTVJOBA
使えば十分ではないかと諸兄は考えるかも知れないが、実は 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: QUSRJOBIJOBI0300 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 マニュアルのどこにも書かれていないので、これはバグと言えるものでは
ないだろうか。