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 catalogueDATA : 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
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
Sure Thomas will Correct and take care now onwards .