SAP后台JOB异常邮件提醒

REPORT zsdr0014 NO STANDARD PAGE HEADING LINE-SIZE 1023.

****************************************************************
* 定义
****************************************************************
TABLES:btcselect.

TYPES:
  BEGIN OF ty_jobs.
INCLUDE STRUCTURE tbtcjob_bk AS job.
TYPES:
  usage_time TYPE p DECIMALS 0,
  delay_time TYPE p DECIMALS 0,
  t_log      TYPE btc_t_job_log,
  END OF ty_jobs,
  tty_jobs TYPE STANDARD TABLE OF ty_jobs.

DATA:
  gt_jobs_all    TYPE tty_jobs,
  gt_list_fldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE,
  parain         LIKE btcselect.

****************************************************************
* 选择屏幕
****************************************************************
PARAMETERS:
  p_job  LIKE parain-jobname OBLIGATORY DEFAULT '*',
  p_user LIKE parain-username OBLIGATORY DEFAULT '*',
  p_prog LIKE parain-abapname.

*SELECT-OPTIONS:s_date FOR parain-from_date
*NO-EXTENSION DEFAULT sy-datum OBLIGATORY .

PARAMETERS:p_frdate TYPE sy-datlo DEFAULT sy-datum,
           p_frtime TYPE sy-timlo DEFAULT '000000',
           p_todate TYPE sy-datlo DEFAULT sy-datum,
           p_totime TYPE sy-timlo DEFAULT '235959'.

SELECTION-SCREEN BEGIN OF BLOCK bk1 WITH FRAME TITLE opt.
PARAMETERS:
  rd_mail TYPE char1 RADIOBUTTON GROUP rd1 DEFAULT 'X',
  rd_alv  TYPE char1 RADIOBUTTON GROUP rd1.

SELECTION-SCREEN END OF BLOCK bk1.

****************************************************************
* 初始化
****************************************************************
INITIALIZATION.
  %_p_job_%_app_%-text = '作业名称'.
  %_p_user_%_app_%-text = '用户名'.
  %_p_prog_%_app_%-text = 'ABAP程序名称'.
*  %_s_date_%_app_%-text = '作业日期'.
  %_rd_mail_%_app_%-text = '发送邮件'.
  %_rd_alv_%_app_%-text = 'ALV显示'.


  %_p_frdate_%_app_%-text = '开始日期'.
  %_p_frtime_%_app_%-text = '开始时间'.
  %_p_todate_%_app_%-text = '结束日期'.
  %_p_totime_%_app_%-text = '结束时间'.

  CLEAR:
    gt_jobs_all,
    gt_list_fldcat,
    parain.

****************************************************************
* START-OF-SELECTION.
****************************************************************
START-OF-SELECTION.
*---抓取数据
  PERFORM frm_getdata.
*---显示数据
  IF rd_alv IS NOT INITIAL.
    PERFORM frm_outdata.
  ENDIF.

  IF rd_mail IS NOT INITIAL.
*---发送邮件
    PERFORM frm_send_mail.
  ENDIF.
*&---------------------------------------------------------------------*
*&      Form  frm_getdata
*&---------------------------------------------------------------------*
*       抓取数据
*----------------------------------------------------------------------*
FORM frm_getdata.
  DATA:
    lt_jobs TYPE TABLE OF tbtcjob_bk WITH HEADER LINE,
    lt_log  TYPE TABLE OF tbtc5 WITH HEADER LINE.

  parain-jobname = p_job.
  parain-username = p_user.
  parain-abapname = p_prog .
  parain-from_date = p_frdate.
  parain-from_time = p_frtime.
  parain-to_date = p_todate .
  parain-to_time = p_totime .
*  parain-finished = 'X'.
  parain-aborted = 'X'.

  CALL FUNCTION 'BP_JOB_SELECT_SM37B'
    EXPORTING
      jobselect_dialog    = 'N'
      jobsel_param_in     = parain
    TABLES
      jobselect_joblist_b = lt_jobs
    EXCEPTIONS
      OTHERS              = 6.
  SORT lt_jobs BY jobname strtdate strttime.

  IF lt_jobs[] IS INITIAL.
    MESSAGE s145(bt).
  ELSE.
    LOOP AT lt_jobs INTO DATA(ls_jobs)
      WHERE authckman = sy-mandt.
      APPEND INITIAL LINE TO gt_jobs_all ASSIGNING FIELD-SYMBOL(<fs_jobs_all>).
      MOVE-CORRESPONDING ls_jobs TO <fs_jobs_all>-job.

      CALL METHOD cl_abap_tstmp=>td_subtract
        EXPORTING
          date1    = ls_jobs-enddate
          time1    = ls_jobs-endtime
          date2    = ls_jobs-strtdate
          time2    = ls_jobs-strttime
        IMPORTING
          res_secs = <fs_jobs_all>-usage_time.

      CALL METHOD cl_abap_tstmp=>td_subtract
        EXPORTING
          date1    = ls_jobs-sdlstrtdt
          time1    = ls_jobs-sdlstrttm
          date2    = ls_jobs-strtdate
          time2    = ls_jobs-strttime
        IMPORTING
          res_secs = <fs_jobs_all>-delay_time.

      IF ( <fs_jobs_all>-usage_time < 0 ).
        <fs_jobs_all>-usage_time = <fs_jobs_all>-usage_time * -1.
      ENDIF.
      IF ( <fs_jobs_all>-delay_time < 0 ).
        <fs_jobs_all>-delay_time = <fs_jobs_all>-delay_time * -1.
      ENDIF.

      CLEAR:lt_log[].
      CALL FUNCTION 'BP_JOBLOG_READ'
        EXPORTING
          client                = sy-mandt
          jobcount              = ls_jobs-jobcount
          joblog                = ls_jobs-joblog
          jobname               = ls_jobs-jobname
        TABLES
          joblogtbl             = lt_log[]
        EXCEPTIONS
          cant_read_joblog      = 1
          jobcount_missing      = 2
          joblog_does_not_exist = 3
          joblog_is_empty       = 4
          joblog_name_missing   = 5
          jobname_missing       = 6
          job_does_not_exist    = 7
          OTHERS                = 8.
      IF sy-subrc = 0.
        <fs_jobs_all>-t_log = lt_log[].

      ENDIF.

    ENDLOOP.
  ENDIF.
