実行して最後に出力されたスプールは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 にスプール情報が戻される。