處理鏈日志存儲分析
使用程序?RSPC_LOGS_ANALYZE 分析處理鏈日志占用空間
*&---------------------------------------------------------------------*
*& Report RSPC_LOGS_ANALYZE
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT rspc_logs_analyze.TYPES: BEGIN OF ts_count,chain_id TYPE rspc_chain,streaming TYPE rspc_streaming,headcount TYPE i,bodycount TYPE i,kilobyte TYPE i,END OF ts_count.
DATA: lt_count TYPE TABLE OF ts_count.
SELECT chain_id, MAX( streaming ) AS streaming, COUNT( * ) AS headcountFROM rspclogchain INTO CORRESPONDING FIELDS OF TABLE @lt_countGROUP BY chain_id. "#EC CI_NOWHERE
DATA: l_sum TYPE i.
LOOP AT lt_count ASSIGNING FIELD-SYMBOL(<ls_count>).SELECT COUNT( * ) FROM rspcprocesslog AS body JOIN rspclogchain AS headON body~log_id = head~log_idINTO <ls_count>-bodycountWHERE head~chain_id = <ls_count>-chain_id.<ls_count>-kilobyte = ( <ls_count>-headcount * 257 + <ls_count>-bodycount * 395 ) / 1024.ADD <ls_count>-kilobyte TO l_sum.
ENDLOOP.
l_sum = l_sum / 1024.
WRITE: l_sum, 'Megabyte'(005).
write /.
SORT lt_count BY kilobyte DESCENDING.
WRITE AT 01 'Process Chain'(001).
WRITE AT 29 'Kilobyte'(002).
WRITE AT 45 'Number of Logs'(003).
LOOP AT lt_count ASSIGNING <ls_count>.WRITE: / <ls_count>-chain_id, <ls_count>-kilobyte, <ls_count>-headcount.IF NOT <ls_count>-streaming IS INITIAL.WRITE: 'Streaming-Chain'(004).ENDIF.
ENDLOOP.
處理鏈日志清理
使用程序?RSPC_LOG_DELETE 進行處理鏈日志清理
*&---------------------------------------------------------------------*
*& Report RSPC_LOG_DELETE
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*REPORT rspc_log_delete.PARAMETERS: p_chain TYPE rspc_chain.
PARAMETERS: p_logid TYPE rspc_logid.
PARAMETERS: p_force TYPE rs_bool AS CHECKBOX.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_time TYPE rs_bool RADIOBUTTON GROUP radi.
SELECTION-SCREEN COMMENT 5(20) g_timtx FOR FIELD p_time.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF BLOCK g_date WITH FRAME TITLE TEXT-001.
PARAMETERS: p_from TYPE sydatum,p_to TYPE sydatum.
SELECTION-SCREEN END OF BLOCK g_date.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_last TYPE rs_bool RADIOBUTTON GROUP radi.
SELECTION-SCREEN COMMENT 5(30) g_lastx FOR FIELD p_last.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF BLOCK g_keep WITH FRAME TITLE g_keeptx.
PARAMETERS: p_keep TYPE rspc_logs.
SELECTION-SCREEN END OF BLOCK g_keep.
SELECTION-SCREEN SKIP.
PARAMETERS: p_all TYPE rs_bool NO-DISPLAY.START-OF-SELECTION.IF p_time = 'X'.
* ---- Select fixed time ----DATA: l_r_where TYPE REF TO cl_rs_where,l_t_logs TYPE TABLE OF rspclogchain,l_s_logs TYPE rspclogchain,l_msg TYPE char255,l_datum TYPE sydatum,l_zeit TYPE syuzeit.CREATE OBJECT l_r_where.IF NOT p_chain IS INITIAL.DATA: l_operator TYPE c LENGTH 4.IF p_chain CA '*'.REPLACE ALL OCCURRENCES OF '*' IN p_chain WITH '%'.REPLACE ALL OCCURRENCES OF '_' IN p_chain WITH '#_'.REPLACE ALL OCCURRENCES OF '?' IN p_chain WITH '_'.l_operator = 'LIKE'.ELSE.l_operator = 'EQ'.ENDIF.CALL METHOD l_r_where->add_fieldEXPORTINGi_fieldnm = 'CHAIN_ID'i_operator = l_operatori_intlen = 25i_datatp = 'C'i_init_field_with_value = 'X'i_value = p_chain.IF p_chain CS '#_'.APPEND 'ESCAPE ''#''' TO l_r_where->n_t_where.ENDIF.ENDIF.IF NOT p_from IS INITIAL.IF NOT l_r_where->n_t_where[] IS INITIAL.CALL METHOD l_r_where->add_and.ENDIF.IF p_to IS INITIAL.CALL METHOD l_r_where->add_fieldEXPORTINGi_fieldnm = 'DATUM'i_operator = 'EQ'i_intlen = 8i_datatp = 'D'i_init_field_with_value = 'X'i_value = p_from.ELSE.CALL METHOD l_r_where->add_fieldEXPORTINGi_fieldnm = 'DATUM'i_operator = 'GE'i_intlen = 8i_datatp = 'D'i_init_field_with_value = 'X'i_value = p_from.ENDIF.ENDIF.IF NOT p_to IS INITIAL.IF NOT l_r_where->n_t_where[] IS INITIAL.CALL METHOD l_r_where->add_and.ENDIF.CALL METHOD l_r_where->add_fieldEXPORTINGi_fieldnm = 'DATUM'i_operator = 'LE'i_intlen = 8i_datatp = 'D'i_init_field_with_value = 'X'i_value = p_to.ENDIF.IF NOT p_logid IS INITIAL.IF NOT l_r_where->n_t_where[] IS INITIAL.CALL METHOD l_r_where->add_and.ENDIF.CALL METHOD l_r_where->add_fieldEXPORTINGi_fieldnm = 'LOG_ID'i_operator = 'EQ'i_intlen = 25i_datatp = 'C'i_init_field_with_value = 'X'i_value = p_logid.ENDIF.SELECT * FROM rspclogchain INTO TABLE l_t_logsWHERE (l_r_where->n_t_where).ELSEIF p_last = 'X'.
* ---- Last n logs ----IF NOT p_keep IS INITIAL.IF NOT p_logid IS INITIAL.SELECT SINGLE datum, zeit FROM rspclogchain INTO @DATA(ls_start)WHERE log_id = @p_logid.ELSE.CALL FUNCTION 'RSSM_GET_TIME'IMPORTINGe_datum_utc = ls_start-datume_uzeit_utc = ls_start-zeitEXCEPTIONSfailed = 0OTHERS = 0.ENDIF.IF NOT p_to IS INITIAL.ls_start-datum = p_to.ENDIF.DATA: lt_chain TYPE TABLE OF rspc_chain.IF NOT p_chain IS INITIAL.IF p_chain CS '*'.REPLACE ALL OCCURRENCES OF '*' IN p_chain WITH '%'.REPLACE ALL OCCURRENCES OF '_' IN p_chain WITH '#_'.REPLACE ALL OCCURRENCES OF '?' IN p_chain WITH '_'.SELECT DISTINCT chain_id FROM rspcchainattr INTO TABLE lt_chainWHERE chain_id LIKE p_chain ESCAPE '#'.ELSE.APPEND p_chain TO lt_chain.ENDIF.ELSE.SELECT DISTINCT chain_id FROM rspclogchain INTO TABLE lt_chain. "#EC CI_NOWHEREENDIF.LOOP AT lt_chain INTO DATA(l_chain).SELECT datum, zeit FROM rspclogchainWHERE chain_id = @l_chainAND ( ( datum LE @ls_start-datum )OR ( datum EQ @ls_start-datum AND zeit LE @ls_start-zeit ) )ORDER BY datum DESCENDING, zeit DESCENDINGINTO TABLE @DATA(lt_date)UP TO @p_keep ROWS.DESCRIBE TABLE lt_date LINES DATA(l_lines).CHECK l_lines = p_keep.READ TABLE lt_date INTO DATA(ls_date) INDEX l_lines.SELECT log_id, datum, zeit FROM rspclogchain APPENDING CORRESPONDING FIELDS OF TABLE @l_t_logsWHERE chain_id = @l_chainAND ( ( datum LT @ls_date-datum )OR ( datum EQ @ls_date-datum AND zeit LT @ls_date-zeit ) ).ENDLOOP.ELSE.MESSAGE i666(rspc) WITH 'Enter a number'(005) DISPLAY LIKE 'E'.EXIT.ENDIF.ENDIF.IF l_t_logs[] IS INITIAL.MESSAGE e027(rspc) INTO l_msg.DATA: i_gui TYPE c.CALL FUNCTION 'RSSM_RFC_IS_GUI_ON'IMPORTINGon = i_gui.IF i_gui = 'Y'.WRITE / l_msg.ENDIF.ENDIF.
* ==== Delete ====IF p_all IS INITIAL.
* ---- get last log ----DATA: l_date TYPE sydatum,l_time TYPE syuzeit,l_logid TYPE rspc_logid.SELECT MAX( datum ) FROM rspclogchain INTO l_dateWHERE chain_id = p_chainAND synchronous = space.SELECT MAX( zeit ) FROM rspclogchain INTO l_timeWHERE chain_id = p_chainAND datum = l_dateAND synchronous = space.SELECT SINGLE log_id FROM rspclogchain INTO l_logidWHERE chain_id = p_chainAND datum = l_dateAND zeit = l_timeAND synchronous = space.DELETE l_t_logs WHERE log_id = l_logid. " always keep the last log!ENDIF.SORT l_t_logs BY datum ASCENDING zeit ASCENDING.LOOP AT l_t_logs INTO l_s_logs.CALL FUNCTION 'RSPC_LOG_DELETE'EXPORTINGi_logid = l_s_logs-log_idi_force = p_forceEXCEPTIONSfailed = 1no_authority = 2OTHERS = 3.IF sy-subrc = 2.IF i_gui = 'Y'.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4INTO l_msg.WRITE / l_msg.ELSE.MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF.ELSEIF sy-subrc <> 0.IF p_force = 'X'.IF i_gui = 'Y'.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4INTO l_msg.WRITE / l_msg.ELSE.MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF.ELSE.ROLLBACK WORK.IF i_gui = 'Y'.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4INTO l_msg.WRITE / l_msg.ELSE.MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF.ENDIF.ELSE.CALL FUNCTION 'RSSM_GET_TIME'EXPORTINGi_datum_utc = l_s_logs-datumi_uzeit_utc = l_s_logs-zeitIMPORTINGe_datum_loc = l_datume_uzeit_loc = l_zeitEXCEPTIONSfailed = 1OTHERS = 2.IF sy-subrc <> 0.l_datum = l_s_logs-datum.l_zeit = l_s_logs-zeit.ENDIF.IF i_gui = 'Y'.MESSAGE s129(rspc) WITH l_s_logs-log_id l_datum l_zeit INTO l_msg.WRITE / l_msg.ELSE.MESSAGE s129(rspc) WITH l_s_logs-log_id l_datum l_zeit.ENDIF.ENDIF.ENDLOOP.
INITIALIZATION.g_keeptx = 'Log Number Selection'(002).g_timtx = 'Fixed Date'(003).g_lastx = 'Keep number of logs'(004).