印刷スプールを保存するのにある OUTQ にまとめて保管している例がある。
Spool ライターVer5.0 でまとめて PDF に変換して別の PC サーバーへ Ftp 転送すれば
高価な IBM i の HDD に長期保存しなくて済む。
何より PDF にして PC サーバーに保存すれば社内全員がいつでも参照することが
できるし保存コストも安くて済む。
PC サーバーの耐久性も心配のない時代にはなっているが
PC サーバーが不安であればクラウドに保存すればよい。
と、いうことで PDF ドライバーに連携した PDFDEV という名前の OUTQ に
現在、保管されているスプールをすべて移せばよいところまでわかった。
ところが保管用のスプール・ファイルは
しかも保管済みのスプールは 5000 個以上ある。
手動ではとても 5000 個のスプールを CHGOUTQ することはできない。
そこで作成したのがここに紹介する CHGOUTQF : OUTQ のスプール属性変更
( CHGOUTQF ) である。
OUTQ のスプール属性変更 (CHGOUTQF)
選択項目を入力して,実行キーを押してください。
出力待ち行列 . . . . . . . . . > IPPOUTQ 名前
ライブラリー . . . . . . . . > SPOOLWTR 名前 , *LIBL, *CURLIB
状況 (STS) . . . . . . . . . . > *READY *SAME, *READY, *HELD
TO 出力待ち行列 . . . . . . . . > PDFDEV 名前 , *SAME
ライブラリー . . . . . . . . > QUSRSYS 名前 , *LIBL, *CURLIB
現在の OUTQ を「出力待ち行列」パラメータとして指定する。
状況( STS )を *READY として指定すると *HLD 状態のスプールがあれば
RLSPLF コマンドによってリリース・モードに戻してくれる。
「 TO 出力待ち行列 」に PDFDEV として PDF 変換する OUTQ を指定すれば
指定した OUTQ に一括して変更が行われる。
実行後には変更したスプールの個数が報告される。
0001.00 CMD PROMPT('OUTQ のスプール属性変更 ')
0002.00 PARM KWD(OUTQ) +
0003.00 TYPE(OUTQ) +
0004.00 PROMPT(' 出力待ち行列 ')
0005.00 OUTQ: QUAL TYPE(*NAME) LEN(10)
0006.00 QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) +
0007.00 SPCVAL((*LIBL) (*CURLIB '*CURLIB ')) +
0008.00 EXPR(*YES) PROMPT(' ライブラリー ')
0009.00 PARM KWD(STS) TYPE(*CHAR) LEN(10) RSTD(*YES) +
0010.00 DFT(*SAME) VALUES(*READY *HELD) +
0011.00 SPCVAL((*SAME)) PROMPT(' 状況 (STS)')
0012.00 PARM KWD(TOOUTQ) TYPE(TOOUTQ) +
0013.00 PROMPT('TO 出力待ち行列 ')
0014.00 TOOUTQ: QUAL TYPE(*NAME) LEN(10) DFT(*SAME) SPCVAL((*SAME))
0015.00 QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) +
0016.00 SPCVAL((*LIBL) (*CURLIB '*CURLIB ')) +
0017.00 EXPR(*YES) PROMPT(' ライブラリー ')
CRTCMD CMD(MYLIB/CHGOUTQF) PGM(MYLIB/CHGOUTQFCL) SRCFILE(MYSRCLIB/QCMDSRC) AUT(*ALL)
0001.00 PGM PARM(&OUTQQLIB &STS &TOOUTQQLIB)
0002.00 /*-------------------------------------------------------------------*/
0003.00 /* CHGOUTQFCL : OUTQ のスプール属性変更 */
0004.00 /* */
0005.00 /* 2018/11/16 作成 */
0006.00 /*-------------------------------------------------------------------*/
0007.00 DCL VAR(&OUTQQLIB) TYPE(*CHAR) LEN(20)
0008.00 DCL VAR(&OUTQ) TYPE(*CHAR) LEN(10)
0009.00 DCL VAR(&OUTQLIB) TYPE(*CHAR) LEN(10)
0010.00 DCL VAR(&STS) TYPE(*CHAR) LEN(10)
0011.00 DCL VAR(&TOOUTQQLIB) TYPE(*CHAR) LEN(20)
0012.00 DCL VAR(&TOOUTQ) TYPE(*CHAR) LEN(10)
0013.00 DCL VAR(&TOOUTQLIB) TYPE(*CHAR) LEN(10)
0014.00 DCL VAR(&STSMSG) TYPE(*CHAR) LEN(132)
0015.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132)
0016.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7)
0017.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10)
0018.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
0019.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132)
0020.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1)
0021.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)
0022.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +
0023.00 VALUE('*ESCAPE ')
0024.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) +
0025.00 VALUE(X'000074') /* 2 進数 */
0026.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) +
0027.00 VALUE(X'00000000')
0028.00 /*( QUSRTVUS 用の変数 )*/
0029.00 DCL VAR(&STRPOS) TYPE(*CHAR) LEN(4) +
0030.00 VALUE(X'0000007D') /* 2 進数開始位置 : +
0031.00 125 */
0032.00 DCL VAR(&LENDTA) TYPE(*CHAR) LEN(4) +
0033.00 VALUE(X'00000010') /* 2 進数受取長さ : 16 */
0034.00 DCL VAR(&RCVVAR) TYPE(*CHAR) LEN(16) +
0035.00 VALUE(X'0000000000000000')
0036.00 DCL VAR(&OFFSET) TYPE(*CHAR) LEN(4) /* +
0037.00 2 進数 オフセット */
0038.00 DCL VAR(&NOENTR) TYPE(*CHAR) LEN(4) /* +
0039.00 2 進数項目数 */
0040.00 DCL VAR(&LSTSIZ) TYPE(*CHAR) LEN(4) /* +
0041.00 2 進数リストサイズ */
0042.00 DCL VAR(&DEC08) TYPE(*DEC) LEN(8 0) /* WORK */
0043.00 DCL VAR(&ADDLEN) TYPE(*DEC) LEN(8 0) /* WORK */
0044.00 DCL VAR(&NOENT) TYPE(*DEC) LEN(8 0) /* WORK */
0045.00 DCL VAR(&N) TYPE(*DEC) LEN(8 0) VALUE(1) /* WORK */
0046.00 DCL VAR(&RCVDTA) TYPE(*CHAR) LEN(256) /* +
0047.00 受取データ */
0048.00 DCL VAR(&JOBINFO) TYPE(*CHAR) LEN(16) /* +
0049.00 JOB 内部識別コード */
0050.00 DCL VAR(&SPLINFO) TYPE(*CHAR) LEN(16) /* +
0051.00 SPL 内部識別コード */
0052.00 DCL VAR(&UPDSUR) TYPE(*DEC) LEN(5 0) VALUE(0)
0053.00 DCL VAR(&CHAR5) TYPE(*CHAR) LEN(5)
0054.00 /*( QUSRSPLA : スプールの属性用変数 )*/
0055.00 DCL VAR(&SPLVAR) TYPE(*CHAR) LEN(5000)
0056.00 DCL VAR(&SPLLEN) TYPE(*CHAR) LEN(4) +
0057.00 VALUE(X'00001388')
0058.00 DCL VAR(&JOBID) TYPE(*CHAR) LEN(16)
0059.00 DCL VAR(&SPLID) TYPE(*CHAR) LEN(16)
0060.00 DCL VAR(&JOB) TYPE(*CHAR) LEN(10)
0061.00 DCL VAR(&USER) TYPE(*CHAR) LEN(10)
0062.00 DCL VAR(&JOBNBR) TYPE(*CHAR) LEN(6)
0063.00 DCL VAR(&SPLF) TYPE(*CHAR) LEN(10)
0064.00 DCL VAR(&SPLNBR) TYPE(*DEC) LEN(8 0)
0065.00 DCL VAR(&FLD4) TYPE(*CHAR) LEN(4)
0066.00 DCL VAR(&STATUS) TYPE(*CHAR) LEN(10)
0067.00 DCL VAR(&UPD) TYPE(*CHAR) LEN(1)
0068.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
0069.00
0070.00 /*( 環境の取得 )*/
0071.00 RTVJOBA TYPE(&TYPE)
0072.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */
0073.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ')
0074.00 ENDDO /* バッチ */
0075.00 ELSE CMD(DO) /* 対話式 */
0076.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ')
0077.00 ENDDO /* 対話式 */
0078.00
0079.00 /*( パラメータの取得 )*/
0080.00 CHGVAR VAR(&OUTQ) VALUE(%SST(&OUTQQLIB 01 10))
0081.00 CHGVAR VAR(&OUTQLIB) VALUE(%SST(&OUTQQLIB 11 10))
0082.00 IF COND(%SST(&OUTQLIB 1 1) *EQ '*') THEN(DO)
0083.00 RTVOBJD OBJ(&OUTQLIB/&OUTQ) OBJTYPE(*OUTQ) +
0084.00 RTNLIB(&OUTQLIB)
0085.00 ENDDO
0086.00 CHGVAR VAR(&TOOUTQ) VALUE(%SST(&TOOUTQQLIB 01 10))
0087.00 CHGVAR VAR(&TOOUTQLIB) VALUE(%SST(&TOOUTQQLIB 11 10))
0088.00 IF COND(&TOOUTQ *NE '*SAME ') THEN(DO)
0089.00 CHKOBJ OBJ(&TOOUTQLIB/&TOOUTQ) OBJTYPE(*OUTQ)
0090.00 MONMSG MSGID(CPF9800) EXEC(GOTO CMDLBL(ERROR))
0091.00 IF COND((&TOOUTQ *EQ &OUTQ) *AND (&TOOUTQLIB +
0092.00 *EQ &OUTQLIB)) THEN(DO)
0093.00 CHGVAR VAR(&MSG) +
0094.00 VALUE(' 変更後の OUTQ が変更前と同じです。 ')
0095.00 GOTO SNDMSG
0096.00 ENDDO
0097.00 ENDDO
0098.00
0099.00 /*( ユーザー・スペースの作成 )*/
0100.00 CALL PGM(QUSCRTUS) PARM('QUSLSPL +
0101.00 QTEMP ' 'PF ' 1000 ' ' +
0102.00 '*ALL ' 'QUSLSPL 用ユーザー空間 ' +
0103.00 '*YES ' &APIERR)
0104.00 MONMSG CPF9870
0105.00 /*( 状況メッセージの表示 )*/
0106.00 CHGJOB STSMSG(*NORMAL)
0107.00 CHGVAR VAR(&STSMSG) VALUE(' 印刷待ち行列 ' *CAT +
0108.00 &OUTQLIB *TCAT '/' *CAT &OUTQ *TCAT +
0109.00 ' を検索中。 ')
0110.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STSMSG) +
0111.00 TOPGMQ(*EXT) MSGTYPE(*STATUS)
0112.00 /*( 印刷スプールの一覧 )*/
0113.00 CALL PGM(QUSLSPL) PARM('QUSLSPL QTEMP ' +
0114.00 'SPLF0100' '*ALL ' &OUTQQLIB +
0115.00 '*ALL ' '*ALL ' &APIERR)
0116.00 IF COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)
0117.00 SNDPGMMSG +
0118.00 MSG('API: QUSLSPL の実行で次のエラーが発生 +
0119.00 しました。 ') MSGTYPE(*DIAG)
0120.00 GOTO APIERR
0121.00 ENDDO
0122.00 /*( リストAPIで作成されたユーザー空間の検索 )*/
0123.00 /*( リストデータセクションのオフセットを検索 )*/
0124.00 CALL PGM(QUSRTVUS) PARM('QUSLSPL QTEMP ' +
0125.00 &STRPOS &LENDTA &RCVVAR)
0126.00 CHGVAR VAR(&OFFSET) VALUE(%SST(&RCVVAR 1 4))
0127.00 CHGVAR VAR(&NOENTR) VALUE(%SST(&RCVVAR 9 4))
0128.00 CHGVAR VAR(&LSTSIZ) VALUE(%SST(&RCVVAR 13 4))
0129.00
0130.00 /*( RCVVAR によって OFFSET,LSTSIZ を受取った )*/
0131.00 CHGVAR VAR(&STRPOS) VALUE(&OFFSET)
0132.00 CHGVAR VAR(&DEC08) VALUE(%BIN(&STRPOS))
0133.00 CHGVAR VAR(&DEC08) VALUE(&DEC08 + 1)
0134.00 CHGVAR VAR(%BIN(&STRPOS)) VALUE(&DEC08)
0135.00 CHGVAR VAR(&LENDTA) VALUE(&LSTSIZ)
0136.00 CHGVAR VAR(&ADDLEN) VALUE(%BIN(&LENDTA))
0137.00 CHGVAR VAR(&NOENT) VALUE(%BIN(&NOENTR))
0138.00 NXTRTV:
0139.00 CALL PGM(QUSRTVUS) PARM('QUSLSPL QTEMP ' +
0140.00 &STRPOS &LENDTA &RCVDTA)
0141.00 /*( 処理の開始 )*/
0142.00 CHGVAR VAR(&UPD) VALUE(' ')
0143.00 CHGVAR VAR(&JOBINFO) VALUE(%SST(&RCVDTA 51 16))
0144.00 CHGVAR VAR(&SPLINFO) VALUE(%SST(&RCVDTA 67 16))
0145.00 /*( スプールの属性 )*/
0146.00 CALL PGM(QUSRSPLA) PARM(&SPLVAR &SPLLEN +
0147.00 'SPLA0100' '*INT ' +
0148.00 &JOBINFO &SPLINFO '*INT ' 0 &APIERR)
0149.00 IF COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)
0150.00 SNDPGMMSG +
0151.00 MSG('API: QUSRSPLA の実行で次のエラーが発生 +
0152.00 しました。 ') MSGTYPE(*DIAG)
0153.00 GOTO APIERR
0154.00 ENDDO
0155.00 CHGVAR VAR(&JOB) VALUE(%SST(&SPLVAR 41 10))
0156.00 CHGVAR VAR(&USER) VALUE(%SST(&SPLVAR 51 10))
0157.00 CHGVAR VAR(&JOBNBR) VALUE(%SST(&SPLVAR 61 6))
0158.00 CHGVAR VAR(&SPLF) VALUE(%SST(&SPLVAR 67 10))
0159.00 CHGVAR VAR(&FLD4) VALUE(%SST(&SPLVAR 77 4))
0160.00 CHGVAR VAR(&SPLNBR) VALUE(%BIN(&FLD4))
0161.00 CHGVAR VAR(&STATUS) VALUE(%SST(&SPLVAR 101 10))
0162.00 /*( OUTQ の変更 )*/
0163.00 IF COND(&TOOUTQ *NE '*SAME ') THEN(DO) /* +
0164.00 OUTQ の変更 */
0165.00 CHGSPLFA FILE(&SPLF) JOB(&JOBNBR/&USER/&JOB) +
0166.00 SPLNBR(&SPLNBR) OUTQ(&TOOUTQLIB/&TOOUTQ)
0167.00 CHGVAR VAR(&UPD) VALUE('*')
0168.00 ENDDO /* OUTQ の変更 */
0169.00 /*( STAUS の変更 )*/
0170.00 IF COND(&STS *NE '*SAME ') THEN(DO) /* +
0171.00 STS の変更 */
0172.00 IF COND((&STS *EQ '*READY ') *AND (&STATUS +
0173.00 *NE '*READY ')) THEN(DO)
0174.00 RLSSPLF FILE(&SPLF) JOB(&JOBNBR/&USER/&JOB) +
0175.00 SPLNBR(&SPLNBR)
0176.00 CHGVAR VAR(&UPD) VALUE('*')
0177.00 ENDDO
0178.00 IF COND((&STS *EQ '*HELD ') *AND (&STATUS +
0179.00 *NE '*HELD ')) THEN(DO)
0180.00 HLDSPLF FILE(&SPLF) JOB(&JOBNBR/&USER/&JOB) +
0181.00 SPLNBR(&SPLNBR)
0182.00 CHGVAR VAR(&UPD) VALUE('*')
0183.00 ENDDO
0184.00 ENDDO /* STS の変更 */
0185.00 IF COND(&UPD *EQ '*') THEN(DO) /* 更新マーク */
0186.00 CHGVAR VAR(&UPDSUR) VALUE(&UPDSUR + 1)
0187.00 ENDDO /* 更新マーク */
0188.00 /*( 処理の終了 )*/
0189.00 PASS:
0190.00 IF COND(&N < &NOENT) THEN(DO)
0191.00 CHGVAR VAR(&N) VALUE(&N + 1)
0192.00 CHGVAR VAR(&DEC08) VALUE(%BIN(&STRPOS))
0193.00 CHGVAR VAR(&DEC08) VALUE(&DEC08 + &ADDLEN)
0194.00 CHGVAR VAR(%BIN(&STRPOS)) VALUE(&DEC08)
0195.00 GOTO NXTRTV
0196.00 ENDDO
0197.00
0198.00 /*( 更新した個数の先行ゼロ消去 )*/
0199.00 IF COND(&UPDSUR > 0) THEN(DO)
0200.00 CHGVAR VAR(&CHAR5) VALUE(&UPDSUR)
0201.00 ZERO: IF COND(%SST(&CHAR5 1 1) *EQ '0') THEN(DO)
0202.00 CHGVAR VAR(&CHAR5) VALUE(%SST(&CHAR5 2 4))
0203.00 GOTO ZERO
0204.00 ENDDO
0205.00 CHGVAR VAR(&MSG) VALUE(&CHAR5 *TCAT +
0206.00 ' 個のスプール・ファイルを更新しました。 '+
0207.00 )
0208.00 ENDDO
0209.00 ELSE CMD(DO)
0210.00 CHGVAR VAR(&MSG) +
0211.00 VALUE(' 更新されたスプール・ファイルはあり +
0212.00 ません。 ')
0213.00 ENDDO
0214.00 CHGVAR VAR(&MSGTYPE) VALUE('*DIAG ')
0215.00 GOTO SNDMSG
0216.00
0217.00 APIERR:
0218.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7))
0219.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))
0220.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ')
0221.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ')
0222.00 GOTO SNDMSG
0223.00
0224.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +
0225.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +
0226.00 MSGFLIB(&MSGFLIB)
0227.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO)
0228.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +
0229.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)
0230.00 MONMSG MSGID(CPF2400) EXEC(RETURN)
0231.00 ENDDO
0232.00 ELSE CMD(DO)
0233.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
0234.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +
0235.00 MSGTYPE(&MSGTYPE)
0236.00 MONMSG MSGID(CPF2400) EXEC(RETURN)
0237.00 ENDDO
0238.00 ENDPGM
CRTCLPGM PGM(MYLIB/CHGOUTQFCL) SRCFILE(MYSRCLIB/QCLSRC) AUT(*ALL)
最初にユーザー・スペース QUSLSPL をライブラリー: QTEMP に次のように
作成する。
0099.00 /*( ユーザー・スペースの作成 )*/
0100.00 CALL PGM(QUSCRTUS) PARM('QUSLSPL +
0101.00 QTEMP ' 'PF ' 1000 ' ' +
0102.00 '*ALL ' 'QUSLSPL 用ユーザー空間 ' +
0103.00 '*YES ' &APIERR)
次に指定した OUTQ のスプールの一覧を次のようにしてユーザー・スペースに
出力する。
0112.00 /*( 印刷スプールの一覧 )*/
0113.00 CALL PGM(QUSLSPL) PARM('QUSLSPL QTEMP ' +
0114.00 'SPLF0100' '*ALL ' &OUTQQLIB +
0115.00 '*ALL ' '*ALL ' &APIERR)
API : QUSRTVUS によってユーザー・スペースを LOOP して検索して
各レコード: &RCVDTA を取得する。
&RCVDTA からジョブ属性、スプール属性が取得できるので
API: 0145.00 /*( スプールの属性 )*/ 0146.00 CALL PGM(QUSRSPLA) PARM(&SPLVAR &SPLLEN + 0147.00 'SPLA0100' '*INT ' + 0148.00 &JOBINFO &SPLINFO '*INT ' 0 &APIERR)
によってスプール属性を取得する。
CHGSPLFA または RLSSPLFA の実行によってスプールの *HLD/*READY を
切替える。
OUTQ の変更の指定があれば CHGSPLFA ... OUTQ(...) によって
OUTQ を変更する。
変更のあったスプールの数だけが最後にメッセージとして報告される。