Текущее время: Чт, мар 28 2024, 12:39

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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