ここで紹介するログの消去 ( CLRLOG ) コマンドは実際に製品で
使われているコマンドであり、弊社でも日常的に使用頻度の
高いコマンドである。
このログの消去 ( CLRLOG ) は指定した印刷待ち行列 ( OUTQ ) の中でも
状況 ( STATUS ) が *READY になっているスプールだけを消去する
もので先に紹介した OUTQ のスプール属性変更 ( CHGOUTQF ) と
動作原理は同じである。
OUTQの *READY になっているスプールだけを消す機能が必要なのは
残しておきたいスプールは *HLD や *SAV にしておけば
この CLRLOG コマンドを実行しても消されずに残るからである。
OUTQ の中のスプールの一覧を調べる方法の学習としても
CLRLOG コマンドは適切である。
ログの消去 (CLRLOG)
選択項目を入力して,実行キーを押してください。
ログ印刷待ち行列 . . . . . . . QNETJOBLOG 名前 , *NONE
ライブラリー . . . . . . . . ASNET.USR 名前 , *LIBL, *CURLIB
保留 (HLD) 中のログの消去 . . *NO *YES, *NO
AutoWeb の GO SERVER メニューの「 11. ログの消去 ( CLRLOG ) 」を
選択すると OUTQ: ASNET.USR/QNETJOGLOG を消去する CLRLOG コマンドを
実行することができる。
0001.00 CMD PROMPT(' ログの消去 ')
0002.00 PARM KWD(CLRLOG) TYPE(CLRLOG) +
0003.00 PROMPT(' ログ印刷待ち行列 ')
0004.00 CLRLOG: QUAL TYPE(*NAME) LEN(10) DFT(QNETJOBLOG) +
0005.00 SPCVAL((*NONE))
0006.00 QUAL TYPE(*NAME) LEN(10) DFT(ASNET.USR) +
0007.00 SPCVAL((*LIBL) (*CURLIB)) +
0008.00 PROMPT(' ライブラリー ')
0009.00 PARM KWD(CLRHLDLOG) TYPE(*CHAR) LEN(4) RSTD(*YES) +
0010.00 DFT(*NO) VALUES(*YES *NO) +
0011.00 PROMPT(' 保留 (HLD) 中のログの消去 ')
CRTCMD CMD(MYLIB/CLRLOG) PGM(MYLIB/CLRLOGCL) SRCFILE(MYSRCLIB/QCMDSRC) AUT(*ALL)
0001.00 PGM PARM(&LOGOUTQLIB &CLRHLDLOG)
0002.00 /*---------------------------------------------------------*/
0003.00 /* CLRLOG : ログの消去 */
0004.00 /* */
0005.00 /* 2014/12/08: ASNET.USR/QNETLOGLOG の消去だけに限定した */
0006.00 /*---------------------------------------------------------*/
0007.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132)
0008.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7)
0009.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10)
0010.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
0011.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132)
0012.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1)
0013.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)
0014.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +
0015.00 VALUE('*ESCAPE ')
0016.00 DCL VAR(&CLRHLDLOG) TYPE(*CHAR) LEN(4)
0017.00 DCL VAR(&LOGOUTQLIB) TYPE(*CHAR) LEN(20)
0018.00 DCL VAR(&CLRQ) TYPE(*CHAR) LEN(10)
0019.00 DCL VAR(&CLRQLIB) TYPE(*CHAR) LEN(10)
0020.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) +
0021.00 VALUE(X'000074') /* 2 進数 */
0022.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) +
0023.00 VALUE(X'00000000')
0024.00 /*( QUSRTVUS : リストAPIで作成されたユーザー空間の検索 )*/
0025.00 DCL VAR(&STRPOS) TYPE(*CHAR) LEN(4) +
0026.00 VALUE(X'0000007D') /* 2 進数開始位置 : +
0027.00 125 */
0028.00 DCL VAR(&LENDTA) TYPE(*CHAR) LEN(4) +
0029.00 VALUE(X'00000010') /* 2 進数受取長さ : 16 */
0030.00 DCL VAR(&RCVVAR) TYPE(*CHAR) LEN(16) +
0031.00 VALUE(X'0000000000000000')
0032.00 DCL VAR(&OFFSET) TYPE(*CHAR) LEN(4) /* +
0033.00 2 進数 dハl q */
0034.00 DCL VAR(&NOENTR) TYPE(*CHAR) LEN(4) /* +
0035.00 2 進数項目数 */
0036.00 DCL VAR(&LSTSIZ) TYPE(*CHAR) LEN(4) /* +
0037.00 2 進数リストサイズ */
0038.00 DCL VAR(&DEC08) TYPE(*DEC) LEN(8 0) /* WORK */
0039.00 DCL VAR(&ADDLEN) TYPE(*DEC) LEN(8 0) /* WORK */
0040.00 DCL VAR(&NOENT) TYPE(*DEC) LEN(8 0) /* WORK */
0041.00 DCL VAR(&N) TYPE(*DEC) LEN(8 0) VALUE(1) /* WORK */
0042.00 DCL VAR(&RCVDTA) TYPE(*CHAR) LEN(1024) /* +
0043.00 受取データ */
0044.00 DCL VAR(&JOBID) TYPE(*CHAR) LEN(16)
0045.00 DCL VAR(&SPLID) TYPE(*CHAR) LEN(16)
0046.00 DCL VAR(&SPLA0100) TYPE(*CHAR) LEN(1024)
0047.00 DCL VAR(&SPLEN) TYPE(*CHAR) LEN(4) +
0048.00 VALUE(X'00000400')
0049.00 /*( スプール個別情報 )*/
0050.00 DCL VAR(&STATUS) TYPE(*CHAR) LEN(10)
0051.00 DCL VAR(&HOLD) TYPE(*CHAR) LEN(4)
0052.00 DCL VAR(&SPLF) TYPE(*CHAR) LEN(10)
0053.00 DCL VAR(&JOB) TYPE(*CHAR) LEN(10)
0054.00 DCL VAR(&USER) TYPE(*CHAR) LEN(10)
0055.00 DCL VAR(&JOBNO) TYPE(*CHAR) LEN(6)
0056.00 DCL VAR(&SPLNO) TYPE(*CHAR) LEN(4)
0057.00 DCL VAR(&SPLNO_D) TYPE(*DEC) LEN(8 0)
0058.00 DCL VAR(&DLTSU) TYPE(*CHAR) LEN(4) +
0059.00 VALUE(X'00000000')
0060.00 DCL VAR(&HLDSU) TYPE(*CHAR) LEN(4) +
0061.00 VALUE(X'00000000')
0062.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
0063.00
0064.00 /*( パラメータの取得 )*/
0065.00 CHGVAR VAR(&CLRQ) VALUE(%SST(&LOGOUTQLIB 01 10))
0066.00 CHGVAR VAR(&CLRQLIB) VALUE(%SST(&LOGOUTQLIB 11 10))
0067.00
0068.00 /*( 環境の取得 )*/
0069.00 RTVJOBA TYPE(&TYPE)
0070.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */
0071.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ')
0072.00 ENDDO /* バッチ */
0073.00 ELSE CMD(DO) /* 対話式 */
0074.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ')
0075.00 ENDDO /* 対話式 */
0076.00
0077.00 /*( ジョブログだけの消去 )*/
0078.00 IF COND(&CLRHLDLOG *EQ '*YES') THEN(DO)
0079.00 CLROUTQ OUTQ(&CLRQLIB/&CLRQ)
0080.00 ENDDO
0081.00 /*( HLD のジョブログは消去しない )*/
0082.00 ELSE CMD(DO) /* HLD の削除を除外 */
0083.00 /*( 1. *USRSPC を作成する )*/
0084.00 CALL PGM(QUSCRTUS) PARM('SPLLIST +
0085.00 QTEMP ' 'PF ' 1000 ' ' +
0086.00 '*ALL ' 'QUSLSPL 用ユーザー空間 ' +
0087.00 '*YES ' &APIERR)
0088.00 MONMSG CPF9870
0089.00 /*( 2. スプールの一覧表を作成する )*/
0090.00 CALL PGM(QUSLSPL) PARM('SPLLIST QTEMP ' +
0091.00 'SPLF0100' '*ALL ' &LOGOUTQLIB +
0092.00 '*ALL ' '*ALL ' &APIERR)
0093.00 IF COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO) +
0094.00 /* APIERR */
0095.00 GOTO APIERR
0096.00 ENDDO /* APIERR */
0097.00 /*( 3. LOOP して個別にスプールを削除する )*/
0098.00 /*( リストデータセクションのオフセットを検索 )*/
0099.00 CALL PGM(QUSRTVUS) PARM('SPLLIST QTEMP ' +
0100.00 &STRPOS &LENDTA &RCVVAR)
0101.00 CHGVAR VAR(&OFFSET) VALUE(%SST(&RCVVAR 1 4))
0102.00 CHGVAR VAR(&NOENTR) VALUE(%SST(&RCVVAR 9 4))
0103.00 CHGVAR VAR(&LSTSIZ) VALUE(%SST(&RCVVAR 13 4))
0104.00
0105.00 /*( RCVVAR によって OFFSET,LSTSIZ を受取った )*/
0106.00 CHGVAR VAR(&STRPOS) VALUE(&OFFSET)
0107.00 CHGVAR VAR(&DEC08) VALUE(%BIN(&STRPOS))
0108.00 CHGVAR VAR(&DEC08) VALUE(&DEC08 + 1)
0109.00 CHGVAR VAR(%BIN(&STRPOS)) VALUE(&DEC08)
0110.00 CHGVAR VAR(&LENDTA) VALUE(&LSTSIZ)
0111.00 CHGVAR VAR(&ADDLEN) VALUE(%BIN(&LENDTA))
0112.00 CHGVAR VAR(&NOENT) VALUE(%BIN(&NOENTR))
0113.00 IF COND(&NOENT *EQ 0) THEN(DO)
0114.00 CHGVAR VAR(&MSG) VALUE(&CLRQLIB *TCAT '/' +
0115.00 *CAT &CLRQ *TCAT +
0116.00 ': この OUTQ にはスプールはありません。 ')
0117.00 GOTO SNDMSG
0118.00 ENDDO
0119.00 NXTRTV:
0120.00 CALL PGM(QUSRTVUS) PARM('SPLLIST QTEMP ' +
0121.00 &STRPOS &LENDTA &RCVDTA)
0122.00 /*( 処理の開始 )*/
0123.00 CHGVAR VAR(&JOBID) VALUE(%SST(&RCVDTA 51 16))
0124.00 CHGVAR VAR(&SPLID) VALUE(%SST(&RCVDTA 67 16))
0125.00 CHGVAR VAR(&SPLNO) VALUE(X'00000000')
0126.00 CALL PGM(QUSRSPLA) PARM(&SPLA0100 &SPLEN +
0127.00 'SPLA0100' '*INT ' +
0128.00 &JOBID &SPLID '*INT ' &SPLNO &APIERR)
0129.00 IF COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO) +
0130.00 /* APIERR */
0131.00 GOTO APIERR
0132.00 ENDDO /* APIERR */
0133.00 CHGVAR VAR(&STATUS) VALUE(%SST(&SPLA0100 101 10))
0134.00 CHGVAR VAR(&HOLD) VALUE(%SST(&SPLA0100 121 4))
0135.00 IF COND(&HOLD *EQ '*YES') THEN(DO)
0136.00 CHGVAR VAR(%BIN(&HLDSU)) VALUE(%BIN(&HLDSU) + 1)
0137.00 GOTO BYPAS
0138.00 ENDDO
0139.00 IF COND(&STATUS *EQ '*READY ') THEN(DO) /* +
0140.00 書出し可能 */
0141.00 CHGVAR VAR(&SPLF) VALUE(%SST(&SPLA0100 67 10))
0142.00 CHGVAR VAR(&JOB) VALUE(%SST(&SPLA0100 41 10))
0143.00 CHGVAR VAR(&USER) VALUE(%SST(&SPLA0100 51 10))
0144.00 CHGVAR VAR(&JOBNO) VALUE(%SST(&SPLA0100 61 6))
0145.00 CHGVAR VAR(&SPLNO) VALUE(%SST(&SPLA0100 77 4))
0146.00 CHGVAR VAR(&SPLNO_D) VALUE(%BIN(&SPLNO))
0147.00 DLTSPLF FILE(&SPLF) JOB(&JOBNO/&USER/&JOB) +
0148.00 SPLNBR(&SPLNO_D) JOBSYSNAME(*ONLY)
0149.00 CHGVAR VAR(%BIN(&DLTSU)) VALUE(%BIN(&DLTSU) + 1)
0150.00 ENDDO /* 書出し可能 */
0151.00 ELSE CMD(DO) /* それ以外 */
0152.00 CHGVAR VAR(%BIN(&HLDSU)) VALUE(%BIN(&HLDSU) + 1)
0153.00 ENDDO /* それ以外 */
0154.00
0155.00 /*( 処理の終了 )*/
0156.00 BYPAS: IF COND(&N < &NOENT) THEN(DO)
0157.00 CHGVAR VAR(&N) VALUE(&N + 1)
0158.00 CHGVAR VAR(&DEC08) VALUE(%BIN(&STRPOS))
0159.00 CHGVAR VAR(&DEC08) VALUE(&DEC08 + &ADDLEN)
0160.00 CHGVAR VAR(%BIN(&STRPOS)) VALUE(&DEC08)
0161.00 GOTO NXTRTV
0162.00 ENDDO
0163.00 /*( 完了 )*/
0164.00 CHGVAR VAR(&MSGID) VALUE('CPF3417')
0165.00 CHGVAR VAR(&MSGDTA) VALUE(&DLTSU *CAT &HLDSU *CAT +
0166.00 &CLRQ *CAT &CLRQLIB)
0167.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ')
0168.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ')
0169.00 GOTO SNDMSG
0170.00 ENDDO /* HLD の削除を除外 */
0171.00 RETURN
0172.00
0173.00 APIERR:
0174.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7))
0175.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))
0176.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ')
0177.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ')
0178.00 GOTO SNDMSG
0179.00
0180.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +
0181.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +
0182.00 MSGFLIB(&MSGFLIB)
0183.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO)
0184.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +
0185.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)
0186.00 ENDDO
0187.00 ELSE CMD(DO)
0188.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
0189.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +
0190.00 MSGTYPE(&MSGTYPE)
0191.00 ENDDO
0192.00 ENDPGM
CRTCLPGM PGM(MYLIB/CLRLOGCL) SRCFILE(MYSRCLIB/QCLSRC) AUT(*ALL)
OUTQ 全体の消去が指示された場合は
0077.00 /*( ジョブログだけの消去 )*/ 0078.00 IF COND(&CLRHLDLOG *EQ '*YES') THEN(DO) 0079.00 CLROUTQ OUTQ(&CLRQLIB/&CLRQ) 0080.00 ENDDO
が実行される。
そうでない場合は
0083.00 /*( 1. *USRSPC を作成する )*/
0084.00 CALL PGM(QUSCRTUS) PARM('SPLLIST +
0085.00 QTEMP ' 'PF ' 1000 ' ' +
0086.00 '*ALL ' 'QUSLSPL 用ユーザー空間 ' +
0087.00 '*YES ' &APIERR)
0088.00 MONMSG CPF9870
によってユーザー・スペース: SPLLIST がライブラリー: QTEMP に作成される。
OUTQ のスプールの一覧が API: QUSLSPL によって
次のようにして作成される。
0089.00 /*( 2. スプールの一覧表を作成する )*/
0090.00 CALL PGM(QUSLSPL) PARM('SPLLIST QTEMP ' +
0091.00 'SPLF0100' '*ALL ' &LOGOUTQLIB +
0092.00 '*ALL ' '*ALL ' &APIERR)
出力されたユーザー・スペースの内容をAPI: QUSRTVUS によって次々と
読み取って読取った 1 レコードずつに対して
0122.00 /*( 処理の開始 )*/ 0123.00 CHGVAR VAR(&JOBID) VALUE(%SST(&RCVDTA 51 16)) 0124.00 CHGVAR VAR(&SPLID) VALUE(%SST(&RCVDTA 67 16)) 0125.00 CHGVAR VAR(&SPLNO) VALUE(X'00000000') 0126.00 CALL PGM(QUSRSPLA) PARM(&SPLA0100 &SPLEN + 0127.00 'SPLA0100' '*INT ' + 0128.00 &JOBID &SPLID '*INT ' &SPLNO &APIERR)
によってスプールの属性を取得する。
スプール属性が *READY であれば DLTSPLF によって
0139.00 IF COND(&STATUS *EQ '*READY ') THEN(DO) /* + 0140.00 書出し可能 */ 0141.00 CHGVAR VAR(&SPLF) VALUE(%SST(&SPLA0100 67 10)) 0142.00 CHGVAR VAR(&JOB) VALUE(%SST(&SPLA0100 41 10)) 0143.00 CHGVAR VAR(&USER) VALUE(%SST(&SPLA0100 51 10)) 0144.00 CHGVAR VAR(&JOBNO) VALUE(%SST(&SPLA0100 61 6)) 0145.00 CHGVAR VAR(&SPLNO) VALUE(%SST(&SPLA0100 77 4)) 0146.00 CHGVAR VAR(&SPLNO_D) VALUE(%BIN(&SPLNO)) 0147.00 DLTSPLF FILE(&SPLF) JOB(&JOBNO/&USER/&JOB) + 0148.00 SPLNBR(&SPLNO_D) JOBSYSNAME(*ONLY) 0149.00 CHGVAR VAR(%BIN(&DLTSU)) VALUE(%BIN(&DLTSU) + 1) 0150.00 ENDDO /* 書出し可能 */
のようにしてスプールを削除する。