Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Trying to send email with excel attachment using FM SO_DOCUMENT_SEND_API1 all the data in Excel is coming in one column

S0025444845
Active Participant
0 Likes
2,011

Hi,

I am trying to send an email with excel attachment using FM  SO_DOCUMENT_SEND_API1 but the problem is all the data in Excel is coming in one column.

I have tried to export the internal data table in debugging in that also data is in one column only. How tyo fix this.

Below is my code.

data: gt_message TYPE STANDARD TABLE OF solisti1 ,

     gt_attach TYPE STANDARD TABLE OF solisti1 ,

     gt_packing_list TYPE STANDARD TABLE OF sopcklsti1 ,

     gt_edi_file TYPE STANDARD TABLE OF ty_edi_file,

     gt_receivers TYPE STANDARD TABLE OF somlreci1.

Constants:

gc_cret TYPE c VALUE cl_abap_char_utilities=>horizontal_tab,

           gc_tab TYPE c VALUE cl_abap_char_utilities=>cr_lf.

*     Build data table for .xls document
  PERFORM f_build_xls_data_table.

*   To fill email body
  PERFORM f_populate_email_msg_body.

  PERFORM f_get_email_address CHANGING lv_email.

  IF NOT lv_email IS INITIAL.
* To send email
    PERFORM f_send_email USING lv_email.
  ENDIF.

*&---------------------------------------------------------------------*
*&      Form  F_BUILD_XLS_DATA_TABLE
*&---------------------------------------------------------------------*
*       Build data table for .xls document
*----------------------------------------------------------------------*
FORM f_build_xls_data_table .
  DATA:  lwa_attach TYPE solisti1 ,
        lwa_edi_file TYPE ty_edi_file,
        lv_count TYPE sy-tabix,
        lv_count1 TYPE sy-tabix,
        lv_record TYPE char10.

  REFRESH: gt_attach.
*  Append total number of record.
  DESCRIBE TABLE gt_nast LINES lv_count.
  lv_record = lv_count.
  CONCATENATE text-015 lv_record INTO lwa_attach-line SEPARATED BY gc_tab.
  CONCATENATE gc_cret lwa_attach-line  INTO lwa_attach-line.
  APPEND lwa_attach TO gt_attach.
  CLEAR: lwa_attach,lv_count,lv_record.

*  Append total number of records processed Successfully.
  CLEAR:lv_record.
  DESCRIBE TABLE gt_edi_file LINES lv_count1.
*  DESCRIBE TABLE gt_nast LINES lv_count.
  lv_record = lv_count - lv_count1.
  CONCATENATE text-016 lv_record INTO lwa_attach-line SEPARATED BY gc_tab.
  CONCATENATE gc_cret lwa_attach-line  INTO lwa_attach-line.
  APPEND lwa_attach TO gt_attach.
  CLEAR: lwa_attach,lv_count,lv_record.

*  Append total number of records in error.
*  DESCRIBE TABLE gt_edi_errors LINES lv_count.
  CLEAR:lv_record.
  lv_record = lv_count1.
  CONCATENATE text-017 lv_record INTO lwa_attach-line SEPARATED BY gc_tab.
  CONCATENATE gc_cret lwa_attach-line  INTO lwa_attach-line.
  APPEND lwa_attach TO gt_attach.
  CLEAR: lwa_attach,lv_count,lv_record.

*Append field labels
  CONCATENATE  text-005 text-006 text-007 text-018
  text-019 text-020 text-021 text-022 text-023
    INTO lwa_attach-line SEPARATED BY gc_tab.
  CONCATENATE gc_cret lwa_attach-line  INTO lwa_attach-line.
  APPEND lwa_attach TO gt_attach.
  CLEAR lwa_attach.

  LOOP AT gt_edi_file INTO lwa_edi_file.
    CONCATENATE lwa_edi_file-ebeln lwa_edi_file-ekgrp  lwa_edi_file-lifnr
     lwa_edi_file-name1 lwa_edi_file-zedi_err_field lwa_edi_file-zedi_err_code
      lwa_edi_file-zedi_err_desc  lwa_edi_file-aedat  lwa_edi_file-bname
      INTO lwa_attach-line SEPARATED BY gc_tab.
    CONCATENATE gc_cret lwa_attach-line  INTO lwa_attach-line.
    APPEND lwa_attach TO gt_attach.
    CLEAR: lwa_attach,lwa_edi_file.
  ENDLOOP.


