2012 Jun 13 1:26 PM
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
2012 Jun 13 1:50 PM
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
2012 Jun 13 1:50 PM
Hi Sudha,
Use CL_BCS instead of using this FM.
Use report BCS_EXAMPLE_5 as an example.
Thanks,
Shambu
2012 Jun 13 5:13 PM
has anyone have any idea why all the data is coming in one column.
2012 Jun 13 5:32 PM
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
2012 Jun 13 6:36 PM
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
2012 Jun 13 10:03 PM
2012 Jun 13 5:38 PM
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.
| User | Count |
|---|---|
| 4 | |
| 2 | |
| 2 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |