CL

50. バッチ印刷ジョブのジョブ番号を調べるには ?

Webでの印刷プログラムを実行したり、印刷業務を SBMJOB などでバッチ・ジョブに投入した場合の
印刷スプールを扱うのは、ややテクニックを要する。
というのはバッチ・ジョブ上で実行して出力された印刷スプールのジョブ名とジョブ番号は、
RTVJOBA コマンドによって検索される自分自身のジョブのジョブ名やジョブ番号ではないからである。
バッチ・ジョブで実行されて出力された印刷スプールは、

      ジョブ名 .............. QPRTJOB
      ジョブ番号 ............ QPRTJOB の現在のジョブ番号

となるからである。
Ftp のリモート・ジョブを使って印刷出力を行った場合もこの規則に準拠している。
ここでやっかいであるのは QPRTJOB のジョブ番号である。
QPRTJOB のジョブ番号は 24時間以上の使用がないときに初めて +1 のカウント・アップがされる。
つまり繰り返しいろいろなジョブから QPRTJOB、つまりバッチ印刷が実行されているときには
QPRTJOB のジョブ番号はつねに同じ番号である。
24時間以上誰もバッチ印刷を行わなかったときに限り、初めてジョブ番号が + 1 されるのである。

従って印刷スプールのジョブ名やジョブ番号は容易には正しい値を取得することができない。
かと言って QPRTJOB の現在のジョブ番号を取得するための OS によるコマンドや API も用意されていない。
これは自作するしか方法がない。
Web化製品を販売しているとこの質問は非常に多い。
弊社では PRTJOBNO という名前のプログラムをAPI として提供しており、
使用方法のサンプルCLP も 潟Iフィスクアトロ Webサイト のワーク・ショップで公開している。

PRTJOBNO は

        CALL PRTJOBNO PARM(&USER &JOBNBR)

として実行すると &JOBNBRQPRTJOB の現在のジョブ番号を戻してくれる。
下記に PRTJOBNO のソースを紹介する。