ENDFORM.                    " F_BUILD_XLS_DATA_TABLE
*&---------------------------------------------------------------------*
*&      Form  F_SEND_EMAIL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM f_send_email USING p_lv_email TYPE  somlreci1-receiver.


  DATA: lv_error    TYPE sy-subrc,
         lv_reciever TYPE sy-subrc,

         lv_attfilename TYPE  so_obj_des ,
         lv_sender_address LIKE  soextreci1-receiver,
         lv_sender_address_type LIKE  soextreci1-adr_typ,
         lv_receiver LIKE  sy-subrc,
         lwa_doc_data LIKE sodocchgi1,
         lwa_packing_list TYPE sopcklsti1,
         lwa_attach TYPE sopcklsti1,
         gt_attachment TYPE STANDARD TABLE OF sopcklsti1,
         lwa_receivers TYPE somlreci1,
         lv_cnt TYPE sy-tabix,
         lv_cnt1 TYPE sy-tabix,
         lwa_message TYPE solisti1.


  CONCATENATE sy-datum sy-uzeit  INTO lv_attfilename.
  CONCATENATE lv_attfilename sy-uname text-004 INTO lv_attfilename
  SEPARATED BY '_'.

* Fill the document data.
*  lwa_doc_data-doc_size = 1.

* Populate the subject/generic message attributes
  lwa_doc_data-obj_langu = sy-langu.
  lwa_doc_data-obj_name  = 'SAPRPT'.
  lwa_doc_data-obj_descr = text-004 .
  lwa_doc_data-sensitivty = 'F'.

*  fill the document data and get size of attachment
*  CLEAR lwa_doc_data.
  DESCRIBE TABLE gt_attach LINES lv_cnt.
  DESCRIBE TABLE gt_message LINES lv_cnt1.
  READ TABLE gt_message INTO lwa_message INDEX lv_cnt1.
  lwa_doc_data-doc_size =
     ( lv_cnt1 - 1 ) * 255 + STRLEN( lwa_message ).
*  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 gt_attachment.
  gt_attachment[] = gt_attach[].
*
* Describe the body of the message
  CLEAR lwa_packing_list.
  REFRESH: gt_packing_list,gt_receivers.
  lwa_packing_list-transf_bin = space.
  lwa_packing_list-head_start = 1.
  lwa_packing_list-head_num = 0.
  lwa_packing_list-body_start = 1.
  lwa_packing_list-head_num = lv_cnt1.
  lwa_packing_list-doc_type = 'RAW'.
  APPEND lwa_packing_list TO gt_packing_list.

* Create attachment notification
  CLEAR:lwa_packing_list.
  lwa_packing_list-transf_bin = 'X'.
  lwa_packing_list-head_start = 1.
  lwa_packing_list-head_num   = 0.
  lwa_packing_list-body_start = 1.
  lwa_packing_list-body_num = lv_cnt.
  lwa_packing_list-doc_type   =  'XLS'.
  lwa_packing_list-obj_descr  =  lv_attfilename.
  lwa_packing_list-obj_name   =  lv_attfilename.
  lwa_packing_list-doc_size   =  100000.  " lv_cnt * 255.
  APPEND lwa_packing_list TO gt_packing_list.

* Add the recipients email address
  CLEAR lwa_receivers.
  REFRESH gt_receivers.
  lwa_receivers-receiver = p_lv_email.
  lwa_receivers-rec_type = 'U'.
  lwa_receivers-com_type = 'INT'.
  lwa_receivers-notif_del = gc_yes.
  lwa_receivers-notif_ndel = gc_yes.
  APPEND lwa_receivers TO  gt_receivers.

  CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
    EXPORTING
      document_data              = lwa_doc_data
      put_in_outbox              = gc_yes
      sender_address             = lv_sender_address
      sender_address_type        = lv_sender_address_type
      commit_work                = gc_yes
    IMPORTING
      sent_to_all                = gv_sent_all
    TABLES
      packing_list               = gt_packing_list
      contents_bin               = gt_attach
      contents_txt               = gt_message
      receivers                  = gt_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.


