Skip to Content

Hello Experts,

    Just like we have WE09 Transaction where we have IDOC content based Idoc searching in the database I would like to share a code snippit for the

XML Proxy  messages Content base Message Searching Program .

It becomes very hectic  when it comes to content based XML message Searching for inboud as well as outbound messages recieved from PI to ECC.

People general go to sxmb_moni to check and then filter by Interface name space date and time stamp.

Say if you have a Purchase Order inbound Proxy Interface ( for example PI – >  ECC ) and you want to know how many messages were just recieved  /  posted / or in error  within a specified Date and time Range for a SPECIFIC Vendor.  How are we going to do it ?

The program Frame work goes as follows.

1. Selection screen contains Interface Namespace / Date / Time stamp OR just bunch of XML Id

2. Obligatory field  :  The Token in the Pay load  . Say if you have a Purchase Order Inbound Interface then you must have some mandatory Vendor Field or similar kind of  Identifier in the same like<XYZ fileld  >…..</XYZ field> …..<VENDOR>0123456789</VENDOR> ……now <VENDOR> will be Our Token .

( Resembles to the Segment Field in the IDOC Packed in case of proxy its a Palyload token )

3. The Token Value Value Field  :  In the above Example for vendor the token value will be  0123456789 Optional coz.. if its blank it will fetch all the token with value .

4. Read the XML ID from the master table.

5. Extract the payload .

6. Retrive the Token Value

7. Display in a Report.

( Please Feel free to correct the errors and update with still better solutions or methods )

Hear goes the Code for same .

*{code}

REPORT  zread_xml_tokens.

TYPE-POOLS : slis, sdydo.

” Data Declaration

DATA : persist_main TYPE REF TO cl_xms_persist.

DATA : xms_msg_main TYPE REF TO if_xms_message .
DATA : xmb_msg_main TYPE REF TO if_xms_message_xmb.

DATA : payload      TYPE sxms_mmfpayloads.
DATA : wa_payload  LIKE LINE OF payload.
DATA : content_main TYPE TABLE OF string.
DATA : wa_str      TYPE string.
DATA : wa_msgid TYPE sxmsmguid.

DATA : lt_msgid TYPE TABLE OF sxmsmguid.
DATA : lw_msgid TYPE sxmsmguid.

” String variables to get the token value
DATA : str1 TYPE string,
      str2 TYPE string,
      l_token TYPE string,
      token TYPE string,
      str5 TYPE string.

DATA : lt_str TYPE TABLE OF string.”Table to hold the splitted values
DATA : lv_string TYPE string.

**********************************************************************
” Data declaration for ALV
DATA: x_layout    TYPE slis_layout_alv.
DATA: ls_cellcolor TYPE lvc_s_scol.
DATA: ws_title    TYPE lvc_title.
*ws_title = text-027.
CONSTANTS : c_tab      TYPE char15 VALUE ‘LT_FINAL’.

DATA : it_fieldcat TYPE slis_t_fieldcat_alv,      “Field catalog with field descriptions
      wa_fieldcat TYPE slis_fieldcat_alv.        “Work Area for field catalogue

DATA : text1 TYPE sdydo_text_element.
**********************************************************************

TYPES : BEGIN OF ty_final,
        xml_id TYPE sxmsmguid,
        value  TYPE string,
        cellcolor    TYPE lvc_t_scol,          “Color of column
        END OF ty_final.

DATA : lt_final TYPE TABLE OF ty_final,
      wa_final TYPE          ty_final.

” Index variables
DATA : l_index    TYPE sy-tabix.
DATA : id_index TYPE sy-tabix.
DATA : temp_index TYPE sy-tabix.

“Handling the exception
DATA : zcx_root TYPE REF TO cx_root.

DATA : lv_vers TYPE sxmslsqnbr.

TYPES : BEGIN OF ty_msgid,
        msgguid TYPE sxmsmguid,
        rest_vers TYPE sxmslsqnbr,
        END OF ty_msgid.

DATA : it_msgid TYPE TABLE OF ty_msgid,
      wa_msgid1 TYPE        ty_msgid.

DATA : s_timestamp TYPE tzntstmpl.
DATA : e_timestamp TYPE tzntstmpl.

DATA : range TYPE RANGE OF tzntstmpl WITH HEADER LINE.

TYPES : BEGIN OF ty_idtab,
        msgguid TYPE sxmsmguid,
        pid  TYPE sxmspid,
        rest_vers TYPE sxmslsqnbr,
        END OF ty_idtab.

DATA : it_idtab TYPE TABLE OF ty_idtab,
      wa_idtab TYPE      ty_idtab.
DATA : lv_dbcnt TYPE sy-dbcnt.
DATA : lv_final TYPE sy-dbcnt.
**********************************************************************

” Radio Button Screen
SELECTION-SCREEN: BEGIN OF BLOCK rd WITH FRAME TITLE text-001.
PARAMETERS : r1 RADIOBUTTON GROUP rad1 USER-COMMAND s_msg_id DEFAULT ‘X’,
            r2 RADIOBUTTON GROUP rad1.
SELECTION-SCREEN: END OF BLOCK rd.

“XML ID screen
SELECTION-SCREEN: BEGIN OF BLOCK xml WITH FRAME TITLE text-003.
SELECT-OPTIONS : s_msg_id FOR wa_msgid NO INTERVALS OBLIGATORY MODIF ID sc1.
SELECTION-SCREEN: END OF BLOCK xml.

“Namespace and date range screen
SELECTION-SCREEN: BEGIN OF BLOCK ns WITH FRAME TITLE text-004.
PARAMETERS :  int_ns  TYPE rm_oifns  MATCHCODE OBJECT s_interface_i MODIF ID sc2.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN : COMMENT 1(12) text-006 MODIF ID sc2.
PARAMETERS : s_date  TYPE sy-datum MODIF ID sc2.
SELECTION-SCREEN : COMMENT 26(12) text-008 MODIF ID sc2.
PARAMETERS : s_time TYPE sy-uzeit MODIF ID sc2.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN : COMMENT 1(12) text-007 MODIF ID sc2.
PARAMETERS : e_date TYPE sy-datum DEFAULT sy-datum MODIF ID sc2.
SELECTION-SCREEN : COMMENT 26(12) text-009 MODIF ID sc2.
PARAMETERS : e_time TYPE sy-uzeit DEFAULT sy-uzeit MODIF ID sc2.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN: END OF BLOCK ns.

“Token and its Value screen
SELECTION-SCREEN: BEGIN OF BLOCK tk WITH FRAME TITLE text-005.
PARAMETERS    : p_token1 TYPE string LOWER CASE.” OBLIGATORY. ” The token for which the value has to be fetched
PARAMETERS    : p_value  TYPE string.
SELECTION-SCREEN: END OF BLOCK tk.

“Toggling between mode of selection

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    IF screen-group1 = ‘SC1’ AND r2 = ‘X’.
      screen-active = ‘0’.
      MODIFY SCREEN.
      CONTINUE.
    ENDIF.
    IF screen-group1 = ‘SC2’ AND r1 = ‘X’.
      screen-active = ‘0’.
      MODIFY SCREEN.
      CONTINUE.
    ENDIF.
  ENDLOOP.

*AT SELECTION-SCREEN.
*  IF r1 = ‘X’ AND screen-group1 = ‘SC1’.
*    screen-required = ‘1’.
*    MODIFY SCREEN.
*  ENDIF.

START-OF-SELECTION.

  IF p_token1 IS INITIAL.
    MESSAGE ‘Provide a Token Value’ TYPE ‘I’ DISPLAY LIKE ‘E’.
*    LEAVE TO CURRENT TRANSACTION.
    RETURN.
  ENDIF.

  ” Namespace based selection
  IF r2 = ‘X’.
    IF int_ns IS INITIAL OR s_date IS INITIAL OR  e_date IS INITIAL.
      MESSAGE ‘Either Interface name or start date or end date is missing!’ TYPE ‘I’ DISPLAY LIKE ‘E’.
      RETURN.
    ENDIF.
    CONVERT DATE s_date TIME s_time
      INTO TIME STAMP s_timestamp TIME ZONE sy-zonlo.

    CONVERT DATE e_date TIME e_time
        INTO TIME STAMP e_timestamp TIME ZONE sy-zonlo.

    MOVE s_timestamp TO range-low.
    MOVE e_timestamp TO range-high.
    MOVE ‘I’ TO range-sign.
    MOVE ‘BT’ TO range-option.
    APPEND range.

    SELECT sxmspmast~msgguid sxmspmast~pid sxmspmast~rest_vers
    FROM ( sxmspemas
          INNER JOIN sxmspmast
          ON  sxmspmast~msgguid = sxmspemas~msgguid
          AND sxmspmast~pid = sxmspemas~pid ) INTO TABLE it_idtab
        WHERE sxmspemas~ib_name EQ int_ns
          AND sxmspmast~inittimest IN range.
  ENDIF.

  ” XML ID based selection
  IF r1 = ‘X’.

*    “Storing all the message IDs in an internal table
*    LOOP AT s_msg_id.
*      MOVE s_msg_id-low TO lw_msgid.
*      APPEND lw_msgid TO lt_msgid.
*    ENDLOOP.
    IF s_msg_id IS NOT INITIAL.
      SELECT msgguid pid rest_vers FROM sxmspmast
                                  INTO TABLE it_idtab
                                  WHERE msgguid IN s_msg_id.
    ELSE.
      MESSAGE ‘Provide XML IDs’ TYPE ‘I’ DISPLAY LIKE ‘E’.
*      LEAVE TO CURRENT TRANSACTION.
      RETURN.
    ENDIF.

  ENDIF.

  “Loop to process all the message IDs

  IF it_idtab IS NOT INITIAL.
    LOOP AT it_idtab INTO wa_idtab.
      id_index = sy-tabix.
      TRY.

          CREATE OBJECT persist_main.

          CALL METHOD persist_main->read_msg_all
            EXPORTING
              im_msgguid = wa_idtab-msgguid
              im_pid    = wa_idtab-pid
              im_version = wa_idtab-rest_vers
            IMPORTING
              ex_message = xms_msg_main.

          xmb_msg_main ?= xms_msg_main.

          CALL METHOD xmb_msg_main->get_main_payloads
            RECEIVING
              return = payload.

          IF payload IS NOT INITIAL.
            READ TABLE payload INTO wa_payload INDEX 1.

            “Fetched the payload of XML ID
            CALL METHOD wa_payload-mainpayload->gettextcontent
              RECEIVING
                return = wa_str.

            data : temp_input TYPE ZCL_MT_IDDOC_PROCS_UPDATE.
            data : target TYPE string.
*
            data : object TYPE REF TO ZCL_CL_SI_CREATE_IDDOCUMENT_PR.
* Hear…the token is extracted using simple string Operations One can very well use XSLT *transformations.

            CONDENSE wa_str.
            TRANSLATE wa_str TO UPPER CASE.
            TRANSLATE p_token1 TO UPPER CASE.
            “Break the string from initial token. Eg. <Customer>
            REFRESH lt_str.
            SPLIT wa_str AT p_token1 INTO TABLE lt_str.

            “Building the end token
            CLEAR l_token.
            MOVE p_token1 TO l_token.
            REPLACE FIRST OCCURRENCE OF ‘<‘ IN l_token WITH ‘</’.

            IF lt_str IS NOT INITIAL.
              LOOP AT lt_str INTO wa_str FROM 2.
                CLEAR: token, str5, l_index.
                l_index = sy-tabix.
                “Splitting the string at end token to get the token value
                SPLIT wa_str AT l_token INTO token str5.

                wa_final-value  = token.

                temp_index = id_index MOD 2.
                IF temp_index EQ 0.
                  ls_cellcolor-fname = ‘XML_ID’.
                  ls_cellcolor-color-col = 3.
                  APPEND ls_cellcolor TO wa_final-cellcolor.

                  ls_cellcolor-fname = ‘VALUE’.
                  ls_cellcolor-color-col = 3.
                  APPEND ls_cellcolor TO wa_final-cellcolor.
                ELSE.
                  ls_cellcolor-fname = ‘XML_ID’.
                  ls_cellcolor-color-col = 6.
                  APPEND ls_cellcolor TO wa_final-cellcolor.

                  ls_cellcolor-fname = ‘VALUE’.
                  ls_cellcolor-color-col = 6.
                  APPEND ls_cellcolor TO wa_final-cellcolor.
                ENDIF.
                wa_final-xml_id = wa_idtab-msgguid.