0001.00              PGM        PARM(&USER &JOBNBR)
0002.00 /*---------------------------------------------------------*/
0003.00 /*   PRTJOBNO : QPRTJOB のジョブ番号を検索                 */
0004.00 /*---------------------------------------------------------*/
0005.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)
0006.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)
0007.00              DCL        VAR(&USER) TYPE(*CHAR) LEN(10)
0008.00              DCL        VAR(&JOBNBR) TYPE(*CHAR) LEN(6)
0009.00              DCL        VAR(&JOBNAME) TYPE(*CHAR) LEN(26)
0010.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(4) +
0011.00                           VALUE(X'00000000') /* 2 進数  */
0012.00              DCL        VAR(&STRPOS) TYPE(*CHAR) LEN(4) +
0013.00                           VALUE(X'0000007D') /* 2 進数開始位置  : +
0014.00                           125 */
0015.00              DCL        VAR(&LENDTA) TYPE(*CHAR) LEN(4) +
0016.00                           VALUE(X'00000010') /* 2 進数受取長さ  : 16 */
0017.00              DCL        VAR(&RCVVAR) TYPE(*CHAR) LEN(16) +
0018.00                           VALUE(X'0000000000000000')
0019.00              DCL        VAR(&OFFSET) TYPE(*CHAR) LEN(4) /* +
0020.00                           2 進数 オフセット */
0021.00              DCL        VAR(&NOENTR) TYPE(*CHAR) LEN(4) /* +
0022.00                           2 進数項目数  */
0023.00              DCL        VAR(&LSTSIZ) TYPE(*CHAR) LEN(4) /* +
024.00                           2 進数リストサイズ  */
025.00              DCL        VAR(&DEC08) TYPE(*DEC) LEN(8 0) /* WORK */
026.00              DCL        VAR(&ADDLEN) TYPE(*DEC) LEN(8 0) /* WORK */
027.00              DCL        VAR(&NOENT) TYPE(*DEC) LEN(8 0) /* WORK */
028.00              DCL        VAR(&N) TYPE(*DEC) LEN(8 0) VALUE(1) /* WORK */
029.00              DCL        VAR(&RCVDTA) TYPE(*CHAR) LEN(256) /* +
030.00                            受取データ  */
031.00          /*  MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) */
032.00
033.00              RTVJOBA    TYPE(&TYPE)
034.00 /*( ユーザー・スペースの作成 )*/
035.00              CALL       PGM(QUSCRTUS) PARM('QUSLJOB   +
036.00                           QTEMP     ' 'PF        ' 1000 ' ' +
037.00                           '*ALL      ' 'QUSLJOB 用ユーザー空間 ' +
038.00                           '*YES      ' &APIERR)
039.00              MONMSG     CPF9870
040.00 /*( QUSLJOB :  ジョブ・リストの出力 )*/
041.00              CHGVAR     VAR(&JOBNAME) VALUE('QPRTJOB   ' *CAT +
042.00                           &USER *CAT '*ALL  ')
043.00              CALL       PGM(QUSLJOB) PARM('QUSLJOB   QTEMP     ' +
044.00                           'JOBL0100' &JOBNAME '*ALL      ' &APIERR)
045.00 /*( リストAPIで作成されたユーザー空間の検索 )*/
046.00      /*( リストデータセクションのオフセットを検索 )*/
047.00              CALL       PGM(QUSRTVUS) PARM('QUSLJOB   QTEMP     ' +
0048.00                           &STRPOS &LENDTA &RCVVAR)
0049.00              CHGVAR     VAR(&OFFSET) VALUE(%SST(&RCVVAR 1 4))
0050.00              CHGVAR     VAR(&NOENTR) VALUE(%SST(&RCVVAR 9 4))
0051.00              CHGVAR     VAR(&LSTSIZ) VALUE(%SST(&RCVVAR 13 4))
0052.00
0053.00          /*( RCVVAR によって OFFSET,LSTSIZ を受取った )*/
0054.00              CHGVAR     VAR(&STRPOS) VALUE(&OFFSET)
0055.00              CHGVAR     VAR(&DEC08) VALUE(%BIN(&STRPOS))
0056.00              CHGVAR     VAR(&DEC08) VALUE(&DEC08 + 1)
0057.00              CHGVAR     VAR(%BIN(&STRPOS)) VALUE(&DEC08)
0058.00              CHGVAR     VAR(&LENDTA) VALUE(&LSTSIZ)
0059.00              CHGVAR     VAR(&ADDLEN) VALUE(%BIN(&LENDTA))
0060.00              CHGVAR     VAR(&NOENT) VALUE(%BIN(&NOENTR))
0061.00 NXTRTV:
0062.00              CALL       PGM(QUSRTVUS) PARM('QUSLJOB   QTEMP     ' +
0063.00                           &STRPOS &LENDTA &RCVDTA)
0064.00              /*( 処理の開始 )*/
0065.00              CHGVAR     VAR(&JOBNBR) VALUE(%SST(&RCVDTA 21 6))
0066.00              RETURN
0067.00              /*( 処理の終了 )*/
0068.00              IF         COND(&N < &NOENT) THEN(DO)
0069.00              CHGVAR     VAR(&N) VALUE(&N + 1)
0070.00              CHGVAR     VAR(&DEC08)  VALUE(%BIN(&STRPOS))
0071.00              CHGVAR     VAR(&DEC08) VALUE(&DEC08 + &ADDLEN)
0072.00              CHGVAR     VAR(%BIN(&STRPOS)) VALUE(&DEC08)
0073.00              GOTO       NXTRTV
0074.00              ENDDO
0075.00              RETURN
0076.00
0077.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG)
0078.00  SNDMSG:
0079.00              IF         COND(&TYPE *EQ '0') THEN(DO)
0080.00              SNDPGMMSG  MSG(&MSG) TOMSGQ(*SYSOPR) MSGTYPE(*COMP)
0081.00              ENDDO
0082.00              ELSE       CMD(DO)
0083.00              SNDPGMMSG  MSG(&MSG) TOMSGQ(*TOPGMQ) MSGTYPE(*DIAG)
0084.00              ENDDO
0085.00              ENDPGM