ENDFORM.                    " F_SEND_EMAIL
*&---------------------------------------------------------------------*
*&      Form  F_POPULATE_EMAIL_MSG_BODY
*&---------------------------------------------------------------------*
*        Populate message body text
*----------------------------------------------------------------------*
FORM f_populate_email_msg_body .
  DATA: lwa_message TYPE solisti1 .
  REFRESH:gt_message.
  lwa_message-line = text-024.
  APPEND lwa_message TO gt_message.

  lwa_message-line = text-004.
  APPEND lwa_message TO gt_message.

ENDFORM.                    " F_POPULATE_EMAIL_MSG_BODY
*&---------------------------------------------------------------------*
*&      Form  F_GET_EMAIL_ADDRESS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM f_get_email_address  CHANGING ch_lv_email TYPE somlreci1-receiver.
  DATA: lwa_address TYPE bapiaddr3,
        lt_return TYPE STANDARD TABLE OF bapiret2.


  CALL FUNCTION 'BAPI_USER_GET_DETAIL'
    EXPORTING
      username = sy-uname
    IMPORTING
      address  = lwa_address
    TABLES
      return   = lt_return.

  IF lwa_address IS NOT INITIAL.
    ch_lv_email = lwa_address-e_mail .
  ENDIF.

ENDFORM.                    " F_GET_EMAIL_ADDRESS

Regards,

Sudha

1 ACCEPTED SOLUTION
Read only

Former Member
0 Likes
1,311

Hi Sudha,

Use CL_BCS instead of using this FM.

Use report BCS_EXAMPLE_5 as an example.

Thanks,

Shambu

Hi,

I am trying to send an email with excel attachment using FM  SO_DOCUMENT_SEND_API1 but the problem is all the data in Excel is coming in one column.

I have tried to export the internal data table in debugging in that also data is in one column only. How tyo fix this.

Below is my code.

data: gt_message TYPE STANDARD TABLE OF solisti1 ,

     gt_attach TYPE STANDARD TABLE OF solisti1 ,

     gt_packing_list TYPE STANDARD TABLE OF sopcklsti1 ,

     gt_edi_file TYPE STANDARD TABLE OF ty_edi_file,

     gt_receivers TYPE STANDARD TABLE OF somlreci1.

Constants:

gc_cret TYPE c VALUE cl_abap_char_utilities=>horizontal_tab,

           gc_tab TYPE c VALUE cl_abap_char_utilities=>cr_lf.

*     Build data table for .xls document
  PERFORM f_build_xls_data_table.

*   To fill email body
  PERFORM f_populate_email_msg_body.

  PERFORM f_get_email_address CHANGING lv_email.

  IF NOT lv_email IS INITIAL.
* To send email
    PERFORM f_send_email USING lv_email.
  ENDIF.

*&---------------------------------------------------------------------*
*&      Form  F_BUILD_XLS_DATA_TABLE
*&---------------------------------------------------------------------*
*       Build data table for .xls document
*----------------------------------------------------------------------*
FORM f_build_xls_data_table .
  DATA:  lwa_attach TYPE solisti1 ,
        lwa_edi_file TYPE ty_edi_file,
        lv_count TYPE sy-tabix,
        lv_count1 TYPE sy-tabix,
        lv_record TYPE char10.

  REFRESH: gt_attach.
*  Append total number of record.
  DESCRIBE TABLE gt_nast LINES lv_count.
  lv_record = lv_count.
  CONCATENATE text-015 lv_record INTO lwa_attach-line SEPARATED BY gc_tab.
  CONCATENATE gc_cret lwa_attach-line  INTO lwa_attach-line.
  APPEND lwa_attach TO gt_attach.
  CLEAR: lwa_attach,lv_count,lv_record.

*  Append total number of records processed Successfully.
  CLEAR:lv_record.
  DESCRIBE TABLE gt_edi_file LINES lv_count1.
*  DESCRIBE TABLE gt_nast LINES lv_count.
  lv_record = lv_count - lv_count1.
  CONCATENATE text-016 lv_record INTO lwa_attach-line SEPARATED BY gc_tab.
  CONCATENATE gc_cret lwa_attach-line  INTO lwa_attach-line.
  APPEND lwa_attach TO gt_attach.
  CLEAR: lwa_attach,lv_count,lv_record.

*  Append total number of records in error.
*  DESCRIBE TABLE gt_edi_errors LINES lv_count.
  CLEAR:lv_record.
  lv_record = lv_count1.
  CONCATENATE text-017 lv_record INTO lwa_attach-line SEPARATED BY gc_tab.
  CONCATENATE gc_cret lwa_attach-line  INTO lwa_attach-line.
  APPEND lwa_attach TO gt_attach.
  CLEAR: lwa_attach,lv_count,lv_record.