ENDFORM. "getdata

*&---------------------------------------------------------------------*
*&      Form  frm_outdata
*&---------------------------------------------------------------------*
*       显示内容
*----------------------------------------------------------------------*
FORM frm_outdata.
  DATA:
    ls_list_print  TYPE slis_print_alv,
    ls_list_layout TYPE slis_layout_alv,
    ls_list_struc  LIKE dd02l-tabname.

  DATA: BEGIN OF lt_list OCCURS 0,
          enterdate LIKE tbtc5-enterdate,
          entertime LIKE tbtc5-entertime,
          text      LIKE tbtc5-text,
          msgid     LIKE tbtc5-msgid,
          msgno     LIKE tbtc5-msgno,
          msgtype   LIKE tbtc5-msgtype,
        END OF lt_list.

  ls_list_layout-colwidth_optimize =  'X'.
  ls_list_layout-list_append = 'X'.
  ls_list_layout-no_keyfix = 'X'.
  ls_list_print-no_new_page  = 'X'.

  PERFORM frm_catlg_set USING:
        'ENTERDATE' '日期',
        'ENTERTIME' '时间',
        'TEXT'      '文本',
        'MSGID'     '消息类别',
        'MSGNO'     '消息号',
        'MSGTYPE'   '消息类型'.

  LOOP AT gt_jobs_all INTO DATA(ls_jobs).    
IF ls_jobs-status = 'F'.      
WRITE: / '作业:' ,   ls_jobs-jobname COLOR 5 INTENSIFIED ON ,               
'用户:' ,   ls_jobs-sdluname,               
'开始日期', ls_jobs-strtdate,               
'时间' ,    ls_jobs-strttime,               
'持续时间(s)', ls_jobs-usage_time,               
'延迟(s)', ls_jobs-delay_time.    
ELSE.      
WRITE:/ '作业:', ls_jobs-jobname COLOR 6 INTENSIFIED ON,              
'用户:', ls_jobs-sdluname,              
'开始日期',ls_jobs-strtdate,              
'时间', ls_jobs-strttime,              
'持续时间(s)', ls_jobs-usage_time,              
'延迟(s)', ls_jobs-delay_time.    
ENDIF.    
CLEAR lt_list[].    

LOOP AT ls_jobs-t_log INTO DATA(ls_log).      
MOVE-CORRESPONDING ls_log TO lt_list.      
APPEND lt_list.    
ENDLOOP.    
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'      
EXPORTING        it_fieldcat   
= gt_list_fldcat[]        is_layout     
= ls_list_layout        is_print      
= ls_list_print      
TABLES        t_outtab      
= lt_list[]      
EXCEPTIONS        program_error 
= 1        
OTHERS        = 2.    

FORMAT INTENSIFIED OFF.    

SKIP.  
ENDLOOP.

ENDFORM. "outdata

*&---------------------------------------------------------------------*
*&      Form  frm_catlg_set
*&---------------------------------------------------------------------*
*       发送邮件
*----------------------------------------------------------------------*
FORM frm_catlg_set USING p_field p_text.  
DATA: ls_fldcat TYPE slis_fieldcat_alv.  ls_fldcat

-fieldname = p_field.  ls_fldcat
-seltext_l =  p_text.  
APPEND ls_fldcat TO gt_list_fldcat.  
CLEAR ls_fldcat. "frm catig_set  ABAF
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_SEND_MAIL
*&---------------------------------------------------------------------*
*       发送邮件
*----------------------------------------------------------------------*
FORM frm_send_mail.  

DATA: lo_send_request TYPE REF TO cl_bcs,        lo_document     
TYPE REF TO cl_document_bcs,        recipient       
TYPE REF TO if_recipient_bcs.  

