|
Blogs
In the sdn there are some documents abput how to improve or fetch data from sxi_monitor. in this case a did two RFC.The first RFC (ZXI_MONITOR) fetch the data of differents messages from Imports parameters filters. The second RFC get back the Payload (inbound Message) from the message ID thats comes in a Import Parameter zxi_monitor RFC receive parameters like - BeginDate
- EndDate
- BeginTime
- EndTime
- SenderSystem
- TargetSystem
- MessageID
in simples words the RFC fetch the data from those filters and fill the table GT_MESSAGES. Also ZDISPLAY_MESSAGE_PAYLOAD RFC get the message payload from the messageID But no much words a go to the action. here you have the ABAP code. this develop is different from others blogs cozi dont create any custom structureto return data, just ussing the standard code and tables. Here ZXI_MONITOR FUNCTION zxi_monitor. *"---------------------------------------------------------------------- *"*"Local
Interface: *" IMPORTING *" VALUE(D_BEGINDATE) TYPE SYDATUM *"
VALUE(D_ENDDATE) TYPE SYDATUM *" VALUE(T_BEGINTIME) TYPE
SYUZEIT *" VALUE(T_ENDTIME) TYPE SYUZEIT OPTIONAL *"
VALUE(S_SENDER_SYSTEM) TYPE CHAR20 OPTIONAL *"
VALUE(S_TARGET_SYSTEM) TYPE CHAR20 OPTIONAL *" VALUE(MESSAGEID)
TYPE CHAR40 OPTIONAL *" EXPORTING *" VALUE(GT_MESSAGES)
TYPE Z_TT_SXMSMSGDSP *"----------------------------------------------------------------------
*Tables
TABLES: sxmsphist, sxmsmstatt. TABLES: sscrfields. INCLUDE
<icon>.
*Constants CONSTANTS: c_process_view
VALUE 'P', c_default_view VALUE space.
DATA: display_docu TYPE dokil-object. DATA: g_view(1) TYPE c VALUE
c_default_view. DATA: g_grid_view TYPE c.
*which docu to be
displayed ? display_docu = 'XMB_SELECT_MSG'.
CLEAR
g_grid_view.
*Creo la lista de mensajes a retornar PERFORM
build_list TABLES gt_messages USING d_begindate
d_enddate t_begintime
t_endtime s_sender_system
s_target_system messageid. .
ENDFUNCTION.
**&---------------------------------------------------------------------* **&
Form build_list **&---------------------------------------------------------------------* **
text **----------------------------------------------------------------------*
FORM
build_list TABLES gt_messages USING d_begindate
d_enddate t_begintime
t_endtime s_sender_system
s_target_system messageid.
TYPES:BEGIN OF gt_msgguid_sel, sign(1),
option(2), low(36) TYPE c, high(36) TYPE
c, END OF gt_msgguid_sel. DATA: status(20).
DATA: "lv_tabix LIKE sy-tabix, lv_state_only TYPE
sxmsflag, * lv_msgstate TYPE sxmspmstat,
lv_client LIKE sy-mandt, ls_sxmspemas TYPE
sxmspemas_sr, lt_msgguid TYPE sxmsmguidt,
ls_msgguid TYPE sxmsmguid, lt_pids TYPE
sxms_sel_options, ls_pids TYPE sxmsselopt,
lt_back_pids TYPE sxms_tab_sxmspid, ls_back_pids TYPE
sxmspid, wa TYPE gt_msgguid_sel,
wa_msgtab TYPE sxmsmsglst, lt_clients TYPE
sxmb_symandt_tab, lv_index TYPE sxmsmguid,
lv_index_count TYPE sxmxindex, lv_process_mode,
l_first_ts TYPE timestampl, l_exe_date TYPE d,
l_exe_time TYPE t, l_number TYPE i VALUE 200.
DATA: lt_mstat_tab TYPE sxmspmstat_tab. DATA: l_result TYPE
sxmsadminresult. * lv_stat_type TYPE sxmspmstat_type.
DATA: gt_msgtab TYPE sxmsmsgtab. DATA: lv_msgtab LIKE
gt_msgtab. DATA: gv_xmb_admin. DATA: g_sel_tab TYPE sy-ucomm.
DATA: persist TYPE REF TO cl_xms_persist. DATA:
gt_sxmsmsglst_sorted TYPE sxmsmsglst_sorted_tab. DATA: oref TYPE
REF TO cx_xms_syserr_persist. DATA: gs_sxmsmsglst_sorted TYPE
sxmsmsglst_sorted. DATA: gs_msgtab TYPE sxmsmsglst.
DATA: gs_msgtab_ext TYPE sxmsmsgdsp. DATA:
gt_msgtab_ext TYPE STANDARD TABLE OF sxmsmsgdsp. DATA:
pid TYPE sxmspid. DATA: lt_msgtab LIKE gt_msgtab_ext,
l_tabix TYPE sytabix. DATA: errcat TYPE sxmserrcat,
errcode TYPE sxmserrid, msgtype TYPE sxmspmtype. DATA:
l_icon TYPE tv_image. DATA: msgtab TYPE sxmsmsgdsp.
DATA: wa_messages TYPE zsxmsmsgdsp_tab. DATA:
zw_exedate TYPE sy-datum, zw_exetime
TYPE sy-uzeit, zw_senddate TYPE sy-datum,
zw_sendtime TYPE sy-uzeit, zw_initdate
TYPE sy-datum, zw_inittime TYPE sy-uzeit.
FIELD-SYMBOLS: <msgline> LIKE LINE OF gt_msgtab_ext.
REFRESH: gt_msgtab.
* Busca mensaje por Message ID. este
parametro debe ser el qe llega por parámetro * SORT msgguid. *
CLEAR lifecycl. REFRESH lt_msgguid.
IF messageid IS NOT
INITIAL. REPLACE ALL OCCURRENCES OF '-' IN messageid WITH ''.
CONDENSE messageid NO-GAPS.
IF messageid CO
'0123456789abcdefABCDEF '. ls_msgguid = messageid.
APPEND ls_msgguid TO lt_msgguid. * delete time fields, since only
guids are relevant CLEAR d_begindate. CLEAR d_enddate.
CLEAR t_begintime. ENDIF.
IF pid IS INITIAL AND
messageid IS INITIAL. lt_back_pids =
cl_xms_persist=>get_pid( cl_xms_persist=>co_back_pid ).
LOOP AT lt_back_pids INTO ls_back_pids. ls_pids-sign = 'E'.
ls_pids-option = 'EQ'. ls_pids-low = ls_back_pids.
APPEND ls_pids TO lt_pids. ENDLOOP. ENDIF. ENDIF. *Asigno
los valores de los filtros a las estructuras *correspondientes para
luego hacer la busqueda correspondiente
*
ls_sxmspemas-ob_party = sndrprty. *
ls_sxmspemas-ob_party_type = sndprtty. *
ls_sxmspemas-ob_party_agency = ls_sxmspemas-ob_system =
s_sender_system. * ls_sxmspemas-ob_ns = oifns. *
ls_sxmspemas-ob_name = oifname. *
ls_sxmspemas-ib_party = rcvrprty. *
ls_sxmspemas-ib_party_type = rcvprtty. *
ls_sxmspemas-ib_party_agency = ls_sxmspemas-ib_system =
s_target_system. * ls_sxmspemas-ib_ns = iifns. *
ls_sxmspemas-ib_name = iifname. *
CALL FUNCTION
'SXMB_SELECT_MESSAGES' EXPORTING im_senddate =
'00000000' im_sendtime = '000000'
im_snd2date = '00000000' im_snd2time =
'000000' im_exedate = d_begindate
im_exetime = t_begintime im_exe2date =
d_enddate im_exe2time = t_endtime
im_pid = pid im_pids = lt_pids
im_client = '100' im_user = ''
im_adapter_type_in = '' im_adapter_type = ''
im_adapter_state = '000' im_s_sender_receiver =
ls_sxmspemas im_errcat = errcat
im_errcode = errcode im_msgguid_tab =
lt_msgguid im_msgstate_tab = lt_mstat_tab
im_queueid = '' im_msgtype = msgtype
im_number = l_number im_process_mode = '0'
IMPORTING ex_msgtab = gt_msgtab
ex_result = l_result ex_first_ts =
l_first_ts EXCEPTIONS persist_error = 1
OTHERS = 2.
***************Control de errores de
busqueda de mensajes IF sy-subrc <> 0. MESSAGE ID
sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE 'E' WITH
sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. EXIT. ENDIF.
*
test if one message is selected at all IF gt_msgtab[] IS INITIAL.
MESSAGE i113(xms_adm) DISPLAY LIKE 'E'. EXPORT g_sel_tab FROM
g_sel_tab TO MEMORY ID 'RSXMB_SEL_MSG_SEL_TAB'. EXIT. ELSE. ***************/Control
de errores de busqueda de mensajes
* eliminate duplicates
SORT gt_msgtab BY msgguid pid. DELETE ADJACENT DUPLICATES FROM
gt_msgtab COMPARING msgguid pid. ENDIF.
REFRESH
gt_msgtab_ext. * build displayed list * first step: version 0
entries LOOP AT gt_msgtab INTO gs_msgtab. CLEAR:
zw_exedate, zw_exetime, zw_senddate, zw_sendtime,
zw_initdate, zw_inittime. CONVERT TIME STAMP gs_msgtab-exetimest
TIME ZONE sy-zonlo INTO DATE zw_exedate TIME zw_exetime.
CONVERT TIME STAMP gs_msgtab-sendtimest TIME ZONE sy-zonlo
INTO DATE zw_senddate TIME zw_sendtime. CONVERT TIME STAMP
gs_msgtab-inittimest TIME ZONE sy-zonlo INTO DATE zw_initdate
TIME zw_inittime.
CLEAR gs_msgtab_ext.
MOVE-CORRESPONDING gs_msgtab TO gs_msgtab_ext.
gs_msgtab_ext-initdate = zw_initdate. gs_msgtab_ext-inittime =
zw_inittime. gs_msgtab_ext-exedate = zw_exedate.
gs_msgtab_ext-exetime = zw_exetime. gs_msgtab_ext-senddate =
zw_senddate. gs_msgtab_ext-sendtime = zw_sendtime.
gs_msgtab_ext-pelname = text-042.
** get the BPM relevant
fields * CALL METHOD get_bpm_fields * EXPORTING *
msgline = gs_msgtab_ext * IMPORTING * msgtab
= lt_msgtab. * * APPEND LINES OF lt_msgtab TO
gt_msgtab_ext. * REFRESH lt_msgtab[]. * ELSE.
APPEND gs_msgtab_ext TO gt_msgtab_ext. * ENDIF. ENDLOOP. *
check for messages without process identification LOOP AT
gt_msgtab_ext INTO gs_msgtab_ext WHERE wi_id IS INITIAL
AND dirservice IS INITIAL AND dirparty IS INITIAL.
l_tabix = sy-tabix. READ TABLE gt_msgtab_ext ASSIGNING
<msgline> WITH KEY ref_to_msg = gs_msgtab_ext-msgguid.
IF sy-subrc = 0. gs_msgtab_ext-dirparty =
<msgline>-dirparty. gs_msgtab_ext-dirservice =
<msgline>-dirservice. gs_msgtab_ext-wi_id =
<msgline>-wi_id. gs_msgtab_ext-task =
<msgline>-task. MODIFY gt_msgtab_ext FROM gs_msgtab_ext
INDEX l_tabix. ENDIF. ENDLOOP.
FREE lt_msgtab[].
*
Get Message status LOOP AT gt_msgtab_ext INTO gs_msgtab_ext. *
set status *-----set status of outbound queue CASE
gs_msgtab_ext-queuestate.
WHEN
cl_xms_persist=>co_stat_queue_stop. l_icon =
icon_breakpoint. l_icon+3(2) = '\Q'. l_icon+5(40)
= text-q01. l_icon+45(1) = '@'. WHEN
cl_xms_persist=>co_stat_queue_error. l_icon =
icon_led_red. l_icon+3(2) = '\Q'. l_icon+5(40) =
text-q02. l_icon+45(1) = '@'. WHEN
cl_xms_persist=>co_stat_queue_waiting. l_icon =
icon_led_yellow. l_icon+3(2) = '\Q'. l_icon+5(40)
= text-q03. l_icon+45(1) = '@'. WHEN
cl_xms_persist=>co_stat_queue_processing. l_icon =
icon_led_green. l_icon+3(2) = '\Q'. l_icon+5(40) =
text-q04. l_icon+45(1) = '@'. WHEN OTHERS.
l_icon = icon_space. ENDCASE.
gs_msgtab_ext-queueicon = l_icon.
*-----set status of job
CASE gs_msgtab_ext-status.
WHEN 'X'.
l_icon = icon_led_yellow. l_icon+3(2) = '\Q'.
l_icon+5(40) = text-j01. l_icon+45(1) = '@'. WHEN
'D'. l_icon = icon_okay. l_icon+3(2) =
'\Q'. l_icon+5(40) = text-j02. l_icon+45(1) = '@'.
WHEN OTHERS. l_icon = icon_space. ENDCASE.
gs_msgtab_ext-jobicon = l_icon.
*-----set status of message
CALL FUNCTION 'SXMB_GET_ICON_FOR_MSG_STATE' EXPORTING
im_state = gs_msgtab_ext-msgstate
im_commit_flag = gs_msgtab_ext-commitact
im_restart_version = gs_msgtab_ext-rest_vers
im_msgtype = gs_msgtab_ext-msgtype IMPORTING
ex_icon = l_icon.
gs_msgtab_ext-staticon =
l_icon. MODIFY gt_msgtab_ext FROM gs_msgtab_ext. *move-corresponding
gs_msgtab_ext to ENDLOOP.
* cargo los mensajes obtenidos a
mi * estructura return que pasara los datos al front end LOOP
AT gt_msgtab_ext INTO gs_msgtab_ext. MOVE-CORRESPONDING
gs_msgtab_ext TO wa_messages. APPEND wa_messages TO gt_messages.
CLEAR wa_messages. ENDLOOP. ENDFORM.
"build_list |
Here Zdisplay_message_payload FUNCTION zdisplay_message_payload. *"---------------------------------------------------------------------- *"*"Local
Interface: *" IMPORTING *" VALUE(MESSAGEID) TYPE CHAR40 *"
EXPORTING *" VALUE(PAYLOAD) TYPE SLDSTRING *"----------------------------------------------------------------------
DATA: iv_version TYPE sxmslsqnbr, i_version TYPE
sxmslsqnbr, size TYPE i, ref_xms_persist TYPE REF TO
cl_xms_persist, ref_xms_main TYPE REF TO cl_xms_main,
ex_message TYPE REF TO if_xms_message, prop TYPE REF TO
if_xms_prop, props TYPE REF TO sxms_pro_t, resource TYPE REF
TO if_xms_resource, ex_msgstate TYPE sxmspmstat,
ex_string TYPE string, comp_string TYPE string, data TYPE
etxml_line_str, cx_ref TYPE REF TO cx_xms_syserr_persist.
DATA: lt_msgguid TYPE sxmsmguidt, ls_msgguid TYPE
sxmsmguid. DATA: gt_msgtab TYPE sxmsmsgtab,
gs_msgtab TYPE sxmsmsglst.
ls_msgguid = messageid.
APPEND ls_msgguid TO lt_msgguid.
CALL FUNCTION
'SXMB_SELECT_MESSAGES' EXPORTING *
IM_SENDDATE = * IM_SENDTIME = *
IM_SND2DATE = * IM_SND2TIME = *
im_exedate = exedate *
im_exetime = start_time *
im_exe2date = exe2date *
im_exe2time = end_time * IM_PID = *
IM_PIDS = * IM_CLIENT = *
IM_USER = * IM_ADAPTER_TYPE_IN = *
IM_ADAPTER_TYPE = * IM_ADAPTER_STATE = *
IM_S_SENDER_RECEIVER = * IM_ERRCAT = *
IM_ERRCODE = im_msgguid_tab =
lt_msgguid * IM_MSGSTATE_TAB = *
IM_QUEUEID = * IM_MSGTYPE =
im_number = 1 * IM_ADAPTER_OR = '0' *
IM_PROCESS_MODE = '0' IMPORTING
ex_msgtab = gt_msgtab * EX_RESULT
= * EX_FIRST_TS = EXCEPTIONS
persist_error = 1 missing_parameter = 2
negative_time_range = 3 too_many_parameters = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH
sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. LOOP AT gt_msgtab
INTO gs_msgtab. CLEAR ex_message. CLEAR ex_msgstate.
CLEAR i_version. CREATE OBJECT ref_xms_persist.
TRY. CALL METHOD ref_xms_persist->read_msg_all
EXPORTING im_msgguid = ls_msgguid
im_pid = gs_msgtab-pid im_version = i_version
IMPORTING ex_message = ex_message
ex_msgstate = ex_msgstate. CATCH cx_xms_syserr_persist INTO
cx_ref. EXIT. ENDTRY.
CALL METHOD
ex_message->numberofattachments RECEIVING
size = size.
IF size IS NOT INITIAL. CALL METHOD
ex_message->getattachmentatindex EXPORTING
index = '1' RECEIVING resource =
resource. TRY. CALL METHOD
resource->getbinarydata RECEIVING
data = data. CATCH cx_xms_exception. CATCH
cx_xms_system_error. ENDTRY. IF ex_string IS NOT
INITIAL. MOVE ex_string TO comp_string. ENDIF.
CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING' EXPORTING
im_xstring = data IMPORTING ex_string =
ex_string.
IF i_version EQ '000'.
CONCATENATE ex_string payload INTO payload. ENDIF.
IF ex_string NE comp_string AND comp_string IS NOT INITIAL.
CONCATENATE ex_string payload INTO payload. CONTINUE.
ENDIF. ENDIF. i_version = i_version + 1 .
ENDLOOP. ENDIF. ENDFUNCTION. |
Rodrigo Alejandro Pertierra
is a SAP Netweaver Architect
HI.IF ANYONE HAVE A DOUBT PLEASE POST IT
Comment on this weblog
-
Z table type
2010-09-08 06:49:52 Rodrigo Alejandro Pertierra
Business Card
[Reply]
Hi, Sorry i forgot to include it in the blog. here it go.
Z_TT_SXMSMSGDSP is a table type which have a line type ZSXMSMSGDSP_TAB.
ZSXMSMSGDSP_TAB
field type
MANDT SYMANDT
MSGGUID SXMSMGUID
PID SXMSPID
MSGTYPE SXMSPMTYPE
MSGSTATE SXMSPMSTAT
QOSMODE SXMSQOS
EXETIMEST TIMESTAMPL
INITTIMEST TIMESTAMPL
SENDTIMEST TIMESTAMPL
SNDRGUID SXMSSNDRID
QUEUEGUID SXMSQID
EO_REFID SXMSREFID
EO_REFVAL SXMSREFVAL
ADAPT_TYP SXMSPSTYPE
ADAPT_STAT SXMSPASTAT
PARENTMSG SXMSMGUID
CHILDCOUNT NUMC3
CLIENT SYMANDT
ADMINUSER SYUNAME
ADMINUSER SYUNAME
GEN_ENTRY SXMSFLAG
MANUALSTAT SXMSFLAG
RETRYCOUNT NUMC3
ITFACTION SXMSITFACT
COMMITACT SXMSFLAG
EO_REFID_I SXMSREFID
EO_REFVL_I SXMSREFVAL
ADAPT_TP_I SXMSPSTYPE
REST_VERS SXMSLSQNBR
EO_REFID_O SXMSREFID
EO_REFVL_O SXMSREFVAL
QUEUEINT TRFCQNAM
REF_TO_MSG SXMSMGUID
REF_TO_REC_MSG SXMSMGUID
ACK_STATE SXMSPACKSTAT
REORG SXMSREORG
RND_NUMBER SXMSRNDNUM
VERS SXMSLSQNBR
SECURITY SXMSSECURITY
RETRYCOUNT_MAN SXMS_MAN_RETRYCO
USERINFOSTORAGE USERINFO_GUID
USERINFODATA USERINFO_GUID
OB_SYSTEM AIT_SNDR
OB_NS RM_OIFNS
OB_NAME RM_OIFNAME
OB_PARTY SXI_PARTY
OB_PARTY_TYPE SXI_PARTY_TYPE
OB_PARTY_AGENCY SXI_PARTY_AGENCY
IB_SYSTEM AIT_RCVR
IB_NS RM_IIFNS
IB_NAME RM_IIFNAME
IB_PARTY SXI_PARTY
IB_PARTY_TYPE SXI_PARTY_TYPE
IB_PARTY_AGENCY SXI_PARTY_AGENCY
JOB_ID SXMSJOB
STATUS SXMSMSGREFSTATUS
ERRCAT SXMSERRCAT
ERRCODE SXMSERRID
STATICON CHAR50
ADAPICON CHAR50
ACKSTATICON CHAR50
INITDATE SYDATUM
INITTIME SYUZEIT
EXEDATE SYDATUM
EXETIME SYUZEIT
SENDDATE SYDATUM
SENDTIME SYUZEIT
TYPETEXT CHAR20
VERSION SXMSLSQNBR
PELNAME SXMPELNAME
LOG_ICON CHAR4
INT_TIMEST TIMESTAMPL
INT_NUM NUMC3
LINECOLOR CHAR4
EXPANDED CHAR1
QUEUEICON CHAR50
QUEUESTATE SXMSPQSTAT
REORGICON CHAR50
JOBICON CHAR50
DIRPARTY SWFDXIDIRPTY
DIRSERVICE SWFDXIDIRSRV
TASK SWF_XI_WF_ID
XI_PROXY SWFDXMPNAM
WI_ID SWW_WIID
BULKMESSAGE CHAR4
Way to create an application
2010-09-06 12:42:21 Daniel Graversen
Business Card
[Reply]
Hi Rodrigo,
Quite an interesting application you have build. It seems to be quite easy to extend the app to get the information needed for external monitoring.
Way to create an application
2010-09-07 08:22:32 Rodrigo Alejandro Pertierra
Business Card
[Reply]
Hi,
you just said it. you can use those RFC to fetch the monitoring data from an external app. its oriented to functional or Help desk that does not have experience with SAP PI.
also if you have experience with WDP you can also get information of Channels to have and end-to-end external monitoring.
|
Showing messages 1 through 4 of 4.
|
|