印刷スプールを保存するのにある 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 を変更する。
変更のあったスプールの数だけが最後にメッセージとして報告される。