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/>' ' <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.
社会很单纯,复杂的是人
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