Сабж. В отличие от стандартного монитора (тр. SXI_MONITOR), реализован множественный выбор сообщений по Системе, Интерфейсу и Неймспейсу через select-options, а также поиск по содержимому сообщений (payload).
Ограничения:
- В режиме просмотра сообщений кнопка Обновить(F5) обновляет только статус выбранных сообщений, новые сообщения не отображаются
Code:
REPORT z_xi_monitor.
TABLES: sxmspmast, ssximoni_address, sxmsitf.
*--------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(20) c_dtfrom FOR FIELD s_dtfrom.
SELECTION-SCREEN POSITION 21.
PARAMETERS s_dtfrom TYPE datum.
SELECTION-SCREEN COMMENT 35(3) c_tmfrom.
SELECTION-SCREEN POSITION 40.
PARAMETERS: s_tmfrom TYPE uzeit DEFAULT '000000'.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(20) c_dateto FOR FIELD s_dateto.
SELECTION-SCREEN POSITION 21.
PARAMETERS: s_dateto TYPE datum DEFAULT sy-datum.
SELECTION-SCREEN COMMENT 35(3) c_timeto.
SELECTION-SCREEN POSITION 40.
PARAMETERS: s_timeto TYPE uzeit DEFAULT '235959'.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK b01.
SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(10) c_io_sy FOR FIELD so_io_sy.
SELECTION-SCREEN POSITION 18.
SELECT-OPTIONS so_io_sy FOR ssximoni_address-service. " Sending or Receiving System
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(10) c_io_ns FOR FIELD so_io_ns.
SELECTION-SCREEN POSITION 18.
SELECT-OPTIONS so_io_ns FOR sxmsitf-itfnso. "Inbound or Outbound Interface Namespace
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(10) c_io_nm FOR FIELD so_io_nm.
SELECTION-SCREEN POSITION 18.
SELECT-OPTIONS so_io_nm FOR sxmsitf-itfnameo. " Inbound or Outbound Interface Name
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK b02.
SELECTION-SCREEN BEGIN OF BLOCK b03 WITH FRAME.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(10) c_mguid FOR FIELD so_mguid.
SELECTION-SCREEN POSITION 18.
SELECT-OPTIONS so_mguid FOR sxmspmast-msgguid.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(10) c_size FOR FIELD so_size.
SELECTION-SCREEN POSITION 18.
SELECT-OPTIONS: so_size FOR sxmspmast-msg_size.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(20) c_max_ms FOR FIELD p_max_ms.
SELECTION-SCREEN POSITION 21.
PARAMETERS p_max_ms TYPE int4 DEFAULT 400. "Ограничение выборки без учета поиска по payload
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK b03.
SELECTION-SCREEN BEGIN OF BLOCK b05 WITH FRAME.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(20) c_payld FOR FIELD p_payld.
SELECTION-SCREEN POSITION 21.
PARAMETERS p_payld TYPE text200.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK b05.
*--------------------------------------------------------------------*
DATA: gt_keytable TYPE TABLE OF SXMSKEY_S.
*--------------------------------------------------------------------*
INITIALIZATION.
s_dtfrom = sy-datum - 2.
c_dtfrom = 'Выполнение с'.
c_tmfrom = '/'.
c_dateto = 'Выполнение по'.
c_timeto = '/'.
c_size = 'Размер'.
c_io_sy = 'System'.
c_io_nm = 'Interface Name'.
c_io_ns = 'Namespace'.
c_mguid = 'ID сообщения'.
c_payld = 'Payload'.
c_max_ms = 'Макс. строк'.
*--------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM select_messages.
PERFORM payload_search.
*--------------------------------------------------------------------*
END-OF-SELECTION.
PERFORM call_monitor.
*&---------------------------------------------------------------------*
*& Form SELECT_MESSAGES
*&---------------------------------------------------------------------*
FORM select_messages.
DATA: lv_tstamp TYPE timestamp,
lv_timestampto TYPE timestampl,
lv_timestampfrom TYPE timestampl.
cl_abap_tstmp=>systemtstmp_syst2utc(
EXPORTING
syst_date = s_dtfrom
syst_time = s_tmfrom
IMPORTING
utc_tstmp = lv_tstamp ).
lv_timestampfrom = lv_tstamp.
cl_abap_tstmp=>systemtstmp_syst2utc(
EXPORTING
syst_date = s_dateto
syst_time = s_timeto
IMPORTING
utc_tstmp = lv_tstamp ).
lv_timestampto = lv_tstamp.
SELECT sxmspmast~msgguid sxmspmast~pid sxmspmast~vers
INTO CORRESPONDING FIELDS OF TABLE gt_keytable
FROM sxmspmast
JOIN sxmspemas ON sxmspemas~msgguid = sxmspmast~msgguid AND
sxmspemas~pid = sxmspmast~pid
UP TO p_max_ms ROWS
WHERE sxmspmast~exetimest BETWEEN lv_timestampfrom AND lv_timestampto AND
sxmspmast~msg_size IN so_size AND
sxmspmast~msgguid IN so_mguid
AND ( sxmspemas~ob_system IN so_io_sy OR
sxmspemas~ib_system IN so_io_sy )
AND ( sxmspemas~ob_ns IN so_io_ns OR
sxmspemas~ib_ns IN so_io_ns )
AND ( sxmspemas~ib_name IN so_io_nm OR
sxmspemas~ob_name IN so_io_nm )
.
ENDFORM. " SELECT_MESSAGES
*&---------------------------------------------------------------------*
*& Form payload_search
* Поиск по payload. Часть кода скопирована из стандарта
*&---------------------------------------------------------------------*
FORM payload_search.
DATA: lv_stringa TYPE string,
lv_xstringa TYPE xstring,
lo_persist TYPE REF TO cl_xms_persist,
ls_sxmspmast TYPE sxmspmast,
lt_sxmspprop TYPE sxmstprop,
lt_sxmspres TYPE sxmstres,
lt_sxmspxres TYPE sxmstxres,
lt_sxmspns TYPE sxmstns,
lo_ex TYPE REF TO cx_root,
lo_message TYPE REF TO if_xms_message,
lo_xms_resource TYPE REF TO if_xms_resource,
ls_msg_key LIKE LINE OF gt_keytable,
lv_found TYPE flag,
lo_partutil TYPE REF TO cl_xms_part_util,
lo_conttypeobj TYPE REF TO cl_xms_contenttype,
lv_charset TYPE string,
lv_versprogr(3) TYPE n.
IF p_payld IS INITIAL.
EXIT.
ENDIF.
CREATE OBJECT lo_persist.
LOOP AT gt_keytable INTO ls_msg_key.
lv_versprogr = 000.
CLEAR lv_found.
ls_msg_key-version = ls_msg_key-version + 1.
DO ls_msg_key-version TIMES.
TRY.
REFRESH: lt_sxmspprop, lt_sxmspres, lt_sxmspxres, lt_sxmspns.
CLEAR: ls_sxmspmast.
CALL METHOD lo_persist->read_persist_tab_all_pub
EXPORTING
im_msgguid = ls_msg_key-msgguid
im_pid = ls_msg_key-pid
im_version = lv_versprogr
IMPORTING
ex_pmast = ls_sxmspmast
ex_tprop = lt_sxmspprop
ex_tres = lt_sxmspres
ex_txres = lt_sxmspxres
ex_tns = lt_sxmspns.
CATCH cx_xms_syserr_persist INTO lo_ex.
MESSAGE lo_ex TYPE 'S' DISPLAY LIKE 'E'.
EXIT.
ENDTRY.
TRY.
CALL METHOD lo_persist->built_msg
EXPORTING
im_pmast = ls_sxmspmast
im_tprop = lt_sxmspprop
im_tres = lt_sxmspres
im_txres = lt_sxmspxres
im_tns = lt_sxmspns
IMPORTING
ex_message = lo_message.
CLEAR lo_xms_resource.
CALL METHOD lo_message->getattachmentatindex
EXPORTING
index = 1
RECEIVING
resource = lo_xms_resource.
IF lo_xms_resource IS INITIAL.
CONTINUE.
ENDIF.
CALL METHOD lo_xms_resource->getbinarydata
RECEIVING
data = lv_xstringa.
lo_partutil = cl_xms_part_util=>getinstance( ).
CREATE OBJECT lo_conttypeobj.
lo_conttypeobj->valuesfromstring( values = 'T' ).
* DATA l_mimetype TYPE string.
* l_mimetype = lo_conttypeobj->getmimetype( ).
lv_charset = lo_conttypeobj->getcharset( ).
TRY.
lv_stringa = lo_partutil->convert_xstring_to_string( charset = lv_charset
in = lv_xstringa ).
IF lv_stringa CS p_payld.
lv_found = 'X'.
EXIT.
ENDIF.
CATCH cx_xms_exception.
CATCH cx_root.
* unfortunately this exception is not declared for this method and
*cannot be thrown further
ENDTRY.
* string_data = props->writetoxmlstring( external = false ).
CATCH cx_xms_exception INTO lo_ex.
MESSAGE lo_ex TYPE 'S' DISPLAY LIKE 'E'.
EXIT.
CATCH cx_xms_system_error INTO lo_ex.
MESSAGE lo_ex TYPE 'S' DISPLAY LIKE 'E'.
EXIT.
CATCH cx_root.
ENDTRY.
lv_versprogr = lv_versprogr + 1.
ENDDO.
IF lv_found <> 'X'.
DELETE gt_keytable.
ENDIF.
ENDLOOP.
ENDFORM. "payload_search
*&---------------------------------------------------------------------*
*& Form call_monitor
*&---------------------------------------------------------------------*
FORM call_monitor.
DATA: ls_msg_key LIKE LINE OF gt_keytable.
RANGES: r_msgguid FOR sxmspmast-msgguid.
IF gt_keytable[] IS INITIAL.
MESSAGE 'Сообщения не найдены' TYPE 'S'.
EXIT.
ENDIF.
LOOP AT gt_keytable INTO ls_msg_key.
r_msgguid-low = ls_msg_key-msgguid.
r_msgguid-sign = 'I'.
r_msgguid-option = 'EQ'.
APPEND r_msgguid.
ENDLOOP.
SUBMIT rsxmb_select_messages
WITH msgguid IN r_msgguid
WITH lines EQ p_max_ms
AND RETURN.
ENDFORM. "call_monitor