* _______ _______ _______ _______ _______ _______ ______ _______ _______ ______ _______ * | _ | _ | _ | | | _ | || _ | _ | _ | | _ | * | |_| | |_| | |_| | _ | | |_| | _ | |_| | |_| | | || | |_| | * | | | | |_| | | | | | | | | |_||_| | * | | _ || | ___| _| | |_| | | _ || __ | | * | _ | |_| | _ | | | |_| _ | | _ | |_| | | | | _ | * |__| |__|_______|__| |__|___| |_______|__| |__|______||__| |__|_______|___| |_|__| |__| * www.abapcadabra.com * *------------------------------------------------------------------------------------------- * program : ZABAPCADABRA_MAIL_A_JOBLOG * title : Compose an email with the background log information for the * jpb of which this report is a step (typucally the last step) * functional area : Cross modules * environment : 4.7 * program Function : A simple add-on that can be used to port file-based output * to an email receiver. Subject, email body and receivers * can be set via the report selection screen. * The content/bofy of the email will be composed with a * short report on the background job, stating steps, times, * processing status. * Documentation : Search for "Mail-a-joblog" on AbapcadabrA.com * Previous version : This is the initial version * Developer name : Wim Maasdam * Development date : 31/05/2015 * Version : 0.1 *--------------------------------------------------------------------- * Change list: * Date Description * 31/05/2015 Initial release *--------------------------------------------------------------------- REPORT ZABAPCADABRA_MAIL_A_JOBLOG. TABLES: stxh, sscrfields. "Selection screen purpose only TYPE-POOLS: VRM. *--------------------------------------------------------------------- * C L A S S D E F I N I T I O N *--------------------------------------------------------------------- CLASS lcl_utilities DEFINITION. PUBLIC SECTION. CLASS-METHODS: f4_so10_texts CHANGING tdname TYPE stxh-tdname, call_so10_editor IMPORTING tdname TYPE stxh-tdname tdspras TYPE stxh-tdspras. ENDCLASS. "lcl_f4_processing DEFINITION CLASS lcl_mailman DEFINITION. PUBLIC SECTION. TYPES: BEGIN OF ty_receiver, email TYPE ad_smtpadr, name TYPE ad_smtpadr, END OF ty_receiver, BEGIN OF ty_content, line type char255, END OF ty_content. CLASS-DATA: gt_receivers TYPE STANDARD TABLE OF ty_receiver, gt_email_body TYPE BCSY_TEXT, gv_subject TYPE SOOD-OBJDES. CLASS-METHODS: set_subject IMPORTING subject TYPE ANY, read_body_text IMPORTING tdname TYPE stxh-tdname tdspras TYPE stxh-tdspras, set_receivers IMPORTING r1 TYPE ANY r2 TYPE ANY r3 TYPE ANY r4 TYPE ANY r5 TYPE ANY, send_email. ENDCLASS. *--------------------------------------------------------------------- * S E L E C T I O N - S C R E E N *--------------------------------------------------------------------- selection-SCREEN BEGIN OF LINE. selection-SCREEN COMMENT 1(23) lbl_10 FOR FIELD pa_subj. PARAMETERS: pa_subj TYPE C length 100 LOWER CASE visible length 56. selection-SCREEN END OF LINE. selection-SCREEN BEGIN OF LINE. selection-SCREEN COMMENT 1(23) lbl_11 FOR FIELD pa_body. PARAMETERS: pa_body TYPE stxh-tdname. SELECTION-SCREEN PUSHBUTTON (4) but_01 USER-COMMAND SO10. selection-SCREEN END OF LINE. selection-SCREEN BEGIN OF LINE. selection-SCREEN COMMENT 1(23) lbl_12 FOR FIELD pa_langu. PARAMETERS: pa_langu TYPE stxh-tdspras DEFAULT sy-langu. selection-SCREEN END OF LINE. selection-SCREEN SKIP. selection-SCREEN BEGIN OF LINE. selection-SCREEN COMMENT 1(23) lbl_13 FOR FIELD pa_rec1. PARAMETERS: pa_rec1 TYPE C length 100 LOWER CASE visible length 50 OBLIGATORY. selection-SCREEN END OF LINE. selection-SCREEN BEGIN OF LINE. selection-SCREEN POSITION 25. PARAMETERS: pa_rec2 TYPE C length 100 LOWER CASE visible length 50. selection-SCREEN END OF LINE. selection-SCREEN BEGIN OF LINE. selection-SCREEN POSITION 25. PARAMETERS: pa_rec3 TYPE C length 100 LOWER CASE visible length 50. selection-SCREEN END OF LINE. selection-SCREEN BEGIN OF LINE. selection-SCREEN POSITION 25. PARAMETERS: pa_rec4 TYPE C length 100 LOWER CASE visible length 50. selection-SCREEN END OF LINE. selection-SCREEN BEGIN OF LINE. selection-SCREEN POSITION 25. PARAMETERS: pa_rec5 TYPE C length 100 LOWER CASE visible length 50. selection-SCREEN END OF LINE. selection-SCREEN SKIP. selection-SCREEN BEGIN OF LINE. SELECTION-SCREEN PUSHBUTTON (70) lbl_abca USER-COMMAND ABAPCADABRA VISIBLE LENGTH 5. selection-SCREEN END OF LINE. AT selection-SCREEN ON VALUE-request FOR pa_body. lcl_utilities=>f4_so10_texts( CHANGING tdname = pa_body ). AT SELECTION-SCREEN. CASE sscrfields-ucomm. WHEN 'SO10'. lcl_utilities=>call_so10_editor( EXPORTING tdname = pa_body tdspras = pa_langu ). WHEN 'ABAPCADABRA'. CALL FUNCTION 'CALL_BROWSER' EXPORTING URL = 'http://abapcadabra.com/index.php/interfacing/528-mail-a-joblog' EXCEPTIONS OTHERS = 0. ENDCASE. *--------------------------------------------------------------------- * C L A S S I M P L E M E N T A T I O N *--------------------------------------------------------------------- CLASS lcl_utilities IMPLEMENTATION. METHOD f4_so10_texts. TYPES: BEGIN OF lty_columns, * List the fields you want to show in the F4 popup tdname TYPE stxh-tdname, END OF lty_columns. DATA: lt_columns TYPE STANDARD TABLE OF lty_columns. CLEAR: lt_columns[]. * Set selection values / note this is just for example purpose: SELECT tdname FROM stxh INTO TABLE lt_columns WHERE TDOBJECT = 'TEXT' AND TDID = 'ST ' AND TDSPRAS = pa_langu. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING retfield = 'TDNAME' dynpprog = SY-REPID dynpnr = '1000' dynprofield = 'PA_BODY' WINDOW_TITLE = 'Select a standard SO10 text' value_org = 'S' TABLES value_tab = lt_columns. ENDMETHOD. METHOD call_so10_editor. DATA: lt_bdcdata TYPE STANDARD TABLE OF bdcdata, lw_bdcdata TYPE bdcdata. * bdc_add 'X' 'PROGRAM_NAME' 'SCREEN NUMBER'. * bdc_add ' ' 'FIELDNAME' 'FIELDVALUE'. DEFINE bdc_add. CLEAR lw_bdcdata. lw_bdcdata-dynbegin = &1. IF &1 EQ 'X'. lw_bdcdata-PROGRAM = &2. lw_bdcdata-DYNPRO = &3. ELSE. lw_bdcdata-fnam = &2. lw_bdcdata-fval = &3. ENDIF. APPEND lw_bdcdata TO lt_bdcdata. END-OF-DEFINITION. CLEAR lt_bdcdata. bdc_add: 'X' 'SAPMSSCE' '1100', ' ' 'RSSCE-TDNAME' tdname, ' ' 'RSSCE-TDSPRAS' tdspras. CALL TRANSACTION 'SO10' USING lt_bdcdata MODE 'E'. ENDMETHOD. ENDCLASS. "lcl_f4_processing IMPLEMENTATION CLASS lcl_mailman IMPLEMENTATION. METHOD set_subject. IF NOT subject IS INITIAL. gv_subject = subject. ELSE. CONCATENATE 'Message from SAP' sy-sysid 'client' sy-mandt INTO gv_subject SEPARATED BY space. ENDIF. ENDMETHOD. METHOD read_body_text. DATA: lt_lines TYPE STANDARD TABLE OF TLINE, lw_tline TYPE TLINE, lw_TBTCM type TBTCM, lt_JOBLOG type standard table of TBTC5, lw_JOBLOG type TBTC5. IF NOT tdname IS INITIAL. * Read the standard SO10 longtext CLEAR: lt_lines[]. CALL FUNCTION 'READ_TEXT' EXPORTING ID = 'ST ' LANGUAGE = tdspras NAME = tdname OBJECT = 'TEXT' TABLES LINES = lt_lines EXCEPTIONS OTHERS = 0. LOOP AT lt_lines INTO lw_tline. APPEND lw_tline-tdline TO gt_email_body. ENDLOOP. ENDIF. * Gather information on the background job: CALL FUNCTION 'GET_JOB_RUNTIME_INFO' IMPORTING EVENTID = lw_TBTCM-EVENTID EVENTPARM = lw_TBTCM-EVENTPARM EXTERNAL_PROGRAM_ACTIVE = lw_TBTCM-XPGACTIVE JOBCOUNT = lw_TBTCM-JOBCOUNT JOBNAME = lw_TBTCM-JOBNAME STEPCOUNT = lw_TBTCM-STEPCOUNT EXCEPTIONS NO_RUNTIME_INFO = 1 OTHERS = 2. IF sy-subrc = 1. APPEND space TO gt_email_body. APPEND 'No runtime information available on the background job' TO gt_email_body. ELSE. * Details on the backround job: CONCATENATE 'Jobname .:' lw_TBTCM-JOBNAME INTO lw_tline-tdline SEPARATED BY space. APPEND lw_tline-tdline TO gt_email_body. CONCATENATE 'ID .:' lw_TBTCM-JOBCOUNT INTO lw_tline-tdline SEPARATED BY space. APPEND lw_tline-tdline TO gt_email_body. write lw_TBTCM-STEPCOUNT to lw_tline-tdline LEFT-JUSTIFIED. CONCATENATE 'Stepcount .:' lw_tline-tdline INTO lw_tline-tdline SEPARATED BY space. APPEND lw_tline-tdline TO gt_email_body. APPEND space TO gt_email_body. APPEND 'Joblog messages:' TO gt_email_body. * Get the joblog for this job CALL FUNCTION 'BP_JOBLOG_READ' EXPORTING JOBCOUNT = lw_TBTCM-JOBCOUNT JOBLOG = ' ' JOBNAME = lw_TBTCM-JOBNAME * LINES = * DIRECTION = TABLES joblogtbl = lt_JOBLOG EXCEPTIONS OTHERS = 1. IF sy-subrc = 1. APPEND space TO gt_email_body. APPEND 'Joblog could not be read' TO gt_email_body. ELSE. loop at lt_JOBLOG into lw_joblog. * Timestamp: write lw_joblog-ENTERDATE to lw_tline-tdline dd/mm/yyyy. write lw_joblog-ENTERTIME to lw_tline-tdline+11 using edit mask '__:__:__'. APPEND lw_tline-tdline TO gt_email_body. * Message: MESSAGE ID lw_joblog-msgid TYPE lw_joblog-msgtype NUMBER lw_joblog-msgno INTO lw_tline-tdline WITH lw_joblog-msgv1 lw_joblog-msgv2 lw_joblog-msgv3 lw_joblog-msgv4. APPEND lw_tline-tdline TO gt_email_body. endloop. ENDIF. ENDIF. CONCATENATE 'This email was created in SAP' sy-sysid 'client' sy-mandt INTO lw_tline-tdline SEPARATED BY space. APPEND space TO gt_email_body. APPEND lw_tline-tdline TO gt_email_body. ENDMETHOD. METHOD set_receivers. DATA: lw_receiver TYPE ty_receiver. lw_receiver-email = r1. APPEND lw_receiver TO gt_receivers. IF NOT R2 IS INITIAL. lw_receiver-email = r2. APPEND lw_receiver TO gt_receivers. ENDIF. IF NOT R3 IS INITIAL. lw_receiver-email = r3. APPEND lw_receiver TO gt_receivers. ENDIF. IF NOT R4 IS INITIAL. lw_receiver-email = r4. APPEND lw_receiver TO gt_receivers. ENDIF. IF NOT R5 IS INITIAL. lw_receiver-email = r5. APPEND lw_receiver TO gt_receivers. ENDIF. ENDMETHOD. METHOD send_email. * local objects - referencing classes DATA: lo_send_request TYPE REF TO cl_bcs, lo_document TYPE REF TO cl_document_bcs, lo_receiver TYPE REF TO cl_cam_address_bcs, lo_sender TYPE REF TO cl_sapuser_bcs, * pool of help variables lv_status TYPE os_boolean, lv_length_hlp TYPE I, lv_length_att TYPE sood-objlen, lt_solix TYPE solix_tab, lw_receiver TYPE ty_receiver. TRY. * Create a request handler lo_send_request = cl_bcs=>create_persistent( ). * Link the body text to the email (document type RAW, importance 0 * and sensitivity F, all defaults) cl_document_bcs=>create_from_text( EXPORTING i_text = gt_email_body i_subject = gv_subject RECEIVING result = lo_document ). * Set the document on the request lo_send_request->set_document( EXPORTING i_document = lo_document ). * Set the receivers LOOP AT gt_receivers INTO lw_receiver. cl_cam_address_bcs=>create_internet_address( EXPORTING i_address_string = lw_receiver-email i_address_name = lw_receiver-name RECEIVING result = lo_receiver ). lo_send_request->add_recipient( EXPORTING i_recipient = lo_receiver ). ENDLOOP. * Set the sender lo_sender = cl_sapuser_bcs=>create( sy-uname ). lo_send_request->set_sender( EXPORTING i_sender = lo_sender ). lo_send_request->set_priority( '5' ). "High=1 to Low=9 * Send the email lv_status = lo_send_request->send( ). CATCH cx_send_req_bcs. CATCH cx_document_bcs. CATCH cx_address_bcs. ENDTRY. IF lv_status = 'X'. *------------------------------ COMMIT WORK. *------------------------------ message 'An email has been created (check SOST)' type 'S'. ENDIF. ENDMETHOD. "send_email ENDCLASS. *--------------------------------------------------------------------- * I N I T I T A L I Z A T I O N *--------------------------------------------------------------------- INITIALIZATION. * All texts for this report have been set up as hard-coded texts (no use * of the report text-pool). Reason: easy copying of report source code. lbl_abca = '@N5\QMore on AbapcadabrA.com@'. lbl_10 = 'Subject'. lbl_11 = 'Body text'. lbl_12 = 'Language'. lbl_13 = 'Receiver(s)'. but_01 = '@3I@'. *--------------------------------------------------------------------- * S T A R T - O F - S E L E C T I O N *--------------------------------------------------------------------- start-OF-selection. lcl_mailman=>set_subject( EXPORTING subject = pa_subj ). lcl_mailman=>read_body_text( EXPORTING tdname = pa_body tdspras = pa_langu ). lcl_mailman=>set_receivers( EXPORTING r1 = pa_rec1 r2 = pa_rec2 r3 = pa_rec3 r4 = pa_rec4 r5 = pa_rec5 ). lcl_mailman=>send_email( ).