* ________ _______ _____ ___ ________ ______ _______ ________ * /" )/" "|(\" \|" \ /" ) / " \ /" \ /" ) * (: \___/(: ______)|.\\ \ |(: \___/ // ____ \ |: |(: \___/ * \___ \ \/ | |: \. \\ | \___ \ / / ) :)|_____/ ) \___ \ * __/ \\ // ___)_ |. \ \. | __/ \\(: (____/ // // / __/ \\ * /" \ :)(: "|| \ \ | /" \ :)\ / |: __ \ /" \ :) * (_______/ \_______) \___|\____\)(_______/ \"_____/ |__| \___)(_______/ * The always up-to-date overview for system-wide health monitoring * Report : zsensor_fxr_smq1. * Title : Sensor fixer report - cleanup outbound queue (FIXER) * Description : "! This report run checks the state and settings on the SMQ1 "! sensor and follows up on it - by executing standard SAP BAPI "! to clear (old) messages from the SMQ1 queue (TRFCQOUT) REPORT zsensor_fxr_smq1. CLASS lcl_controller DEFINITION. PUBLIC SECTION. CLASS-DATA go_log TYPE REF TO zcl_log. CLASS-DATA go_i18n TYPE REF TO zcl_i18n. DATA gv_sensor TYPE zsensors-sensor. DATA gv_sensor_description TYPE char60. DATA gv_testmode TYPE boolean. TYPES: BEGIN OF gty_setting, queuename TYPE trfcqout-qname, destination TYPE trfcqout-dest, days TYPE int4, "Number of days retention period autofix TYPE c LENGTH 20, notready TYPE boolean, END OF gty_setting. DATA gt_settings TYPE SORTED TABLE OF gty_setting WITH UNIQUE KEY queuename. METHODS get_sensor_settings. METHODS process_queues. ENDCLASS. CLASS lcl_controller IMPLEMENTATION. METHOD process_queues. DATA lr_qstate TYPE RANGE OF trfcqout-qstate. DATA lr_qname TYPE RANGE OF trfcqout-qname. DATA lr_dest TYPE RANGE OF trfcqout-dest. DATA lt_ARFCTID TYPE STANDARD TABLE OF arfctid. LOOP AT gt_settings INTO DATA(ls_setting). IF ls_setting-notready = abap_true. lr_qstate = VALUE #( ( sign = 'E' option = 'EQ' low = 'READY' ) ( sign = 'E' option = 'EQ' low = 'RUNNING' ) ). ELSE. CLEAR lr_qstate. ENDIF. IF NOT ls_setting-destination IS INITIAL. lr_dest = VALUE #( ( sign = 'I' option = 'EQ' low = ls_setting-destination ) ). ELSE. CLEAR lr_dest. ENDIF. IF ls_setting-queuename CS '*'. lr_qname = VALUE #( ( sign = 'I' option = 'CP' low = ls_setting-queuename ) ). ELSE. lr_qname = VALUE #( ( sign = 'I' option = 'EQ' low = ls_setting-queuename ) ). ENDIF. SELECT arfcipid, arfcpid, arfctime, arfctidcnt FROM trfcqout WHERE qrfcdatum < @( sy-datum - ls_setting-days ) AND qstate IN @lr_qstate AND dest IN @lr_dest AND qname IN @lr_qname INTO TABLE @lt_ARFCTID. go_log->add_text( go_i18n->get( iv_id = 'QUEUE' iv_par = ls_setting-queuename iv_par2 = |{ lines( lt_ARFCTID ) NUMBER = USER }| ) ). IF gv_testmode = abap_false. "Feed to the BAPI - per 50 entries LOOP AT lt_ARFCTID INTO DATA(ls_ARFCTID). IF ( sy-tabix MOD 50 ) = 1. COMMIT WORK. ENDIF. CALL FUNCTION 'TRFC_QOUT_DELETE_LUW' EXPORTING tid = ls_ARFCTID no_commit = abap_true write_sys_log = abap_false EXCEPTIONS OTHERS = 4. IF sy-subrc <> 0. go_log->add_errortext( go_i18n->get( iv_id = 'QUEUEFAULT' iv_par = ls_setting-queuename iv_par2 = |{ ls_ARFCTID-arfcipid }/{ ls_ARFCTID-arfcpid }/{ ls_ARFCTID-arfctime }/{ ls_ARFCTID-arfctidcnt }| ) ). ENDIF. ENDLOOP. COMMIT WORK. ENDIF. ENDLOOP. ENDMETHOD. METHOD get_sensor_settings. LOOP AT zcl_sensor_manager=>get_longtext( iv_sensortype = 'SMQ1' ) INTO DATA(ls_textline). IF ls_textline-tdformat = '/:'. SPLIT ls_textline-tdline AT ':' INTO DATA(lv_label) DATA(lv_value). READ TABLE gt_settings ASSIGNING FIELD-SYMBOL() WITH KEY queuename = ls_textline-tdline. IF sy-subrc <> 0. INSERT VALUE #( queuename = ls_textline-tdline ) INTO TABLE gt_settings ASSIGNING . ENDIF. ELSE. SPLIT ls_textline-tdline AT ':' INTO lv_label lv_value. CASE lv_label. WHEN 'DESTINATION'. MOVE lv_value TO -destination. WHEN 'DAYS'. MOVE lv_value TO -days. WHEN 'AUTOFIX'. MOVE lv_value TO -autofix. WHEN 'NOTREADY'. -notready = COND #( WHEN lv_value = 'Y' THEN abap_true ELSE abap_false ). ENDCASE. ENDIF. ENDLOOP. LOOP AT gt_settings INTO DATA(ls_setting). IF ls_setting-autofix <> zcl_sensor_manager=>co_certified. DELETE gt_settings. CONTINUE. ENDIF. go_log->add_text( go_i18n->get( iv_id = 'SETTINGS1' iv_par = ls_setting-queuename iv_par2 = ls_setting-destination ) ). go_log->add_text( go_i18n->get( iv_id = 'SETTINGS2' iv_par = |{ ls_setting-days }| iv_par2 = ls_setting-notready ) ). ENDLOOP. IF lines( gt_settings ) = 0. go_log->add_text( go_i18n->get( 'NODATA' ) ). ENDIF. ENDMETHOD. ENDCLASS. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(30) lbl_p01 FOR FIELD pa_senso. PARAMETERS pa_senso TYPE zsensors-sensor DEFAULT 'SMQ1'. PARAMETERS pa_sentx TYPE char60. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN SKIP. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN POSITION 4. PARAMETERS pa_test AS CHECKBOX DEFAULT abap_true. SELECTION-SCREEN COMMENT 10(30) lbl_p04 FOR FIELD pa_test. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN SKIP. 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. lcl_controller=>go_i18n = zcl_i18n=>get_instance( 'sensor.smq1.fx' ). lcl_controller=>go_i18n->feed( VALUE #( ( id = 'P01' nl = |Sensor type| en = |Sensor type| ) ( id = 'P04' nl = |Test (geen verwerking)| en = |Test (no updates)| ) ( id = 'HINT' nl = |BAPI TRFC_QOUT_DELETE_LUW zal worden aangeroepen| en = |Bapi TRFC_QOUT_DELETE_LUW will be called| ) ( id = 'MSG2' nl = |Bapi TRFC_QOUT_DELETE_LUW is aangeroepen| en = |Bapi TRFC_QOUT_DELETE_LUW is called| ) ( id = 'MSG3' nl = |Afgerond| en = |Finished| ) ( id = 'ALREADYACTIVE' nl = |Programma is al actief| en = |Report is already running| ) ( id = 'SETTINGS1' nl = |Queue naam & bestemming "&" met Autofix=Certified| en = |Queue name & destination "&" with Autofix=Certified| ) ( id = 'SETTINGS2' nl = |Retentie periode: & dagen, NotReady: "&"| en = |Retention period: & days, NotReady: "&"| ) ( id = 'QUEUE' nl = |Queue & met & berichten| en = |Queue & with & messages| ) ( id = 'QUEUEFAULT' nl = |Queue & bericht & kon niet verwijderd worden| en = |Queue & message & could not be deleted| ) ( id = 'NODATA' nl = |Geen autofix verzoeken gevonden (niks te doen)| en = |No autofix suggestions available (nothing to do)| ) ) ). lbl_p01 = lcl_controller=>go_i18n->get( 'P01' ). lbl_p04 = lcl_controller=>go_i18n->get( 'P04' ). lbl_hint = lcl_controller=>go_i18n->get( 'HINT' ). pa_sentx = zcl_sensor_manager=>gt_sensortype_detail[ sensor = pa_senso ]-summary. START-OF-SELECTION. DATA(lo_control) = NEW lcl_controller( ). lo_control->go_log = zcl_log=>get_instance( iv_object = 'ALERT' iv_subobject = 'PROCESSING' iv_extnumber = 'SMQ1' ). IF pa_test = abap_true. lcl_controller=>go_log->add_text( lcl_controller=>go_i18n->get( 'P04' ) ). 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 lcl_controller=>go_i18n->get( 'ALREADYACTIVE' ) TYPE 'S'. EXIT. ENDIF. ENDIF. "Pass relevant info to the lcl_controller class lo_control->gv_sensor = pa_senso. lo_control->gv_sensor_description = pa_sentx. lo_control->gv_testmode = pa_test. "Execute the sensor - through BAPI lo_control->get_sensor_settings( ). "Process the queues: select data and feed to the BAPI lo_control->process_queues( ). CALL FUNCTION 'DEQUEUE_ESVARIANT'. lcl_controller=>go_log->display( ).