You are on page 1of 6

*&---------------------------------------------------------------------*

*& Report ZGN_DYNAMIC_EXCEL


*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
* Created By: Harish Parab / (<<SAP USER ID>>)
* RICEFW ID: GNR0192
* Tran Code: ZGN0004
* Program Descr: Program to email any ALV report as excel attachment.
*&---------------------------------------------------------------------*
* Modification Log
*&---------------------------------------------------------------------*
* Programmer |Issue | Date | Chg Req. : Description
*&---------------------------------------------------------------------*
* Harish Parab|6000010985| 15.03.2021 | JEDK920766: Program to email any ALV
report as excel attachment
* | | |
*&---------------------------------------------------------------------*
REPORT zgn_dynamic_excel.

* data declaration
TYPES:
BEGIN OF ty_type_metadata,
is_hierseq TYPE abap_bool,
tabname TYPE string,
tabname_line TYPE string,
s_keyinfo TYPE kkblo_keyinfo,
s_layout TYPE lvc_s_layo,
t_fcat TYPE lvc_t_fcat,
t_filter TYPE lvc_t_filt,
t_sort TYPE lvc_t_sort,
END OF ty_type_metadata .

TYPES :
BEGIN OF ty_emailid,
emailid TYPE ad_smtpadr,
END OF ty_emailid,

ty_emailid_t TYPE TABLE OF ty_emailid.

DATA:
gs_data TYPE REF TO data,
gs_meta TYPE ty_type_metadata,
gc_tab TYPE c VALUE cl_bcs_convert=>gc_tab,
gc_crlf TYPE c VALUE cl_bcs_convert=>gc_crlf,
gv_string TYPE string,
gv_value TYPE string,
gv_last TYPE i,
gv_binary_content TYPE solix_tab,
gv_size TYPE so_obj_len,
gt_attachments TYPE zsgen_attachments_t,
gs_attachments TYPE zsgen_attachments,
gv_filename TYPE string,
gv_subject TYPE so_obj_des,
gt_body TYPE TABLE OF soli,
gs_body TYPE soli,
gv_sender TYPE ad_smtpadr VALUE 'sap.info@kalpatarugroup.com',
gt_recepient TYPE ty_emailid_t,
gs_recepient_mail TYPE ty_emailid,
gv_mail_type TYPE so_obj_tp VALUE 'RAW',
gv_result TYPE boolean,
gv_email TYPE ad_smtpadr,
gv_sub(50) TYPE c,
gt_fval TYPE STANDARD TABLE OF dynpread,
gs_fval TYPE dynpread.

FIELD-SYMBOLS:
<fs_table> TYPE table,
<fs_value> TYPE any.

* selection screen
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-002.
PARAMETERS :
p_prog TYPE rs38m-programm MATCHCODE OBJECT sedt_programs OBLIGATORY,
p_var TYPE rsvar-variant OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-003.


PARAMETERS :
p_sub LIKE gv_sub OBLIGATORY.

SELECT-OPTIONS:
s_email FOR gv_email NO INTERVALS OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b2.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_var.


FREE: gs_fval, gt_fval.
gs_fval-fieldname = 'P_PROG'.
APPEND gs_fval TO gt_fval.

CALL FUNCTION 'DYNP_VALUES_READ'


EXPORTING
dyname = sy-repid
dynumb = '1000'
TABLES
dynpfields = gt_fval
EXCEPTIONS
invalid_abapworkarea = 1
invalid_dynprofield = 2
invalid_dynproname = 3
invalid_dynpronummer = 4
invalid_request = 5
no_fielddescription = 6
invalid_parameter = 7
undefind_error = 8
double_conversion = 9
stepl_not_found = 10
OTHERS = 11.

IF sy-subrc <> 0.
* Implement suitable error handling here
ELSE.

READ TABLE gt_fval INTO gs_fval INDEX 1.

IF sy-subrc EQ 0.
TRANSLATE gs_fval-fieldvalue TO UPPER CASE.

SELECT variant
FROM varid
INTO TABLE @DATA(gt_var)
WHERE report = @gs_fval-fieldvalue.

IF sy-subrc EQ 0.

CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'


EXPORTING
retfield = 'VARIANT'
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'P_VAR'
value_org = 'S'
TABLES
value_tab = gt_var
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.

IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.

ENDIF.

ENDIF.

ENDIF.

START-OF-SELECTION.
* Getting data from background information
cl_salv_bs_runtime_info=>set(
display = abap_false
metadata = abap_true
data = abap_true ).

* submit report program to background


SUBMIT (p_prog)
USING SELECTION-SET p_var
AND RETURN.

* Read metadata of report for Excel header row preparatin


TRY.
gs_meta = cl_salv_bs_runtime_info=>get_metadata( ).