DATA: lv_sent_to_all TYPE char1,        lv_title       
TYPE so_obj_des,        lv_html_job    
TYPE string,        lv_html_str    
TYPE string,        lv_mailfrom    
TYPE adr6-smtp_addr,        sender         
TYPE REF TO if_sender_bcs,        lv_mailto      
TYPE adr6-smtp_addr,        lt_soli        
TYPE soli_tab.  

IF gt_jobs_all IS NOT INITIAL.
*---1.编辑邮件标题    lv_title 
= |今日SAP后台JOB异常:({ sy-datum }{ sy-uzeit })|.    lv_html_job 
= REDUCE string(    INIT ls_job 
TYPE string FOR ls_jobs_all IN gt_jobs_all[]    
NEXT ls_job = ls_job && |~<tr>| &&                              |
~<td>{ ls_jobs_all-jobname }</td>| &&                              |
~<td>{ ls_jobs_all-sdluname }</td>| &&                              |
~<td>{ ls_jobs_all-strtdate }/{ ls_jobs_all-strttime }</td>| &&                              |
~<td>{ ls_jobs_all-usage_time }</td>| &&                              |
~<td>{ ls_jobs_all-delay_time }</td>| &&                              |
~<td>~<table border="2">| &&                              |
~<tr>| &&                              |
~<th>消息文本</th>| &&                              |
~<th>消息ID</th>| &&                              |
~<th>消息号</th>| &&                              |
~<th>消息类型</th>| &&                              |
~</tr>| &&                              REDUCE string
(                               INIT ls_log 
TYPE string FOR ls_logs_all IN ls_jobs_all-t_log[]                               
NEXT ls_log = ls_log && |~<tr>| &&                                                         |
~<td>{ ls_logs_all-text }</td>| &&                                                         |
~<td>{ ls_logs_all-msgid }</td>| &&                                                         |
~<td>{ ls_logs_all-msgno }</td>| &&                                                         |
~<td>{ ls_logs_all-msgtype }</td>| &&                                                      |
~</tr>|                              
) &&                              |</table>
~</td>| &&                           |
~</tr>|                             
).    


CONCATENATE      
'<html>'      
'<body style=""><font size="2">'      

'各位相关人员:<br/>'      
'&emsp;<font color="red"><b>以下SAP的JOB发生了异常</b></font>'      
'<table border="1">'      
'<tr>'      
'  <th>作业</th>'      
'  <th>用户</th>'      
'  <th>开始时间</th>'      
'  <th>持续时间(s)</th>'      
'  <th>延迟(s)</th>'      
'  <th>详细日志消息</th>'      
'</tr>'   INTO lv_html_str SEPARATED BY '~'.    lv_html_str 

= lv_html_str && lv_html_job.    

CONCATENATE     lv_html_str     

'</table>'     

'</font><br/><font size="2"> 此邮件是系统自动发送,请勿回复。</br>'     
'如有问题请联系:<a href="mailto:long.chen@jcetglobal.com?subject=咨询">发送邮件</a></font>'     

'</body>'     
'</html>'   
INTO lv_html_str SEPARATED BY '~'.    


SPLIT lv_html_str AT '~' INTO TABLE lt_soli.

*---3.获取发送邮件地址    
SELECT *      
INTO TABLE @DATA(lt_sendto)      
FROM ztsdsend_mail      
WHERE zfunkbn  = 'T1' "IT自动邮件提醒        
AND actfg    = 'X'.    
CHECK lt_sendto IS NOT INITIAL.

*---4.设定邮件    
TRY .        lo_send_request 
= cl_bcs=>create_persistent( ).

*       创建待发送邮件主体        lo_document 
= cl_document_bcs=>create_document(            i_type        
= 'HTM'            i_subject     
= lv_title            i_text        
= lt_soli ).        lo_send_request

->set_document( lo_document ).

*       设定发送方        lv_mailfrom 
= 'jcet_sap_admin@jcetglobal.com'.        sender 
= cl_cam_address_bcs=>create_internet_address( lv_mailfrom ).        lo_send_request
->set_sender( i_sender = sender ).

*       设定发送方        
LOOP AT lt_sendto INTO DATA(ls_sendto).          lv_mailto 
= ls_sendto-mail_to.          recipient 
= cl_cam_address_bcs=>create_internet_address( i_address_string = lv_mailto ).          lo_send_request
->add_recipient( i_recipient = recipient ).        
ENDLOOP.

*       设定立刻发送        lo_send_request
->set_send_immediately( i_send_immediately = abap_true ).        lv_sent_to_all 
= lo_send_request->send( i_with_error_screen = 'X' ).

*       实际发送        
COMMIT WORK.        
IF lv_sent_to_all IS INITIAL.          
MESSAGE e001(zsd01) WITH '邮件发送失败'.        
ENDIF.      

CATCH cx_bcs INTO DATA(lo_bcs_exception).        
MESSAGE e001(zsd01) WITH lo_bcs_exception->get_longtext( ).    
ENDTRY.  
ELSE.    
MESSAGE s001(zsd01) WITH '无异常job'.  
ENDIF.
ENDFORM.

 

posted @ 2022-02-15 16:53  年轻的小菜鸟  阅读(385)  评论(0编辑  收藏  举报