Linux
Programming
Misc
Linux
Programming
Misc
Monitoring the run status of the BW process chains it's a mandatory activity for a rapid problem solution.
In BW this is made using the transaction RSPCM, which allows to define the process chains under monitoring and the list of mail recipient to be notified.
But the list that the system send is nearly unreadable.
I wrote this replacement which sends a clear and readable email only for chain in a critical status (the list as parameter)
The report prepares the mail then uses the General purpose Send Mail function to send the mail.
Just unschedule any standard job and schedule this one daily in the morning, using the parameters:
Here the source code:
*&---------------------------------------------------------------------* *& Report Z_RSPC_MAIL_STATUS *&---------------------------------------------------------------------* * Send Mail for Process Chains Run Status - Schedule daily * * Based on table RSPC_MONITOR used by transaction RSPCM *---------------------------------------------------------------------* * Status values * * R Ended with errors * G Successfully completed * F Completed * A Active * X Canceled * P Planned * S Skipped at restart * Q Released * Y Ready * Undefined * J Framework Error Upon Completion (e.g. follow-on job missing) *---------------------------------------------------------------------* * IperCube 12.2009 *---------------------------------------------------------------------* REPORT z_rspc_mail_status. TYPES: BEGIN OF s_data, icon TYPE icon_d, status TYPE rspc_state, wished TYPE rspc_state, date TYPE sydatum, time TYPE syuzeit, chain TYPE rspc_chain, txtlg TYPE rstxtlg, log TYPE rspc_logid, END OF s_data, t_data TYPE TABLE OF s_data. DATA: g_t_data TYPE t_data. DATA: l_s_data TYPE s_data. DATA: tab_rspclogchain TYPE SORTED TABLE OF rspclogchain WITH HEADER LINE WITH NON-UNIQUE KEY chain_id. DATA: tab_rspc_monitor TYPE TABLE OF rspc_monitor WITH HEADER LINE. DATA: char TYPE soli, wa_documents_body TYPE zes_keg_email_documents WITH HEADER LINE, wa_recipients TYPE zes_keg_email_recipients WITH HEADER LINE, documents TYPE zes_keg_email_documents, recipients TYPE zes_keg_email_recipients. DATA: w_descr_report_app LIKE zeci_report-kmlink. DATA: tab_recipient TYPE TABLE OF ad_smtpadr WITH HEADER LINE. DATA tab_dd07v TYPE TABLE OF dd07v WITH HEADER LINE. DATA: v_status TYPE string. DATA: v_txtlg TYPE rstxtlg. DATA: v_back_color TYPE string. *********************************************************************** * Parameters *********************************************************************** * RSPCM Variant PARAMETERS p_varian TYPE rspcvariant-variante OBLIGATORY DEFAULT 'RSPC_MONITOR_MAIL'. *Status to check SELECT-OPTIONS s_status FOR l_s_data-status NO INTERVALS. *********************************************************************** START-OF-SELECTION. *********************************************************************** * Read Monitored Chains SELECT * FROM rspc_monitor INTO TABLE tab_rspc_monitor. * Get Last status of Chains LOOP AT tab_rspc_monitor. l_s_data-chain = tab_rspc_monitor-chain_id. l_s_data-wished = tab_rspc_monitor-wished_status. APPEND l_s_data TO g_t_data. ENDLOOP. * Get Chains Info LOOP AT g_t_data INTO l_s_data. PERFORM info CHANGING l_s_data. MODIFY g_t_data FROM l_s_data. ENDLOOP. * Delete Entries for excluded Status DELETE g_t_data WHERE status NOT IN s_status. SORT g_t_data BY chain. * Send e-mail IF g_t_data[] IS NOT INITIAL. * Use the same recipients of SAP report RSPC_MONITOR DATA tab_rspcvariant TYPE TABLE OF rspcvariant WITH HEADER LINE. SELECT * FROM rspcvariant INTO TABLE tab_rspcvariant WHERE type = 'MAIL' AND variante = p_varian AND objvers = 'A' AND fnam = 'ADDRESSSTRING'. LOOP AT tab_rspcvariant. IF tab_rspcvariant-low IS NOT INITIAL. wa_recipients-c_address = tab_rspcvariant-low. APPEND wa_recipients TO recipients. ENDIF. ENDLOOP. * HTML Start DATA: client_name TYPE mtext_d. SELECT SINGLE mtext FROM t000 INTO client_name WHERE mandt = sy-mandt. CONCATENATE 'System' sy-sysid '-' client_name ': Daily Process Chain Run Status' INTO w_descr_report_app SEPARATED BY space. MOVE 'HTM' TO wa_documents_body-type. MOVE w_descr_report_app TO wa_documents_body-subject. CONCATENATE '<HTML><STYLE type="text/css">td {font-family: Verdana}td {font-size: 75%}</style><body>' '<table cellpadding="5" cellspacing="1" border="1">' INTO char SEPARATED BY space. APPEND char TO wa_documents_body-content_text. CLEAR char. * Row 1 - Table title MOVE '<tr bgcolor="#808080">' TO char. APPEND char TO wa_documents_body-content_text. CLEAR char. CONCATENATE '<td colspan=5 align=center>' '<font size="4" color="#FFFFFF">' w_descr_report_app '</font>' '</td>' INTO char SEPARATED BY space. APPEND char TO wa_documents_body-content_text. CLEAR char. MOVE '</tr>' TO char. APPEND char TO wa_documents_body-content_text. CLEAR char. * Row 2 - Table header MOVE '<tr bgcolor="#CCCCCC">' TO char. APPEND char TO wa_documents_body-content_text. CLEAR char. CONCATENATE '<td align=center>' '<font size="2">' 'Chain' '</font>' '</td>' INTO char. APPEND char TO wa_documents_body-content_text. CLEAR char. CONCATENATE '<td align=center>' '<font size="2">' 'Status' '</font>' '</td>' INTO char. APPEND char TO wa_documents_body-content_text. CLEAR char. CONCATENATE '<td align=center>' '<font size="2">' 'Date' '</font>' '</td>' INTO char. APPEND char TO wa_documents_body-content_text. CLEAR char. CONCATENATE '<td align=center>' '<font size="2">' 'Time' '</font>' '</td>' INTO char. APPEND char TO wa_documents_body-content_text. CLEAR char. CONCATENATE '<td align=center>' '<font size="2">' 'Description' '</font>' '</td>' INTO char. APPEND char TO wa_documents_body-content_text. CLEAR char. MOVE '</tr>' TO char. APPEND char TO wa_documents_body-content_text. CLEAR char. * Create Table LOOP AT g_t_data INTO l_s_data. " Get Status description CALL FUNCTION 'DD_DOMVALUES_GET' EXPORTING domname = 'RSPC_STATE' text = 'X' langu = 'E' TABLES dd07v_tab = tab_dd07v. LOOP AT tab_dd07v WHERE domvalue_l = l_s_data-status. v_status = tab_dd07v-ddtext. ENDLOOP. " Open Row MOVE '<tr bgcolor="#FFFFFF">' TO char. APPEND char TO wa_documents_body-content_text. CLEAR char. " Column 1 - Chain ID CONCATENATE '<td>' l_s_data-chain '</td>' INTO char. APPEND char TO wa_documents_body-content_text. CLEAR char. " Column 2 - Status CASE l_s_data-status. WHEN 'G' or 'F'. v_back_color = '#33CC33'. "Completed, just in case you include them WHEN 'R' or 'J'. v_back_color = '#FF6600'. "Error WHEN 'A' OR 'X'. v_back_color = '#FFFF00'. "Active, Canceled WHEN OTHERS. v_back_color = '#FFFFFF'. ENDCASE. CONCATENATE '<td bgcolor="' v_back_color '">' v_status '</td>' INTO char. APPEND char TO wa_documents_body-content_text. CLEAR char. " Column 3 - Date IF l_s_data-date IS NOT INITIAL. CONCATENATE '<td>' l_s_data-date+6(2) '.' l_s_data-date+4(2) '.' l_s_data-date(4) '</td>' INTO char. ELSE. CONCATENATE '<td>' '</td>' INTO char. ENDIF. APPEND char TO wa_documents_body-content_text. CLEAR char. " Column 4 - Time IF l_s_data-time IS NOT INITIAL. CONCATENATE '<td>' l_s_data-time(2) ':' l_s_data-time+2(2) ':' l_s_data-time+4(2) '</td>' INTO char. ELSE. CONCATENATE '<td>' '</td>' INTO char. ENDIF. APPEND char TO wa_documents_body-content_text. CLEAR char. " Column 5 - Description CONCATENATE '<td>' l_s_data-txtlg '</td>' INTO char. APPEND char TO wa_documents_body-content_text. CLEAR char. " Close Row MOVE '</tr>' TO char. APPEND char TO wa_documents_body-content_text. CLEAR char. ENDLOOP. * Close Table char = '</table>'. APPEND char TO wa_documents_body-content_text. CLEAR char. * Close HTML char = '</body></html>'. APPEND char TO wa_documents_body-content_text. CLEAR char. ENDIF. * Send Mail APPEND wa_documents_body TO documents. CLEAR: wa_documents_body, char . REFRESH: wa_documents_body . TRY. CALL FUNCTION 'Z_SEND_MAIL' EXPORTING requested_status = 'E' documents = documents recipients = recipients. CATCH cx_bcs. ENDTRY. REFRESH: documents, recipients. CLEAR: documents, recipients. *&---------------------------------------------------------------------* *& Form info *&---------------------------------------------------------------------* FORM info CHANGING l_s_data TYPE s_data. "Get Chain description SELECT SINGLE txtlg FROM rspcchaint INTO l_s_data-txtlg WHERE chain_id = l_s_data-chain AND langu = sy-langu. IF sy-subrc <> 0. SELECT SINGLE txtlg FROM rspcchaint INTO l_s_data-txtlg WHERE chain_id = l_s_data-chain. ENDIF. "Get last log SELECT MAX( datum ) FROM rspclogchain INTO l_s_data-date WHERE chain_id = l_s_data-chain. SELECT MAX( zeit ) FROM rspclogchain INTO l_s_data-time WHERE chain_id = l_s_data-chain AND datum = l_s_data-date. SELECT SINGLE log_id INTO l_s_data-log FROM rspclogchain WHERE chain_id = l_s_data-chain AND datum = l_s_data-date AND zeit = l_s_data-time. IF NOT l_s_data-log IS INITIAL. " Convert to Local Time CALL FUNCTION 'RSSM_GET_TIME' EXPORTING i_datum_utc = l_s_data-date i_uzeit_utc = l_s_data-time IMPORTING e_datum_loc = l_s_data-date e_uzeit_loc = l_s_data-time EXCEPTIONS failed = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. " Get Status CALL FUNCTION 'RSPC_API_CHAIN_GET_STATUS' EXPORTING i_chain = l_s_data-chain i_logid = l_s_data-log IMPORTING e_status = l_s_data-status. ENDIF. ENDFORM. " info