「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
を実行するようにしている。