Program for content based PROXY Message Searching in ECC
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 .
Hi Anup,
Thank you for posting this usefull information.
In my requirement, I need to get the XML data from Proxy.
But during the call of persistent calss , default it set to binary
ALL 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.
Eventhough I tried to call the settextcontent method but its not changing . Basically the field KIND in CL_XML_RESOURCE class is issue.
Could you please suggest on this issue, like how we can make the type of KIND to 'T' or how we can able to convert that binary to Text.
I facing issue when trying to get the context resource.
Like I need the Text format=> KIND = T , but default its setting as KIND = B .
how we can overwrite with T.
Thank you in advance...
Regards
Vasantha