User Tools

Site Tools


programming:sap_bw:rspc_mail_status

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 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 '<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
programming/sap_bw/rspc_mail_status.txt · Last modified: 2013/08/10 13:14 by IperCube