ジョブ情報を検索するのであれば API を使わなくてもコマンド RTVJOBA
を
使えば十分ではないかと諸兄は考えるかも知れないが、実は RTVJOBA
を
うかつに信用してしまうと、とんでもないことになる場合がある。
実は、
のである。
例えばバッチ・ジョブや他のジョブの情報を RTVJOBA
コマンドを使って
のように検索したいとする。
指定したジョブの情報が得られるかと思いきや、実は戻り値として戻ってくるのは
指定したジョブではなくて、この RTVJOBA
コマンドを実行した自分自身のジョブの
情報が戻ってくるだけである。
これには長い間気づかなかった。
指定したジョブ情報を正しく取得するには API: QUSRJOBI
を使って検索しなければならない。
次は API: QUSRJOBI
を使って RTVJOBA
と同じ情報を戻す RPG のサンプルである。
0001.00 H DATEDIT(*YMD/) DFTNAME(RTVJOBA) 0002.00 F********** ジョブ情報の取得 ****************************************** 0003.00 F* 0004.00 F********************************************************************** 0005.00 /COPY QSYSINC/QRPGLESRC,QUSRJOBI 0006.00 0007.00 D JOBINFO DS 0008.00 D JOB 1 10 0009.00 D USER 11 20 0010.00 D NBR 21 26 0011.00 0012.00 D APIERR DS 0013.00 D GETBYT 1 4B 0 INZ(16) 0014.00 D AVLBYT 5 8B 0 INZ(0) 0015.00 D ECPERR 9 15 0016.00 D ECP 16 16 0017.00 0018.00 D RCVLEN S 4B 0 INZ 0019.00 0020.00 C*----------------------------------------------------+ 0021.00 C *ENTRY PLIST | 0022.00 C PARM JOB_NAME 10 | 0023.00 C PARM USR_NAME 10 | 0024.00 C PARM NBR_NAME 6 | 0025.00 C PARM OUTQ 10 | 0026.00 C PARM OUTQLIB 10 | 0027.00 C PARM DATE 6 | 0028.00 C PARM TYPE 1 | 0029.00 C PARM PRTDEV 10 | 0030.00 C PARM LANGID 3 | 0031.00 C PARM CNTRYID 2 | 0032.00 C PARM CCSID 5 0 | 0033.00 C PARM DFTCCSID 5 0 | 0034.00 C PARM CYMDDATE 8 | 0035.00 C PARM SBMMSGQ 10 | 0036.00 C PARM SBMMSGQLIB 10 | 0037.00 C*----------------------------------------------------+ 0038.00 C*( ジョブ属性検索 ) 0039.00 C MOVEL JOB_NAME JOB 0040.00 C MOVEL USR_NAME USER 0041.00 C MOVEL NBR_NAME NBR 0042.00 C EVAL RCVLEN = %SIZE(QUSI030000) 0043.00 C*----------------------------------------------------+ 0044.00 C CALL 'QUSRJOBI' 0045.00 C PARM QUSI030000 0046.00 C PARM RCVLEN 0047.00 C PARM 'JOBI0300' FORMAT 8 0048.00 C PARM JOBINFO 0049.00 C PARM JOBID 16 0050.00 C PARM APIERR 0051.00 C*----------------------------------------------------+ 0052.00 C EVAL JOBID = QUSIJID02 0053.00 C EVAL OUTQ = QUSON 0054.00 C EVAL OUTQLIB = QUSOL 0055.00 C EVAL DATE = QUSJD 0056.00 C IF QUSJT05 = 'B' 0057.00 C EVAL TYPE = '0' 0058.00 C ELSE 0059.00 C EVAL TYPE = '1' 0060.00 C ENDIF 0061.00 C EVAL SBMMSGQ = QUSSMN 0062.00 C EVAL SBMMSGQLIB = QUSSML 0063.00 C EVAL PRTDEV = QUSPDN 0064.00 C MOVE *BLANKS JOBINFO 0065.00 C MOVEL '*INT' JOB 0066.00 C*----------------------------------------------------+ 0067.00 C CALL 'QUSRJOBI' 0068.00 C PARM QUSI0400 0069.00 C PARM RCVLEN 0070.00 C PARM 'JOBI0400' FORMAT 8 0071.00 C PARM JOBINFO 0072.00 C PARM JOBID 16 0073.00 C PARM APIERR 0074.00 C*----------------------------------------------------+ 0075.00 C EVAL LANGID = QUSLID01 0076.00 C EVAL CNTRYID = QUSCID01 0077.00 C EVAL CCSID = QUSCCSID07 0078.00 C EVAL DFTCCSID = QUSDCCSI 0079.00 C SETON LR 0080.00 C RETURN
API: QUSRJOBI
の JOBI0300
と JOBI0400
の2つの機能による呼び出しによって
コマンド : RTVJOBA
と同じ機能を再現しようととているのであるが
0056.00 C IF QUSJT05 = 'B' 0057.00 C EVAL TYPE = '0' 0058.00 C ELSE 0059.00 C EVAL TYPE = '1' 0060.00 C ENDIF
にも注意して頂きたい。API: QUSRJOBI
による実行ジョブのタイプを取得すると
バッチ・ジョブの場合は「B
」が入り、対話式ジョブの場合は「I」が入る。
これに対して RTVJOBA
コマンドの場合は、バッチ・ジョブの場合は「0」が入り、
対話式ジョブの場合は「1
」が入る。
従って QUSRJOBI
の戻り値をうっかりそのまま信用してしまうと、ここでも
「落とし穴」にはまってしまうようである。
使用頻度が最も高いと思われる RTVJOBA
コマンドには、このように
いくつもの盲点が潜んでいる。自分自身のジョブしか検索することはできない、とは
IBM マニュアルのどこにも書かれていないので、これはバグと言えるものでは
ないだろうか。