Convert Spool request to PDF and send as e-mail
The code below demonstrates how to retrieve a spool request and email it as a PDF document. Please note to process a spool request the program can be executed in background or foreground. Because of the additional functionality to allow this to work in both background and foreground it has made it a little more confusing so you might want to start by looking at the background only program. Also see transaction SCOT for SAPConnect administration.
*&-------------------------------------------------------------* *& Report ZSPOOLTOPDF2 * *& * *&-------------------------------------------------------------* *& Converts spool request into PDF document and emails it to * *& recipicant. * *& * *& Execution * *& --------- * *& This program can be run in background or online and a spool * *& request will still be created * *&-------------------------------------------------------------* REPORT zspooltopdf2. PARAMETER: p_email1 LIKE somlreci1-receiver DEFAULT 'abap@SAP Development', p_sender LIKE somlreci1-receiver DEFAULT 'abap@SAP Development', p_delspl AS CHECKBOX, p_online no-display. *DATA DECLARATION DATA: gd_recsize TYPE i. * Spool IDs TYPES: BEGIN OF t_tbtcp. INCLUDE STRUCTURE tbtcp. TYPES: END OF t_tbtcp. DATA: it_tbtcp TYPE STANDARD TABLE OF t_tbtcp INITIAL SIZE 0, wa_tbtcp TYPE t_tbtcp. * Job Runtime Parameters DATA: gd_eventid LIKE tbtcm-eventid, gd_eventparm LIKE tbtcm-eventparm, gd_external_program_active LIKE tbtcm-xpgactive, gd_jobcount LIKE tbtcm-jobcount, gd_jobname LIKE tbtcm-jobname, gd_stepcount LIKE tbtcm-stepcount, gd_error TYPE sy-subrc, gd_reciever TYPE sy-subrc. DATA: w_recsize TYPE i, w_spool_nr like sy-spono. * %_print LIKE pri_params. DATA: gd_subject LIKE sodocchgi1-obj_descr, it_mess_bod LIKE solisti1 OCCURS 0 WITH HEADER LINE, it_mess_att LIKE solisti1 OCCURS 0 WITH HEADER LINE, gd_sender_type LIKE soextreci1-adr_typ, gd_attachment_desc TYPE so_obj_nam, gd_attachment_name TYPE so_obj_des. * Spool to PDF conversions DATA: gd_spool_nr LIKE tsp01-rqident, gd_destination LIKE rlgrap-filename, gd_bytecount LIKE tst01-dsize, gd_buffer TYPE string. * Binary store for PDF DATA: BEGIN OF it_pdf_output OCCURS 0. INCLUDE STRUCTURE tline. DATA: END OF it_pdf_output. CONSTANTS: c_dev LIKE sy-sysid VALUE 'DEV', c_no(1) TYPE c VALUE ' ', c_device(4) TYPE c VALUE 'LOCL'. ************************************************************************ *START-OF-SELECTION. START-OF-SELECTION. * Write statement to represent report output. Spool request is created * if write statement is executed in background. This could also be an * ALV grid which would be converted to PDF without any extra effort WRITE 'Hello World'. new-page. commit work. new-page print off. If p_online = 'X'. * Processing performed when program calls itself when run online gd_spool_nr = sy-spono. EXPORT gd_spool_nr TO MEMORY ID 'SPOOLTOPDF'. EXIT. endif. IF sy-batch EQ 'X'. PERFORM get_job_details. PERFORM obtain_spool_id. ELSE. gd_spool_nr = sy-spono. ************************************ * If executed online, it submits a program to perform the write statements * instructing it to create a spool request, this could be another program * which just performs the write statements and then exports sy-spono * to memory. But in this example it calls itself passing X to parameter * p_online, which takes it down an alternative procesing path. submit ZSPOOLTOPDF2 with p_online = 'X' to sap-spool spool parameters %_print * archive parameters %_print without spool dynpro and return. ************************************ ENDIF. * Get spool id from program called above IMPORT gd_spool_nr FROM MEMORY ID 'SPOOLTOPDF'. PERFORM convert_spool_to_pdf. PERFORM process_email. if p_delspl EQ 'X'. PERFORM delete_spool. endif. IF sy-sysid = c_dev. wait up to 5 seconds. SUBMIT rsconn01 WITH mode = 'INT' WITH output = 'X' AND RETURN. ENDIF. *---------------------------------------------------------------------* * FORM obtain_spool_id * *---------------------------------------------------------------------* FORM obtain_spool_id. CHECK NOT ( gd_jobname IS INITIAL ). CHECK NOT ( gd_jobcount IS INITIAL ). SELECT * FROM tbtcp INTO TABLE it_tbtcp WHERE jobname = gd_jobname AND jobcount = gd_jobcount AND stepcount = gd_stepcount AND listident <> '0000000000' ORDER BY jobname jobcount stepcount. READ TABLE it_tbtcp INTO wa_tbtcp INDEX 1. IF sy-subrc = 0. message s004(zdd) with gd_spool_nr. gd_spool_nr = wa_tbtcp-listident. MESSAGE s004(zdd) WITH gd_spool_nr. ELSE. MESSAGE s005(zdd). ENDIF. ENDFORM. *---------------------------------------------------------------------* * FORM get_job_details * *---------------------------------------------------------------------* FORM get_job_details. * Get current job details CALL FUNCTION 'GET_JOB_RUNTIME_INFO' IMPORTING eventid = gd_eventid eventparm = gd_eventparm external_program_active = gd_external_program_active jobcount = gd_jobcount jobname = gd_jobname stepcount = gd_stepcount EXCEPTIONS no_runtime_info = 1 OTHERS = 2. ENDFORM. *---------------------------------------------------------------------* * FORM convert_spool_to_pdf * *---------------------------------------------------------------------* FORM convert_spool_to_pdf. CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF' EXPORTING src_spoolid = gd_spool_nr no_dialog = c_no dst_device = c_device IMPORTING pdf_bytecount = gd_bytecount TABLES pdf = it_pdf_output EXCEPTIONS err_no_abap_spooljob = 1 err_no_spooljob = 2 err_no_permission = 3 err_conv_not_possible = 4 err_bad_destdevice = 5 user_cancelled = 6 err_spoolerror = 7 err_temseerror = 8 err_btcjob_open_failed = 9 err_btcjob_submit_failed = 10 err_btcjob_close_failed = 11 OTHERS = 12. CHECK sy-subrc = 0. * Transfer the 132-long strings to 255-long strings LOOP AT it_pdf_output. TRANSLATE it_pdf_output USING ' ~'. CONCATENATE gd_buffer it_pdf_output INTO gd_buffer. ENDLOOP. TRANSLATE gd_buffer USING '~ '. DO. it_mess_att = gd_buffer. APPEND it_mess_att. SHIFT gd_buffer LEFT BY 255 PLACES. IF gd_buffer IS INITIAL. EXIT. ENDIF. ENDDO. ENDFORM. *---------------------------------------------------------------------* * FORM process_email * *---------------------------------------------------------------------* FORM process_email. DESCRIBE TABLE it_mess_att LINES gd_recsize. CHECK gd_recsize > 0. PERFORM send_email USING p_email1. * perform send_email using p_email2. ENDFORM. *---------------------------------------------------------------------* * FORM send_email * *---------------------------------------------------------------------* * --> p_email * *---------------------------------------------------------------------* FORM send_email USING p_email. CHECK NOT ( p_email IS INITIAL ). REFRESH it_mess_bod. * Default subject matter gd_subject = 'Subject'. gd_attachment_desc = 'Attachname'. * CONCATENATE 'attach_name' ' ' INTO gd_attachment_name. it_mess_bod = 'Message Body text, line 1'. APPEND it_mess_bod. it_mess_bod = 'Message Body text, line 2...'. APPEND it_mess_bod. * If no sender specified - default blank IF p_sender EQ space. gd_sender_type = space. ELSE. gd_sender_type = 'INT'. ENDIF. * Send file by email as .xls speadsheet PERFORM send_file_as_email_attachment tables it_mess_bod it_mess_att using p_email 'Example .xls documnet attachment' 'PDF' gd_attachment_name gd_attachment_desc p_sender gd_sender_type changing gd_error gd_reciever. ENDFORM. *---------------------------------------------------------------------* * FORM delete_spool * *---------------------------------------------------------------------* FORM delete_spool. DATA: ld_spool_nr TYPE tsp01_sp0r-rqid_char. ld_spool_nr = gd_spool_nr. CHECK p_delspl <> c_no. CALL FUNCTION 'RSPO_R_RDELETE_SPOOLREQ' EXPORTING spoolid = ld_spool_nr. ENDFORM. *&---------------------------------------------------------------------* *& Form SEND_FILE_AS_EMAIL_ATTACHMENT *&---------------------------------------------------------------------* * Send email *----------------------------------------------------------------------* FORM send_file_as_email_attachment tables it_message it_attach using p_email p_mtitle p_format p_filename p_attdescription p_sender_address p_sender_addres_type changing p_error p_reciever. DATA: ld_error TYPE sy-subrc, ld_reciever TYPE sy-subrc, ld_mtitle LIKE sodocchgi1-obj_descr, ld_email LIKE somlreci1-receiver, ld_format TYPE so_obj_tp , ld_attdescription TYPE so_obj_nam , ld_attfilename TYPE so_obj_des , ld_sender_address LIKE soextreci1-receiver, ld_sender_address_type LIKE soextreci1-adr_typ, ld_receiver LIKE sy-subrc. data: t_packing_list like sopcklsti1 occurs 0 with header line, t_contents like solisti1 occurs 0 with header line, t_receivers like somlreci1 occurs 0 with header line, t_attachment like solisti1 occurs 0 with header line, t_object_header like solisti1 occurs 0 with header line, w_cnt type i, w_sent_all(1) type c, w_doc_data like sodocchgi1. ld_email = p_email. ld_mtitle = p_mtitle. ld_format = p_format. ld_attdescription = p_attdescription. ld_attfilename = p_filename. ld_sender_address = p_sender_address. ld_sender_address_type = p_sender_addres_type. * Fill the document data. w_doc_data-doc_size = 1. * Populate the subject/generic message attributes w_doc_data-obj_langu = sy-langu. w_doc_data-obj_name = 'SAPRPT'. w_doc_data-obj_descr = ld_mtitle . w_doc_data-sensitivty = 'F'. * Fill the document data and get size of attachment CLEAR w_doc_data. READ TABLE it_attach INDEX w_cnt. w_doc_data-doc_size = ( w_cnt - 1 ) * 255 + STRLEN( it_attach ). w_doc_data-obj_langu = sy-langu. w_doc_data-obj_name = 'SAPRPT'. w_doc_data-obj_descr = ld_mtitle. w_doc_data-sensitivty = 'F'. CLEAR t_attachment. REFRESH t_attachment. t_attachment[] = it_attach[]. * Describe the body of the message CLEAR t_packing_list. REFRESH t_packing_list. t_packing_list-transf_bin = space. t_packing_list-head_start = 1. t_packing_list-head_num = 0. t_packing_list-body_start = 1. DESCRIBE TABLE it_message LINES t_packing_list-body_num. t_packing_list-doc_type = 'RAW'. APPEND t_packing_list. * Create attachment notification t_packing_list-transf_bin = 'X'. t_packing_list-head_start = 1. t_packing_list-head_num = 1. t_packing_list-body_start = 1. DESCRIBE TABLE t_attachment LINES t_packing_list-body_num. t_packing_list-doc_type = ld_format. t_packing_list-obj_descr = ld_attdescription. t_packing_list-obj_name = ld_attfilename. t_packing_list-doc_size = t_packing_list-body_num * 255. APPEND t_packing_list. * Add the recipients email address CLEAR t_receivers. REFRESH t_receivers. t_receivers-receiver = ld_email. t_receivers-rec_type = 'U'. t_receivers-com_type = 'INT'. t_receivers-notif_del = 'X'. t_receivers-notif_ndel = 'X'. APPEND t_receivers. CALL FUNCTION 'SO_DOCUMENT_SEND_API1' EXPORTING document_data = w_doc_data put_in_outbox = 'X' sender_address = ld_sender_address sender_address_type = ld_sender_address_type commit_work = 'X' IMPORTING sent_to_all = w_sent_all TABLES packing_list = t_packing_list contents_bin = t_attachment contents_txt = it_message receivers = t_receivers EXCEPTIONS too_many_receivers = 1 document_not_sent = 2 document_type_not_exist = 3 operation_no_authorization = 4 parameter_error = 5 x_error = 6 enqueue_error = 7 OTHERS = 8. * Populate zerror return code ld_error = sy-subrc. * Populate zreceiver return code LOOP AT t_receivers. ld_receiver = t_receivers-retrn_code. ENDLOOP. ENDFORM.
Related Articles
ALV grid reports using the object methods functionality
ALV TREE Example ABAP code and information for creating ALV tree based reports
SAP Dynamic documents in ABAP objects
SAP dynamic document example screens
ABAP report Progress indicator - When added also Stops report timeout
SAP progress indicator bar to count number of records processed within ABAP report and stop timeout
SAP percentage complete progress indicator bar for your ABAP reports
Prevent ABAP report timeout by Reseting the SAP runtime value using TH_REDISPATCH
ABAP Reporting - Example code and information on various areas of ABAP reporting
ABAP Automatic refresh report to retrieve real time live data from SAP database
Automatic Refresh Report - periodically refreshes results
Capture ABAP report using WRITE statement to internal table with SAP
Write report straight to printer
Convert Spool request to PDF and send as e-mail
Execute ABAP Report using the SUBMIT statement
ABAP report to display all the selection screen fields and any values input by the user