IF NOT gs_meta IS INITIAL.

delete gs_meta-t_fcat WHERE no_out eq 'X'.


DESCRIBE TABLE gs_meta-t_fcat LINES gv_last.

LOOP AT gs_meta-t_fcat ASSIGNING FIELD-SYMBOL(<fs_fcat>).

IF sy-tabix EQ 1.
CONCATENATE <fs_fcat>-seltext gc_tab INTO gv_string.
ELSEIF sy-tabix GT 1 AND sy-tabix NE gv_last.
CONCATENATE gv_string <fs_fcat>-seltext gc_tab INTO gv_string.
ELSEIF sy-tabix EQ gv_last.
CONCATENATE gv_string <fs_fcat>-seltext gc_crlf INTO gv_string.
ENDIF.

ENDLOOP.

ENDIF.

CATCH cx_salv_bs_sc_runtime_info.
MESSAGE TEXT-001 TYPE 'E'.

ENDTRY.

* Read data from report and create string for mail attachment
TRY.
cl_salv_bs_runtime_info=>get_data_ref(
IMPORTING r_data = gs_data ).
ASSIGN gs_data->* TO <fs_table>.

IF <fs_table> IS ASSIGNED.

LOOP AT <fs_table> ASSIGNING FIELD-SYMBOL(<fs_data>).

LOOP AT gs_meta-t_fcat ASSIGNING <fs_fcat>.

ASSIGN COMPONENT <fs_fcat>-fieldname OF STRUCTURE <fs_data> TO


<fs_value>.

IF <fs_value> IS ASSIGNED.

gv_value = <fs_value>.
CONDENSE gv_value.

IF sy-tabix EQ 1.
CONCATENATE gv_string gv_value gc_tab INTO gv_string.
ELSEIF sy-tabix GT 1 AND sy-tabix NE gv_last.
CONCATENATE gv_string gv_value gc_tab INTO gv_string.
ELSEIF sy-tabix EQ gv_last.
CONCATENATE gv_string gv_value gc_crlf INTO gv_string.
ENDIF.

ENDIF.

ENDLOOP.

ENDLOOP.

ENDIF.

CATCH cx_salv_bs_sc_runtime_info.
MESSAGE TEXT-001 TYPE 'E'.

ENDTRY.

cl_salv_bs_runtime_info=>clear_all( ).

END-OF-SELECTION.
*Mail send logic.
*Create binary content from data string
TRY.
cl_bcs_convert=>string_to_solix(
EXPORTING
iv_string = gv_string
IMPORTING
et_solix = gv_binary_content
ev_size = gv_size ).

CATCH cx_bcs.
MESSAGE e445(so).
ENDTRY.

* Excel file name will be tcode description


SELECT SINGLE ttext
FROM tstc AS a INNER JOIN tstct AS b ON a~tcode = b~tcode
INTO @DATA(gv_text)
WHERE pgmna = @p_prog.

IF sy-subrc EQ 0.
gv_filename = gv_text.
ELSE.
gv_filename = p_sub.
ENDIF.

* Create excel attachment


CLEAR : gs_attachments.
gs_attachments-attachment_type = 'XLSX'.
gs_attachments-attachment_subject = gv_filename.
gs_attachments-attachment_size = gv_size.
gs_attachments-att_content_hex = gv_binary_content.
APPEND gs_attachments TO gt_attachments.

* subject will be from selection screen.


gv_subject = p_sub.

* Email body will be common for all report


gs_body = 'Dear all,'.
APPEND gs_body TO gt_body.
FREE gs_body.

APPEND gs_body TO gt_body.

gs_body = 'Please find attached report generated from SAP as per your request.'.
APPEND gs_body TO gt_body.
FREE gs_body.

APPEND gs_body TO gt_body.

gs_body = 'Note : This is an auto generated mail.'.


APPEND gs_body TO gt_body.
FREE gs_body.

gs_body = 'Do not reply on this.'.


APPEND gs_body TO gt_body.
FREE gs_body.

* Recepients will be from selection screen


LOOP AT s_email ASSIGNING FIELD-SYMBOL(<fs_email>).
gs_recepient_mail-emailid = <fs_email>-low.
APPEND gs_recepient_mail TO gt_recepient.
FREE gs_recepient_mail.
ENDLOOP.

* Call class method to get mail


CALL METHOD zcl_common_utility=>send_mail_print_pdf
EXPORTING
im_v_mail_type = gv_mail_type
im_v_subject = gv_subject
im_v_body = gt_body
im_v_attachments = gt_attachments
im_v_sender = gv_sender
im_t_recipient = gt_recepient
IMPORTING
ex_v_result = gv_result.

* Message on mail success


IF gv_result EQ abap_true.
WRITE: 'Mail sent successfully'.
ENDIF.

You might also like