* ________ _______ _____ ___ ________ ______ _______ ________ * /" )/" "|(\" \|" \ /" ) / " \ /" \ /" ) * (: \___/(: ______)|.\\ \ |(: \___/ // ____ \ |: |(: \___/ * \___ \ \/ | |: \. \\ | \___ \ / / ) :)|_____/ ) \___ \ * __/ \\ // ___)_ |. \ \. | __/ \\(: (____/ // // / __/ \\ * /" \ :)(: "|| \ \ | /" \ :)\ / |: __ \ /" \ :) * (_______/ \_______) \___|\____\)(_______/ \"_____/ |__| \___)(_______/ * The always up-to-date overview for system-wide health monitoring * Report : zsensor_fxr_saver_wf. * Title : Automatically perform Workflow cleanup (FIXER) * Description : "! This report runs checks the state and settings on the SAVER_WF "! sensor and follows up on it - by executing standard SAP cleanup "! report calls. REPORT zsensor_fxr_saver_wf. CLASS lcl_controller DEFINITION. PUBLIC SECTION. TYPES: BEGIN OF lty_settings, object TYPE c LENGTH 20, days TYPE int4, "Number of days retention period autofix TYPE c LENGTH 10, END OF lty_settings. CLASS-DATA go_log TYPE REF TO zcl_log. CLASS-DATA gt_settings TYPE SORTED TABLE OF lty_settings WITH UNIQUE KEY object. CLASS-DATA gr_daterange TYPE RANGE OF d. CLASS-DATA gr_taskrange TYPE RANGE OF pdtask-seark. CLASS-METHODS get_settings IMPORTING iv_sensortype TYPE zsensors-sensor. CLASS-METHODS set_daterange IMPORTING iv_period TYPE int4. ENDCLASS. CLASS lcl_controller IMPLEMENTATION. METHOD get_settings. DATA lv_label TYPE string. DATA lv_value TYPE string. * Get the test settings for the sensor - focus on the AUTOFIX parameter and gather details. LOOP AT zcl_sensor_manager=>get_longtext( iv_sensortype = iv_sensortype ) INTO DATA(ls_textline). IF ls_textline-tdformat = '/:'. SPLIT ls_textline-tdline AT ':' INTO lv_label lv_value. READ TABLE gt_settings ASSIGNING FIELD-SYMBOL() WITH KEY object = ls_textline-tdline. IF sy-subrc <> 0. INSERT VALUE #( object = ls_textline-tdline ) INTO TABLE gt_settings ASSIGNING . ENDIF. ELSE. SPLIT ls_textline-tdline AT ':' INTO lv_label lv_value. CASE lv_label. WHEN 'DAYS'. MOVE lv_value TO -days. WHEN 'AUTOFIX'. MOVE lv_value TO -autofix. ENDCASE. ENDIF. ENDLOOP. ENDMETHOD. METHOD set_daterange. DATA lv_date TYPE sy-datum. lv_date = sy-datum - iv_period. gr_daterange = VALUE #( ( sign = 'I' option = 'LE' low = lv_date ) ). ENDMETHOD. ENDCLASS. TABLES: swwwihead. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(30) lbl_p01 FOR FIELD pa_senso. PARAMETERS pa_senso TYPE zsensors-sensor DEFAULT 'SAVER_WF'. PARAMETERS pa_sentx TYPE char60. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN POSITION 4. PARAMETERS pa_test AS CHECKBOX DEFAULT abap_true. SELECTION-SCREEN COMMENT 10(30) lbl_p02 FOR FIELD pa_test. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN POSITION 4. PARAMETERS pa_viase AS CHECKBOX DEFAULT abap_true. SELECTION-SCREEN COMMENT 10(30) lbl_p03 FOR FIELD pa_viase. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN SKIP. SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE lbl_b01. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 2(22) lbl_s01 FOR FIELD so_statu. SELECT-OPTIONS so_statu FOR swwwihead-wi_stat NO INTERVALS. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 2(22) lbl_s02 FOR FIELD so_aed. SELECT-OPTIONS so_aed FOR swwwihead-wi_AED. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 2(22) lbl_s03 FOR FIELD so_agnt. SELECT-OPTIONS so_agnt FOR swwwihead-WI_AAGENT. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN SKIP. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 2(25) lbl_p04 FOR FIELD pa_maxht. parameters pa_maxht type int4 default 5000. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN END OF BLOCK b01. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 2(60) lbl_hint. SELECTION-SCREEN END OF LINE. AT SELECTION-SCREEN OUTPUT. LOOP AT SCREEN. IF screen-name = 'PA_SENSO'. screen-input = '0'. MODIFY SCREEN. ENDIF. IF screen-name = 'PA_SENTX'. screen-input = '0'. screen-display_3d = '0'. MODIFY SCREEN. ENDIF. ENDLOOP. INITIALIZATION. DATA(lo_i18n) = zcl_i18n=>get_instance( 'sensor.saver_wf.fx' ). lo_i18n->feed( VALUE #( ( id = 'P01' nl = |Sensor type| en = |Sensor type| ) ( id = 'P02' nl = |Test (geen verwerking)| en = |Test (no updates)| ) ( id = 'P03' nl = |Toon selectie scherm| en = |Show selection screen| ) ( id = 'B01' nl = |Extra selectie instellingen| en = |Extra selection settings| ) ( id = 'S01' nl = |Status| en = |Status| ) ( id = 'S02' nl = |Einddatum| en = |End date| ) ( id = 'S03' nl = |Bewerker| en = |Agent| ) ( id = 'P04' nl = |Maximaal aantal treffers| en = |Maximum number of hits| ) ( id = 'HINT' nl = |Rapportage RSWWWIDE zal worden aangeroepen| en = |Report RSWWWIDE will be called| ) ( id = 'MSG1' nl = |Workflows/taken & met periode & dagen wordt verwerkt| en = |Workflows/tasks & met retention period & days is processed| ) ( id = 'MSG2' nl = |Rapportage & is aangeroepen| en = |Report & is called| ) ( id = 'MSG3' nl = |Afgerond| en = |Finished| ) ( id = 'ALREADYACTIVE' nl = |Programma is al actief| en = |Report is already running| ) ( id = 'NODATA' nl = |Geen autofix verzoeken gevonden (niks te doen)| en = |No autofix suggestions available (nothing to do)| ) ) ). lbl_p01 = lo_i18n->get( 'P01' ). lbl_p02 = lo_i18n->get( 'P02' ). lbl_p03 = lo_i18n->get( 'P03' ). lbl_b01 = lo_i18n->get( 'B01' ). lbl_s01 = lo_i18n->get( 'S01' ). lbl_s02 = lo_i18n->get( 'S02' ). lbl_s03 = lo_i18n->get( 'S03' ). lbl_p04 = lo_i18n->get( 'P04' ). lbl_hint = lo_i18n->get( 'HINT' ). pa_sentx = zcl_sensor_manager=>gt_sensortype_detail[ sensor = pa_senso ]-summary. IF lines( so_statu ) = 0. so_statu[] = VALUE #( ( sign = 'I' option = 'EQ' low = 'COMPLETED' ) ( sign = 'I' option = 'EQ' low = 'CANCELLED' ) ( sign = 'I' option = 'EQ' low = 'ERRORED' ) ). ENDIF. START-OF-SELECTION. lcl_controller=>go_log = zcl_log=>get_instance( iv_object = 'ALERT' iv_subobject = 'PROCESSING' iv_extnumber = 'SAVER_WF' ). IF pa_test = abap_true. lcl_controller=>go_log->add_text( lo_i18n->get( 'P02' ) ). ELSE. "Lock the run (report + variant). CALL FUNCTION 'ENQUEUE_ESVARIANT' EXPORTING relid = 'XX' report = sy-repid variant = sy-slset srtf2 = '' EXCEPTIONS OTHERS = 4. IF sy-subrc = 4. MESSAGE lo_i18n->get( 'ALREADYACTIVE' ) TYPE 'S'. EXIT. ENDIF. "Open the measurements on relevant tables DATA(lo_measurements) = NEW zcl_sensors_grip_on_space( ). lo_measurements->table_measurement_start( value #( ( 'SWWWIHEAD' ) ( 'SWWLOGHIST' ) ( 'SWWORGTASK' ) ( 'SWWCNTP0' ) ( 'SWWOUTBOX' ) ( 'SWW_WI2OBJ' ) ( 'SWWUSERWI' ) ( 'SWW_PROPERTIES' ) ( 'SWWWIRET' ) ( 'SWWWIDEADL' ) ) ). ENDIF. lcl_controller=>get_settings( pa_senso ). "The first main selection: an overview of tasks/flows with their parents - to check customizing settings SELECT DISTINCT h~wi_rh_task AS task, f~wfd_id FROM swwwihead AS h LEFT OUTER JOIN swd_steps AS f ON f~task = h~wi_rh_task INTO TABLE @DATA(lt_task_flow_pairs) GROUP BY h~wi_rh_task, f~wfd_id. LOOP AT lcl_controller=>gt_settings INTO DATA(ls_settings) WHERE autofix = zcl_sensors_grip_on_space=>co_certified. "Only run for existing tasks/flows check line_exists( lt_task_flow_pairs[ task = ls_settings-object ] ). "Only run for task/flow that is a workflow or single step task (has no flow). check lt_task_flow_pairs[ task = ls_settings-object ]-wfd_id is initial. lcl_controller=>go_log->add_text( lo_i18n->get( iv_id = 'MSG1' iv_par = ls_settings-object iv_par2 = |{ ls_settings-days }| ) ). IF pa_test = abap_false. lcl_controller=>set_daterange( ls_settings-days ). lcl_controller=>gr_taskrange = VALUE #( ( sign = 'I' option = 'EQ' low = ls_settings-object ) ). lcl_controller=>go_log->add_text( lo_i18n->get( iv_id = 'MSG2' iv_par = 'RSETESTD' ) ). IF pa_viase = space. SUBMIT rswwwide WITH it_cd IN lcl_controller=>gr_daterange WITH it_stat IN so_statu WITH it_aed IN so_aed WITH it_aagnt in so_agnt WITH it_task IN lcl_controller=>gr_taskrange WITH I_COMMIT = 50 WITH I_MAXHIT = pa_maxht WITH I_DISPLY = abap_true WITH I_DELERR = abap_true AND RETURN. ELSE. SUBMIT rswwwide WITH it_cd IN lcl_controller=>gr_daterange WITH it_stat IN so_statu WITH it_aed IN so_aed WITH it_aagnt in so_agnt WITH it_task IN lcl_controller=>gr_taskrange WITH I_COMMIT = 50 WITH I_MAXHIT = pa_maxht WITH I_DISPLY = abap_true WITH I_DELERR = abap_true VIA SELECTION-SCREEN AND RETURN. ENDIF. lcl_controller=>go_log->add_text( lo_i18n->get( 'MSG3' ) ). ENDIF. ENDLOOP. IF sy-subrc <> 0. lcl_controller=>go_log->add_text( lo_i18n->get( 'NODATA' ) ). ELSEIF pa_test = abap_false. lo_measurements->table_measurement_finish( ). ENDIF. CALL FUNCTION 'DEQUEUE_ESVARIANT'. lcl_controller=>go_log->display( ).