*        CONCATENATE ‘*’ p_value ‘*’ INTO lv_string.
                IF  p_value IS NOT INITIAL
                AND token CP p_value.
                  APPEND wa_final TO lt_final.
                ELSEIF p_value IS INITIAL.
                  APPEND wa_final TO lt_final.
                ENDIF.

                CLEAR wa_final.
              ENDLOOP.
            ENDIF.
          ELSE.
            wa_final-xml_id = wa_idtab-msgguid.
            wa_final-value = ‘Unable to retrieve payload’.
            APPEND wa_final TO lt_final.
            CLEAR wa_final.
          ENDIF.

          CLEAR wa_idtab.
          CLEAR wa_str.
        CATCH zcx_root.
        CATCH cx_xms_syserr_persist.
          wa_final-xml_id = wa_idtab-msgguid.
          wa_final-value = ‘Unable to retrieve message’.
          APPEND wa_final TO lt_final.
          CLEAR wa_final.
      ENDTRY.
    ENDLOOP.
  ELSE.
    MESSAGE ‘No records selected!’ TYPE ‘I’ DISPLAY LIKE ‘E’.
*    LEAVE TO CURRENT TRANSACTION.
    RETURN.
  ENDIF.
  IF lt_final IS NOT INITIAL.
    DESCRIBE TABLE it_idtab LINES lv_dbcnt. ” Holds value of total records.
    DESCRIBE TABLE lt_final LINES lv_final. ” Records matching the criteria
    PERFORM build_fieldcat USING ‘1’ ‘XML_ID’ text-002.

    PERFORM build_fieldcat USING ‘2’ ‘VALUE’  p_token1.

    x_layout-coltab_fieldname = ‘CELLCOLOR’.

    PERFORM display_output.
  ELSE.
    MESSAGE ‘No tokens extracted’ TYPE ‘I’ DISPLAY LIKE ‘E’.
*    LEAVE TO CURRENT TRANSACTION.
    RETURN.
  ENDIF.

*&———————————————————————*
*&      Form  BUILD_FIELDCAT
*&———————————————————————*
*      text
*———————————————————————-*
*      –>P_0294  text
*      –>P_0295  text
*      –>P_TEXT_002  text
*———————————————————————-*
FORM build_fieldcat  USING    value(col_pos) TYPE any
                              value(fnam) TYPE any
                              text    TYPE any.

  wa_fieldcat-col_pos  = col_pos.
  wa_fieldcat-fieldname = fnam.
  wa_fieldcat-tabname  = c_tab.
  wa_fieldcat-seltext_l = text.
  wa_fieldcat-no_zero = ‘X’.
  wa_fieldcat-outputlen = 30.
  APPEND wa_fieldcat TO it_fieldcat.
  CLEAR  wa_fieldcat.

ENDFORM.                    ” BUILD_FIELDCAT
*&———————————————————————*
*&      Form  DISPLAY_OUTPUT
*&———————————————————————*
*      text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM display_output .

  CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
    EXPORTING
      i_callback_program          = sy-repid
      I_CALLBACK_USER_COMMAND    = ‘USER_COMMAND’
      i_callback_html_top_of_page = ‘HTML_TOP_OF_PAGE’
      i_grid_title                = ws_title
      is_layout                  = x_layout
      it_fieldcat                = it_fieldcat[]
    TABLES
      t_outtab                    = lt_final
    EXCEPTIONS
      program_error              = 1
      OTHERS                      = 2.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.                    ” DISPLAY_OUTPUT