*Append field labels
  CONCATENATE  text-005 text-006 text-007 text-018
  text-019 text-020 text-021 text-022 text-023
    INTO lwa_attach-line SEPARATED BY gc_tab.
  CONCATENATE gc_cret lwa_attach-line  INTO lwa_attach-line.
  APPEND lwa_attach TO gt_attach.
  CLEAR lwa_attach.

  LOOP AT gt_edi_file INTO lwa_edi_file.
    CONCATENATE lwa_edi_file-ebeln lwa_edi_file-ekgrp  lwa_edi_file-lifnr
     lwa_edi_file-name1 lwa_edi_file-zedi_err_field lwa_edi_file-zedi_err_code
      lwa_edi_file-zedi_err_desc  lwa_edi_file-aedat  lwa_edi_file-bname
      INTO lwa_attach-line SEPARATED BY gc_tab.
    CONCATENATE gc_cret lwa_attach-line  INTO lwa_attach-line.
    APPEND lwa_attach TO gt_attach.
    CLEAR: lwa_attach,lwa_edi_file.
  ENDLOOP.


ENDFORM.                    " F_BUILD_XLS_DATA_TABLE
*&---------------------------------------------------------------------*
*&      Form  F_SEND_EMAIL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM f_send_email USING p_lv_email TYPE  somlreci1-receiver.


  DATA: lv_error    TYPE sy-subrc,
         lv_reciever TYPE sy-subrc,

         lv_attfilename TYPE  so_obj_des ,
         lv_sender_address LIKE  soextreci1-receiver,
         lv_sender_address_type LIKE  soextreci1-adr_typ,
         lv_receiver LIKE  sy-subrc,
         lwa_doc_data LIKE sodocchgi1,
         lwa_packing_list TYPE sopcklsti1,
         lwa_attach TYPE sopcklsti1,
         gt_attachment TYPE STANDARD TABLE OF sopcklsti1,
         lwa_receivers TYPE somlreci1,
         lv_cnt TYPE sy-tabix,
         lv_cnt1 TYPE sy-tabix,
         lwa_message TYPE solisti1.


  CONCATENATE sy-datum sy-uzeit  INTO lv_attfilename.
  CONCATENATE lv_attfilename sy-uname text-004 INTO lv_attfilename
  SEPARATED BY '_'.

* Fill the document data.
*  lwa_doc_data-doc_size = 1.

* Populate the subject/generic message attributes
  lwa_doc_data-obj_langu = sy-langu.
  lwa_doc_data-obj_name  = 'SAPRPT'.
  lwa_doc_data-obj_descr = text-004 .
  lwa_doc_data-sensitivty = 'F'.

*  fill the document data and get size of attachment
*  CLEAR lwa_doc_data.
  DESCRIBE TABLE gt_attach LINES lv_cnt.
  DESCRIBE TABLE gt_message LINES lv_cnt1.
  READ TABLE gt_message INTO lwa_message INDEX lv_cnt1.
  lwa_doc_data-doc_size =
     ( lv_cnt1 - 1 ) * 255 + STRLEN( lwa_message ).
*  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 gt_attachment.
  gt_attachment[] = gt_attach[].
*
* Describe the body of the message
  CLEAR lwa_packing_list.
  REFRESH: gt_packing_list,gt_receivers.
  lwa_packing_list-transf_bin = space.
  lwa_packing_list-head_start = 1.
  lwa_packing_list-head_num = 0.
  lwa_packing_list-body_start = 1.
  lwa_packing_list-head_num = lv_cnt1.
  lwa_packing_list-doc_type = 'RAW'.
  APPEND lwa_packing_list TO gt_packing_list.

* Create attachment notification
  CLEAR:lwa_packing_list.
  lwa_packing_list-transf_bin = 'X'.
  lwa_packing_list-head_start = 1.
  lwa_packing_list-head_num   = 0.
  lwa_packing_list-body_start = 1.
  lwa_packing_list-body_num = lv_cnt.
  lwa_packing_list-doc_type   =  'XLS'.
  lwa_packing_list-obj_descr  =  lv_attfilename.
  lwa_packing_list-obj_name   =  lv_attfilename.
  lwa_packing_list-doc_size   =  100000.  " lv_cnt * 255.
  APPEND lwa_packing_list TO gt_packing_list.

