Текущее время: Пт, июл 04 2025, 12:53

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Дарю народу расширенный монитор сообщений XI/PI (Z_XI_MONITOR)
СообщениеДобавлено: Вт, фев 21 2012, 16:34 
Старший специалист
Старший специалист

Зарегистрирован:
Вт, ноя 18 2008, 10:40
Сообщения: 342
Откуда: Пермь
Пол: Мужской
Сабж. В отличие от стандартного монитора (тр. 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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дарю народу расширенный монитор сообщений XI/PI (Z_XI_MONITOR)
СообщениеДобавлено: Ср, фев 22 2012, 19:22 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Вт, сен 25 2007, 13:27
Сообщения: 45
Откуда: Москва, АНТ-Информ (Газпром)
Пол: Мужской
Чтобы было совсем круто, надо добавить возможность рестарта успешных сообщений :)
Кстати, видел блог на эту тему - делается убиранием одного IF

_________________
Ерин Саня: А я напишу свой SAP ...с блэкджеком и шлюх*ми


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Ahrefs [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB