実行して最後に出力されたスプールはAPI: QSPRILSP によって
取得することができる。
QSPRILSP はあまり使われることがないAPIであるが
バッチ・ジョブ(QPRTJOB)のジョブ番号を検索したい場合などにも
役に立つAPIであるのでここでその使用方法を紹介する。

[サンプルAPI: TESTSPLN ]
ソースはこちらから
0001.00 PGM
0002.00 /*-------------------------------------------------------------------*/
0003.00 /* TESTSPLN : 最後に出力されたスプールの取得 */
0004.00 /* */
0005.00 /* 2021/04/10 作成 */
0006.00 /*-------------------------------------------------------------------*/
0007.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132)
0008.00 DCL VAR(&STMMSG) TYPE(*CHAR) LEN(132)
0009.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7)
0010.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10)
0011.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
0012.00 DCL VAR(&MSGKEY) TYPE(*CHAR) LEN(4)
0013.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132)
0014.00 DCL VAR(&ERRDTA) TYPE(*CHAR) LEN(132)
0015.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1)
0016.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)
0017.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +
0018.00 VALUE('*ESCAPE ')
0019.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) +
0020.00 VALUE(X'000074') /* 2 進数 */
0021.00 DCL VAR(&ERR) TYPE(*CHAR) LEN(1)
0022.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) +
0023.00 VALUE(X'00000000')
0024.00 /*( QSPRILSP の変数 )*/
0025.00 DCL VAR(&RCVDTA) TYPE(*CHAR) LEN(128)
0026.00 DCL VAR(&RCVLEN) TYPE(*CHAR) LEN(4) +
0027.00 VALUE(X'00000080') /* 128 */
0028.00 DCL VAR(&SPLF) TYPE(*CHAR) LEN(10)
0029.00 DCL VAR(&JOB) TYPE(*CHAR) LEN(10)
0030.00 DCL VAR(&USER) TYPE(*CHAR) LEN(10)
0031.00 DCL VAR(&JOBNBR) TYPE(*CHAR) LEN(6)
0032.00 DCL VAR(&SPLNB4) TYPE(*CHAR) LEN(4)
0033.00 DCL VAR(&SPLNO) TYPE(*DEC) LEN(6 0)
0034.00 DCL VAR(&SPLNOC) TYPE(*CHAR) LEN(6)
0035.00 MONMSG MSGID(CPF9999) EXEC(GOTO CMDLBL(ERROR))
0036.00
0037.00 /*( 環境の取得 )*/
0038.00 RTVJOBA TYPE(&TYPE)
0039.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */
0040.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ')
0041.00 ENDDO /* バッチ */
0042.00 ELSE CMD(DO) /* 対話式 */
0043.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ')
0044.00 ENDDO /* 対話式 */
0045.00
0046.00 /*( 印刷の出力 )*/
0047.00 RUNQRY QRY(*NONE) QRYFILE((QTRFIL/SHOHIN)) +
0048.00 OUTTYPE(*PRINTER)
0049.00
0050.00 /*( 出力されたスプールを取得する )*/
0051.00 CALL PGM(QSPRILSP) PARM(&RCVDTA &RCVLEN +
0052.00 'SPRL0100' &APIERR)
0053.00 IF COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)
0054.00 SNDPGMMSG +
0055.00 MSG('API: QSPRILSP の実行で次のエラーが発生 +
0056.00 しました。 ') MSGTYPE(*DIAG)
0057.00 GOTO APIERR
0058.00 ENDDO
0059.00 CHGVAR VAR(&SPLF) VALUE(%SST(&RCVDTA 9 10))
0060.00 CHGVAR VAR(&JOB) VALUE(%SST(&RCVDTA 19 10))
0061.00 CHGVAR VAR(&USER) VALUE(%SST(&RCVDTA 29 10))
0062.00 CHGVAR VAR(&JOBNBR) VALUE(%SST(&RCVDTA 39 6))
0063.00 CHGVAR VAR(&SPLNB4) VALUE(%SST(&RCVDTA 45 4))
0064.00 CHGVAR VAR(&SPLNO) VALUE(%BIN(&SPLNB4))
0065.00 CHGVAR VAR(&SPLNOC) VALUE(&SPLNO)
0066.00 CHGVAR VAR(&MSG) VALUE(' 最後に出力されたスプールは ' *CAT +
0067.00 &SPLF *TCAT '.' *CAT &JOB *TCAT '/' +
0068.00 *CAT &USER *TCAT '/' *CAT &JOBNBR *CAT +
0069.00 ' スプール番号 ' *CAT &SPLNOC *CAT +
0070.00 ' です。 ')
0071.00 CHGVAR VAR(&MSGTYPE) VALUE('*DIAG')
0072.00 GOTO SNDMSG
0073.00 RETURN
0074.00
0075.00 APIERR:
0076.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7))
0077.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))
0078.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ')
0079.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ')
0080.00 GOTO SNDMSG
0081.00
0082.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) KEYVAR(&MSGKEY) +
0083.00 MSGDTA(&MSGDTA) MSGID(&MSGID)
0084.00 IF COND(&MSGID *EQ 'CPF9999') THEN(DO)
0085.00 CHGVAR VAR(&ERRDTA) VALUE(&MSGDTA)
0086.00 RCVMSG MSGTYPE(*PRV) MSGKEY(&MSGKEY) RMV(*NO) +
0087.00 MSG(&MSG) MSGDTA(&MSGDTA) MSGID(&MSGID) +
0088.00 MSGF(&MSGF) MSGFLIB(&MSGFLIB)
0089.00 ENDDO
0090.00 CHGVAR VAR(&STMMSG) VALUE(' プログラム ' *CAT +
0091.00 %SST(&ERRDTA 8 10) *TCAT +
0092.00 ' のステートメント ' *CAT %SST(&ERRDTA +
0093.00 24 4) *CAT ' で次のエラーが発生しました。 ')
0094.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STMMSG) +
0095.00 TOMSGQ(&TOPGMQ) MSGTYPE(*DIAG)
0096.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO)
0097.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +
0098.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)
0099.00 MONMSG MSGID(CPF2400) EXEC(RETURN)
0100.00 ENDDO
0101.00 ELSE CMD(DO)
0102.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
0103.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +
0104.00 MSGTYPE(&MSGTYPE)
0105.00 MONMSG MSGID(CPF2400) EXEC(RETURN)
0106.00 ENDDO
0107.00 ENDPGM
[コンパイル]
CRTCLPGM OBJLIB/TESTSPLN SRCFILE(MYSRCLIB/QCLSRC) AUT(*ALL)
[解説]
使用方法は解説するまでもないほど簡単である。
0051.00 CALL PGM(QSPRILSP) PARM(&RCVDTA &RCVLEN + 0052.00 'SPRL0100' &APIERR)
として実行するだけで &RCVDTA にスプール情報が戻される。
