Tools

69. *READY のスプールだけを消去するクリヤー・ログ ( CLRLOG )

ここで紹介するログの消去 ( 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 コマンドを
実行することができる。

【 コマンド: 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)
【 CLP: CLRLOGCL 】
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      /*  書出し可能  */

のようにしてスプールを削除する。