RPG

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

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

RTVJOBA : ジョブ情報の検索は自分のジョブしか検索することができない

のである。
例えばバッチ・ジョブや他のジョブの情報を RTVJOBA コマンドを使って

RTVJOBA コマンド

のように検索したいとする。
指定したジョブの情報が得られるかと思いきや、実は戻り値として戻ってくるのは
指定したジョブではなくて、この RTVJOBA コマンドを実行した自分自身のジョブの
情報が戻ってくるだけである。
これには長い間気づかなかった。
指定したジョブ情報を正しく取得するには API: QUSRJOBI を使って検索しなければならない。
次は API: QUSRJOBI を使って RTVJOBA と同じ情報を戻す RPG のサンプルである。

【サンプル・ソース: RTVJOBA】
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: QUSRJOBIJOBI0300 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 マニュアルのどこにも書かれていないので、これはバグと言えるものでは
ないだろうか。