===== Send Mail for Process Chains Run Status ===== 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 [[programming:abap:send_mail|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: * //RSPCM Variant// → the variant you defined in RSPCM, which contains the recipient list * //Staus to check// → the status list to include in check. Typically R,A,X,S,J 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 '' '' INTO char SEPARATED BY space. APPEND char TO wa_documents_body-content_text. CLEAR char. * Row 1 - Table title MOVE '' TO char. APPEND char TO wa_documents_body-content_text. CLEAR char. CONCATENATE '' INTO char SEPARATED BY space. APPEND char TO wa_documents_body-content_text. CLEAR char. MOVE '' TO char. APPEND char TO wa_documents_body-content_text. CLEAR char. * Row 2 - Table header MOVE '' TO char. APPEND char TO wa_documents_body-content_text. CLEAR char. CONCATENATE '' INTO char. APPEND char TO wa_documents_body-content_text. CLEAR char. CONCATENATE '' INTO char. APPEND char TO wa_documents_body-content_text. CLEAR char. CONCATENATE '' INTO char. APPEND char TO wa_documents_body-content_text. CLEAR char. CONCATENATE '' INTO char. APPEND char TO wa_documents_body-content_text. CLEAR char. CONCATENATE '' INTO char. APPEND char TO wa_documents_body-content_text. CLEAR char. MOVE '' 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 '' TO char. APPEND char TO wa_documents_body-content_text. CLEAR char. " Column 1 - Chain ID CONCATENATE '' 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 '' INTO char. APPEND char TO wa_documents_body-content_text. CLEAR char. " Column 3 - Date IF l_s_data-date IS NOT INITIAL. CONCATENATE '' INTO char. ELSE. CONCATENATE '' 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 '' INTO char. ELSE. CONCATENATE '' INTO char. ENDIF. APPEND char TO wa_documents_body-content_text. CLEAR char. " Column 5 - Description CONCATENATE '' INTO char. APPEND char TO wa_documents_body-content_text. CLEAR char. " Close Row MOVE '' TO char. APPEND char TO wa_documents_body-content_text. CLEAR char. ENDLOOP. * Close Table char = '
' '' w_descr_report_app '' '
' '' 'Chain' '' '' '' 'Status' '' '' '' 'Date' '' '' '' 'Time' '' '' '' 'Description' '' '
' l_s_data-chain '' v_status '' l_s_data-date+6(2) '.' l_s_data-date+4(2) '.' l_s_data-date(4) '' '' l_s_data-time(2) ':' l_s_data-time+2(2) ':' l_s_data-time+4(2) '' '' l_s_data-txtlg '
'. APPEND char TO wa_documents_body-content_text. CLEAR char. * Close HTML char = ''. 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