* Add the recipients email address
  CLEAR lwa_receivers.
  REFRESH gt_receivers.
  lwa_receivers-receiver = p_lv_email.
  lwa_receivers-rec_type = 'U'.
  lwa_receivers-com_type = 'INT'.
  lwa_receivers-notif_del = gc_yes.
  lwa_receivers-notif_ndel = gc_yes.
  APPEND lwa_receivers TO  gt_receivers.

  CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
    EXPORTING
      document_data              = lwa_doc_data
      put_in_outbox              = gc_yes
      sender_address             = lv_sender_address
      sender_address_type        = lv_sender_address_type
      commit_work                = gc_yes
    IMPORTING
      sent_to_all                = gv_sent_all
    TABLES
      packing_list               = gt_packing_list
      contents_bin               = gt_attach
      contents_txt               = gt_message
      receivers                  = gt_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.


ENDFORM.                    " F_SEND_EMAIL
*&---------------------------------------------------------------------*
*&      Form  F_POPULATE_EMAIL_MSG_BODY
*&---------------------------------------------------------------------*
*        Populate message body text
*----------------------------------------------------------------------*
FORM f_populate_email_msg_body .
  DATA: lwa_message TYPE solisti1 .
  REFRESH:gt_message.
  lwa_message-line = text-024.
  APPEND lwa_message TO gt_message.

  lwa_message-line = text-004.
  APPEND lwa_message TO gt_message.

ENDFORM.                    " F_POPULATE_EMAIL_MSG_BODY
*&---------------------------------------------------------------------*
*&      Form  F_GET_EMAIL_ADDRESS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM f_get_email_address  CHANGING ch_lv_email TYPE somlreci1-receiver.
  DATA: lwa_address TYPE bapiaddr3,
        lt_return TYPE STANDARD TABLE OF bapiret2.


  CALL FUNCTION 'BAPI_USER_GET_DETAIL'
    EXPORTING
      username = sy-uname
    IMPORTING
      address  = lwa_address
    TABLES
      return   = lt_return.

  IF lwa_address IS NOT INITIAL.
    ch_lv_email = lwa_address-e_mail .
  ENDIF.

ENDFORM.                    " F_GET_EMAIL_ADDRESS

Regards,

Sudha

6 REPLIES 6
Read only

Former Member
0 Likes
1,312

Hi Sudha,

Use CL_BCS instead of using this FM.

Use report BCS_EXAMPLE_5 as an example.

Thanks,

Shambu

Read only

0 Likes
1,311

has anyone have any idea why all the data is coming in one column.

Read only

0 Likes
1,311

AT brief view, it seems the prblem is at   gc_tab  whch you set line feed.  Can you please modify it to ','  and test it.

Venkat

Read only

0 Likes
1,311

Hi Sudha,

For tab constant 'gc_tab' the value should be cl_abap_char_utilities=>horizontal_tab. The data will be split into multiple columns only when there is a tab character in the data. 

Just an observation from looking at your code. I think the declaration is reversed.

           gc_cret TYPE c VALUE cl_abap_char_utilities=>horizontal_tab,

           gc_tab TYPE c VALUE cl_abap_char_utilities=>cr_lf.

It should be

          gc_tab TYPE c VALUE cl_abap_char_utilities=>horizontal_tab,

          gc_crer TYPE c VALUE cl_abap_char_utilities=>cr_lf.

Regards,

Shravan

Read only

0 Likes
1,311

use CL_BCS and I will look into it.

Regards

Clemens

Read only

venkateswaran_k
Active Contributor
0 Likes
1,311

Ignore my previous comment.

Try use this function, which works fine... (from my working program)

  call function 'MS_EXCEL_OLE_STANDARD_DAT'

  exporting

      file_name = 'C:\Budget'          "path where you need to download

      data_sheet_name = 'Budget'

  tables

*   PIVOT_FIELD_TAB =

    data_tab = it_excel_data          "internal table with data

    fieldnames = it_fnames             "internal table with header

  exceptions

    file_not_exist = 1

    filename_expected = 2

    communication_error = 3

    ole_object_method_error = 4

    ole_object_property_error = 5

    invalid_filename = 6

    invalid_pivot_fields = 7

    download_problem = 8

  others = 9.

  if sy-subrc <> 0.

*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

*   WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  endif.