*&———————————————————————*
*&      Form  HTML_TOP_OF_PAGE
*&———————————————————————*
*      text
*———————————————————————-*
*      –>DOCUMENT  text
*———————————————————————-*
FORM html_top_of_page USING document TYPE REF TO cl_dd_document.

  DATA : lv_string TYPE string.
  DATA : lc_char TYPE char20.
  DATA : i_dtfrm(10) TYPE c,
        i_dtto(10)  TYPE c.
  CALL METHOD document->add_gap
    EXPORTING
      width = 15.

  CLEAR lv_string.

  IF r2 IS NOT INITIAL.
    CALL FUNCTION ‘CONVERT_DATE_TO_EXTERNAL’
      EXPORTING
        date_internal            = s_date
      IMPORTING
        date_external            = i_dtfrm
      EXCEPTIONS
        date_internal_is_invalid = 1
        OTHERS                  = 2.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

    CALL FUNCTION ‘CONVERT_DATE_TO_EXTERNAL’
      EXPORTING
        date_internal            = e_date
      IMPORTING
        date_external            = i_dtto
      EXCEPTIONS
        date_internal_is_invalid = 1
        OTHERS                  = 2.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
if int_ns is NOT INITIAL.
    CONCATENATE text-012 space i_dtfrm ‘to’ i_dtto ‘for interface’ int_ns  INTO lv_string SEPARATED BY space.
  ELSE.
    CONCATENATE text-012 space i_dtfrm ‘to’ i_dtto  INTO lv_string SEPARATED BY space.
    endif.

    MOVE lv_string TO text1.
    CALL METHOD document->add_text
      EXPORTING
        text        = text1
        sap_fontsize = cl_dd_document=>large
        sap_emphasis = text-011.

    CALL METHOD document->new_line
      EXPORTING
        repeat = ‘1’.
  ENDIF.

  CLEAR: lc_char, lv_string.
  MOVE lv_dbcnt TO lc_char.

  CONCATENATE text-010 ‘: ‘ lc_char INTO lv_string.

  CALL METHOD document->add_gap
    EXPORTING
      width = 15.

  MOVE lv_string TO text1.
*  text1 =  text-010.
  CALL METHOD document->add_text
    EXPORTING
      text        = text1
      sap_fontsize = cl_dd_document=>large
      sap_emphasis = text-011.

    CALL METHOD document->new_line.

    CLEAR: lc_char, lv_string.
    MOVE lv_final TO lc_char.

    CONCATENATE text-013 ‘: ‘ lc_char INTO lv_string.

    CALL METHOD document->add_gap
      EXPORTING
        width = 15.

    MOVE lv_string TO text1.

    CALL METHOD document->add_text
      EXPORTING
        text        = text1
        sap_fontsize = cl_dd_document=>large
        sap_emphasis = text-011.

ENDFORM.                    “HTML_TOP_OF_PAGE

FORM USER_COMMAND  USING r_ucomm LIKE sy-ucomm
                                  rs_selfield TYPE slis_selfield.

  READ TABLE lt_final INTO wa_final INDEX rs_selfield-tabindex.
  if sy-subrc eq 0.

  SUBMIT  RSXMB_DISPLAY_MSG_VERS_NEW  WITH MSGGUID = wa_final-xml_id
    AND RETURN.

  ENDIF.
ENDFORM.

*{/Code}

*Text elements
*———————————————————-
* 001 Select the criteria for search
* 002 XML ID
* 003 Input XMLIds
* 004 Input Namespace and date range
* 005 Input Token To look for
* 006 Start Date:
* 007 End Date:
* 008 Start Time:
* 009 End Time:
* 010 Total records found
* 011 Strong
* 012 Data records from:
* 013 Total Tokens found

*Selection texts
*———————————————————-
* E_DATE        End Date
* E_TIME        End Time
* INT_NS        Interface namespace
* P_TOKEN1        Token to look for
* P_VALUE        Value to be compared
* R1        XMLbased
* R2        Namespace and date based
* S_DATE        Start Date
* S_MSG_ID        Message ID
* S_TIME        Start Time

*Messages
*———————————————————-
*
* Message class: Hard coded
*  Provide a Token Value

To report this post you need to login first.

2 Comments

You must be Logged on to comment or reply to a post.

  1. Thomas Zloch

    Thanks for sharing, but please make your document more reader friendly, for example use non-proportional font for code, use formatting options for headlines.

    Thomas

    (0) 

Leave a Reply