Archivo

Posts Tagged ‘XLS por mail’

Adjuntar y enviar archivo Excel (XLS) por Mail

Caso: se desea adjuntar un archivo Excel y enviarlo por E-Mail.

Solución:

REPORT  zmail_con_excel.
 
DATA: it_message TYPE STANDARD TABLE OF solisti1 INITIAL SIZE 0
                WITH HEADER LINE.
DATA: it_attach TYPE STANDARD TABLE OF solisti1 INITIAL SIZE 0
                WITH HEADER LINE.
 
DATA:   gv_email   TYPE somlreci1-receiver VALUE 'eduardo@eduardo.com'.
 
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,
        gd_error    TYPE sy-subrc,
        gd_reciever TYPE sy-subrc.
 
TYPES: BEGIN OF tty_salida,
  sociedad        TYPE bukrs,   " Sociedad
  documento       TYPE belnr_d, " Nro. documento
  ejercicio       TYPE gjahr,   " Ejercicio
  periodo         TYPE monat,   " Período
  fecha_doc       TYPE bldat,   " Fecha doc.
  fecha_contable  TYPE budat,   " Fecha cont.
  clase_doc       TYPE blart,   " Clase doc.
  importe_ml      TYPE dmbtr,   " Importe ML
  usuario         TYPE sy-uname.    " Usuario
TYPES: END OF tty_salida.
 
DATA: gt_salida TYPE STANDARD TABLE OF tty_salida,
      gs_salida TYPE tty_salida.
 
 
START-OF-SELECTION.
* Registro de prueba
  gs_salida-sociedad       = '1000'.
  gs_salida-documento      = '1600000393'.
  gs_salida-ejercicio      = '2014'.
  gs_salida-periodo        = '10'.
  gs_salida-fecha_doc      = '20141022'.
  gs_salida-fecha_contable = '20141022'.
  gs_salida-clase_doc      = 'AB'.
  gs_salida-importe_ml     = '150000'.
  gs_salida-usuario        = sy-uname.
  APPEND gs_salida TO gt_salida.
 
END-OF-SELECTION.
 
  PERFORM armar_mail.
 
*&---------------------------------------------------------------------*
*&      Form  ARMAR_MAIL – Rutina Principal
*&---------------------------------------------------------------------*
FORM armar_mail .
 
*   Populate table with details to be entered into .xls file
  PERFORM build_xls_data_table.
 
* Populate message body text
  PERFORM populate_email_message_body.
 
* Send file by email as .xls speadsheet
  PERFORM send_file_as_email_attachment
                               TABLES it_message
                                      it_attach
                                USING gv_email
                                      'Asunto del mail!'
                                      'XLS'
                                      'Reporte'
                                      'Reporte'
                                      ' '
                                      ' '
                             CHANGING gd_error
                                      gd_reciever.
 
*   Instructs mail send program for SAPCONNECT to send email(rsconn01)
  PERFORM initiate_mail_execute_program.
 
ENDFORM.                    " ARMAR_MAIL
*&---------------------------------------------------------------------*
*&      Form  BUILD_XLS_DATA_TABLE
* Las etiquetas no pueden superar los 255 caracteres en una línea, esa es * una limitante pero al parecer hay formas de solucionarlo. Además todos * los tipos de datos deben ser caracteres.
*&---------------------------------------------------------------------*
FORM build_xls_data_table .
  DATA: lv_importe_ml_char        TYPE char15,
        lv_importe_md_char        TYPE char15,
        lv_tc_cab_char            TYPE char11,
        lv_tc_pos_char            TYPE char11,
        lv_dif_tc_reg_char        TYPE char13,
        lv_dif_porcentaje_char    TYPE char11,
        lv_tc_obs_char            TYPE char11,
        lv_dif_tc_reg_b_char      TYPE char13,
        lv_dif_porcentaje_b_char  TYPE char11.
 
  CONSTANTS:
    con_tab TYPE c VALUE cl_abap_char_utilities=>horizontal_tab,
    con_cret TYPE c VALUE cl_abap_char_utilities=>cr_lf.
 
  CONCATENATE 'Sociedad' 'Nro Documento' 'Ejer.' 'Periodo' 'Fecha Doc.' 'Fecha Cont.' 'Clase Doc.'
              'Importe ML' 'User'
          INTO it_attach SEPARATED BY con_tab.
 
  CONCATENATE con_cret it_attach  INTO it_attach.
  APPEND  it_attach.
 
  LOOP AT gt_salida INTO gs_salida.
    MOVE gs_salida-importe_ml TO lv_importe_ml_char.
    CONDENSE lv_importe_ml_char NO-GAPS.
 
    CONCATENATE gs_salida-sociedad gs_salida-documento gs_salida-ejercicio gs_salida-periodo gs_salida-fecha_doc
                gs_salida-fecha_contable gs_salida-clase_doc lv_importe_ml_char gs_salida-usuario
           INTO it_attach SEPARATED BY con_tab.
 
    CONCATENATE con_cret it_attach  INTO it_attach.
    APPEND  it_attach.
  ENDLOOP.
 
ENDFORM.                    " BUILD_XLS_DATA_TABLE
 
*&---------------------------------------------------------------------*
*&      Form  POPULATE_EMAIL_MESSAGE_BODY
*&---------------------------------------------------------------------*
FORM populate_email_message_body .
 
  REFRESH it_message.
  it_message = 'Cuerpo del mensaje (body)!'.
  APPEND it_message.
 
ENDFORM.                    " POPULATE_EMAIL_MESSAGE_BODY
 
*&---------------------------------------------------------------------*
*&      Form  SEND_FILE_AS_EMAIL_ATTACHMENT
*&---------------------------------------------------------------------*
FORM send_file_as_email_attachment  TABLES pit_message
                                          pit_attach
                                    USING gv_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.
 
  ld_email               = gv_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[] = pit_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.                    " SEND_FILE_AS_EMAIL_ATTACHMENT
 
*&---------------------------------------------------------------------*
*&      Form  INITIATE_MAIL_EXECUTE_PROGRAM
*&---------------------------------------------------------------------*
FORM initiate_mail_execute_program .
 
  WAIT UP TO 3 SECONDS.
  SUBMIT rsconn01 WITH mode = 'INT'
                  WITH output = 'X'
                  AND RETURN.
 
ENDFORM.                    " INITIATE_MAIL_EXECUTE_PROGRAM
Anuncio publicitario