「50.バッチ印刷ジョブのジョブ番号を調べるには?」 で QPRTJOB の現在のジョブ番号を
取得する方法を紹介したが OS V5R2M0 からは、すべての場合に印刷スプールの
のすべてを取得することができるAPI : QSPRILSP が提供されるようになった。
通常、印刷スプールを OVRPRTF で HOLD しておいてから CPYSPLF やその他のバッチ処理で
PDF 化したり、別の PCサーバーに転送したりするのに印刷スプールを特定するために
RTVJOBA によってジョブの属性を取得して、それが印刷スプールにも適用されるはずであったが
バッチ・ジョブの場合では ジョブ名は QPRTJOB となり、ジョブ番号は QPRTJOB のジョブ番号と
なることを既に説明した。
したがって RTVJOBA ではバッチ・ジョブの場合は有効ではない。しかしバッチで実行されることを
考慮して QPRTJOB のジョブ番号を探すのも面倒である。
API : QSPRILSP であれば対話式環境であってもバッチ・ジョブ環境であっても、つねに
正しい印刷スプールの属性を取得することができる。
社内で RTVJOBA を行っている CLP があれば、QSPRILSP に置き換えてみてはどうだろうか ?
API : QSPRILSP のIBM による解説は英文でしかないのでご存知の方も少ないかも知れないので
紹介することにした。
下記に実際に EnterpriseServer で使用されている QSPRILSP を使用サンプル・ソースを
示す。
0001.00 PGM PARM(&SPLF &FILE &FILLIB)
0002.00 /*---------------------------------------------------------*/
0003.00 /* CVTBCHSPLF : スプール・ファイルのファイル変換 */
0004.00 /*---------------------------------------------------------*/
0005.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(80)
0006.00 DCL VAR(&SNDMSG) TYPE(*CHAR) LEN(132)
0007.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1)
0008.00 DCL VAR(&JOB) TYPE(*CHAR) LEN(10) +
0009.00 VALUE('QPRTJOB ')
0010.00 DCL VAR(&USER) TYPE(*CHAR) LEN(10) +
0011.00 VALUE('PGMR ')
0012.00 DCL VAR(&JOBNBR) TYPE(*CHAR) LEN(6)
0013.00 DCL VAR(&FILE) TYPE(*CHAR) LEN(10)
0014.00 DCL VAR(&FILLIB) TYPE(*CHAR) LEN(10)
0015.00 DCL VAR(&SPLF) TYPE(*CHAR) LEN(10)
0016.00 DCL VAR(&OS400) TYPE(*CHAR) LEN(6)
0017.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(4) +
0018.00 VALUE(X'00000000') /* 2 進数 */
0019.00 DCL VAR(&RCVDTA) TYPE(*CHAR) LEN(128)
0020.00 DCL VAR(&RCVLEN) TYPE(*CHAR) LEN(4)
0021.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
0022.00
0023.00 RTVJOBA TYPE(&TYPE)
0024.00 RTVDTAARA DTAARA(QGPL/QSS1MRI (1 6)) RTNVAR(&OS400)
0025.00 CHKOBJ OBJ(&FILLIB/&FILE) OBJTYPE(*FILE)
0026.00 MONMSG MSGID(CPF9800) EXEC(DO)
0027.00 CRTPF FILE(&FILLIB/&FILE) RCDLEN(132) IGCDTA(*YES) +
0028.00 LVLCHK(*NO) AUT(*ALL)
0029.00 ENDDO
0030.00 IF COND(&OS400 *GE 'V5R2M0') THEN(DO) /* +
0031.00 V5R2M0 以上 */
0032.00 CHGVAR VAR(%BIN(&RCVLEN)) VALUE(128)
0033.00 CALL PGM(QSPRILSP) PARM(&RCVDTA &RCVLEN +
0034.00 'SPRL0100' &APIERR)
0035.00 CHGVAR VAR(&SPLF) VALUE(%SST(&RCVDTA 9 10))
0036.00 CHGVAR VAR(&JOB) VALUE(%SST(&RCVDTA 19 10))
0037.00 CHGVAR VAR(&USER) VALUE(%SST(&RCVDTA 29 10))
0038.00 CHGVAR VAR(&JOBNBR) VALUE(%SST(&RCVDTA 39 6))
0039.00 ENDDO /* V5R2M0 以上 */
0040.00 ELSE CMD(DO) /* V5R1M0 以下 */
0041.00 CALL PGM(ASNET.COM/PRTJOBNO) PARM(&USER &JOBNBR)
0042.00 ENDDO /* V5R1M0 以下 */
0043.00 CPYSPLF FILE(&SPLF) TOFILE(&FILLIB/&FILE) +
0044.00 JOB(&JOBNBR/&USER/&JOB) SPLNBR(*LAST) +
0045.00 MBROPT(*REPLACE) CTLCHAR(*NONE)
0046.00 /*( スプールの削除 )*/
0047.00 DLTSPLF FILE(&SPLF) JOB(&JOBNBR/&USER/&JOB) +
0048.00 SPLNBR(*LAST)
0049.00 MONMSG CPF0000
0050.00 RETURN
0051.00
0052.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG)
0053.00 SNDMSG:
0054.00 IF COND(&TYPE *EQ '0') THEN(DO)
0055.00 CHGVAR VAR(&SNDMSG) VALUE('(CVTBCHSPLF)-' *CAT +
0056.00 &MSG)
0057.00 SNDPGMMSG MSG(&SNDMSG) TOMSGQ(*SYSOPR) MSGTYPE(*COMP)
0058.00 DMPCLPGM
0059.00 ENDDO
0060.00 ELSE CMD(DO)
0061.00 SNDPGMMSG MSG(&MSG) TOMSGQ(*TOPGMQ) MSGTYPE(*DIAG)
0062.00 ENDDO
0063.00 ENDPGM
eStudio で Ctrl + F7キーを押してコンパイルが指定されたときには、直後にコンパイル・リストが
eStudio (ブラウザ) に転送される。
このとき &FILE = COMPILE, &FILLIB = QTEMP として QTEMP/COMPILE という一時的な物理ファイルを
作成してここにスプール・ファイルが CPYSPLF によって複製される。
OS が V5R2M0 以上であれば API: QSPRILSP を使って直前に印刷したコンパイル・リストの
属性を取得してから CPYSPLF を実行するようにしている。