12-10-2013 10:11 AM
Hi,
My requirement is to send the internal table as an excel attachment to the automail trigerred on user-command.
Can anyone please help me. I searched in the forum and found links using class CL_DOCUMENT_BCS but I am unable to implement it properly as I have not implemented it earlier. Can anyone share the full code or help me by some other way please.
Regards,
Sharbani
12-10-2013 10:41 AM
Hi Sharbani,
This is the sample code for sending an internal table as an attachment.
*&---------------------------------------------------------------------*
*& Report ZTEST_EMAIL
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_EMAIL.
**--------------------------------------------------------*
*" Data retrieval related declarations
**--------------------------------------------------------*
TYPES:
BEGIN OF T_EKBE1,
EBELN TYPE ebeln,
EBELP TYPE ebelp,
GJAHR TYPE gjahr,
MATNR TYPE matnr,
DMBTR TYPE dmbtr,
END OF T_EKBE1.
TYPES:
BEGIN OF T_EKBE,
EBELN(10) TYPE c,
EBELP(5) TYPE c,
GJAHR(4) TYPE c,
MATNR(18) TYPE c,
DMBTR(13) TYPE c,
END OF T_EKBE.
DATA: W_EKBE TYPE T_EKBE.
DATA:
I_EKBE TYPE STANDARD TABLE OF T_EKBE.
DATA: W_EKBE1 TYPE T_EKBE1.
DATA:
I_EKBE1 TYPE STANDARD TABLE OF T_EKBE1.
*--------------------------------------------------------*
" Mail related declarations
*--------------------------------------------------------*
"Variables
DATA :
G_SENT_TO_ALL TYPE SONV-FLAG,
G_TAB_LINES TYPE I.
"Types
TYPES:
T_DOCUMENT_DATA TYPE SODOCCHGI1,
T_PACKING_LIST TYPE SOPCKLSTI1,
T_ATTACHMENT TYPE SOLISTI1,
T_BODY_MSG TYPE SOLISTI1,
T_RECEIVERS TYPE SOMLRECI1.
"Workareas
DATA :
W_DOCUMENT_DATA TYPE T_DOCUMENT_DATA,
W_PACKING_LIST TYPE T_PACKING_LIST,
W_ATTACHMENT TYPE T_ATTACHMENT,
W_BODY_MSG TYPE T_BODY_MSG,
W_RECEIVERS TYPE T_RECEIVERS.
"Internal Tables
DATA :
I_DOCUMENT_DATA TYPE STANDARD TABLE OF T_DOCUMENT_DATA,
I_PACKING_LIST TYPE STANDARD TABLE OF T_PACKING_LIST,
I_ATTACHMENT TYPE STANDARD TABLE OF T_ATTACHMENT,
I_BODY_MSG TYPE STANDARD TABLE OF T_BODY_MSG,
I_RECEIVERS TYPE STANDARD TABLE OF T_RECEIVERS.
*--------------------------------------------------------*
Start-of-selection.
*--------------------------------------------------------*
START-OF-SELECTION.
PERFORM GET_DATA.
PERFORM BUILD_XLS_DATA_TABLE.
*--------------------------------------------------------*
"End-of-selection.
*--------------------------------------------------------*
END-OF-SELECTION.
PERFORM SEND_MAIL.
*&--------------------------------------------------------*
"Form get_data from PA0001
*&--------------------------------------------------------*
FORM GET_DATA.
SELECT EBELN
EBELP
GJAHR
MATNR
DMBTR
FROM EKBE
INTO CORRESPONDING FIELDS OF TABLE I_EKBE1
UP TO 10 ROWS.
loop at i_ekbe1 into w_ekbe1.
MOVE-CORRESPONDING w_ekbe1 to w_ekbe.
append w_ekbe to i_ekbe.
endloop.
ENDFORM. " get_data
*&---------------------------------------------------------*
"Form build_xls_data_table
*&---------------------------------------------------------*
FORM BUILD_XLS_DATA_TABLE.
"If you have Unicode check active in program attributes then
"you will need to declare constants as follows.
CLASS CL_ABAP_CHAR_UTILITIES DEFINITION LOAD.
CONSTANTS:
CON_TAB TYPE C VALUE CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB,
CON_CRET TYPE C VALUE CL_ABAP_CHAR_UTILITIES=>CR_LF.
CONCATENATE 'EBELN' 'EBELP' 'GJAHR' 'MATNR' 'DMBTR'
INTO W_ATTACHMENT
SEPARATED BY CON_TAB.
CONCATENATE CON_CRET
W_ATTACHMENT
INTO W_ATTACHMENT.
APPEND W_ATTACHMENT TO I_ATTACHMENT.
CLEAR W_ATTACHMENT.
LOOP AT I_EKBE INTO W_EKBE.
CONCATENATE W_EKBE-ebeln
W_EKBE-ebelp
W_EKBE-gjahr
W_EKBE-matnr
W_EKBE-dmbtr
INTO W_ATTACHMENT
SEPARATED BY CON_TAB.
CONCATENATE CON_CRET W_ATTACHMENT
INTO W_ATTACHMENT.
APPEND W_ATTACHMENT TO I_ATTACHMENT.
CLEAR W_ATTACHMENT.
ENDLOOP.
ENDFORM. "build_xls_data_table
*&----------------------------------------------------------*
"Form send_mail
"---------------
"PACKING LIST
"This table requires information about how the data in the
"tables OBJECT_HEADER, CONTENTS_BIN and CONTENTS_TXT are to
"be distributed to the documents and its attachments.The first
"row is for the document, the following rows are each for one
"attachment.
*&-----------------------------------------------------------*
FORM SEND_MAIL .
"Subject of the mail.
W_DOCUMENT_DATA-OBJ_NAME = 'MAIL_TO_HEAD'.
W_DOCUMENT_DATA-OBJ_DESCR = 'Regarding Mail Program by SAP ABAP'.
"Body of the mail
PERFORM BUILD_BODY_OF_MAIL
USING:SPACE,
'Hi,',
'I am fine. How are you? How are you doing ? ',
'This program has been created to send simple mail',
'with Subject,Body with Address of the sender. ',
'Regards,',
'Blog Admin,',
'SAP HR Technical Consultant.'.
"Write Packing List for Body
DESCRIBE TABLE I_BODY_MSG LINES G_TAB_LINES.
W_PACKING_LIST-HEAD_START = 1.
W_PACKING_LIST-HEAD_NUM = 0.
W_PACKING_LIST-BODY_START = 1.
W_PACKING_LIST-BODY_NUM = G_TAB_LINES.
W_PACKING_LIST-DOC_TYPE = 'RAW'.
APPEND W_PACKING_LIST TO I_PACKING_LIST.
CLEAR W_PACKING_LIST.
"Write Packing List for Attachment
W_PACKING_LIST-TRANSF_BIN = SPACE.
W_PACKING_LIST-HEAD_START = 1.
W_PACKING_LIST-HEAD_NUM = 1.
W_PACKING_LIST-BODY_START = G_TAB_LINES + 1.
DESCRIBE TABLE I_ATTACHMENT LINES W_PACKING_LIST-BODY_NUM.
W_PACKING_LIST-DOC_TYPE = 'XXL'.
W_PACKING_LIST-OBJ_DESCR = 'Excell Attachment'.
W_PACKING_LIST-OBJ_NAME = 'XLS_ATTACHMENT'.
W_PACKING_LIST-DOC_SIZE = W_PACKING_LIST-BODY_NUM * 255.
APPEND W_PACKING_LIST TO I_PACKING_LIST.
CLEAR W_PACKING_LIST.
APPEND LINES OF I_ATTACHMENT TO I_BODY_MSG.
"Fill the document data and get size of attachment
W_DOCUMENT_DATA-OBJ_LANGU = SY-LANGU.
READ TABLE I_BODY_MSG INTO W_BODY_MSG INDEX G_TAB_LINES.
W_DOCUMENT_DATA-DOC_SIZE = ( G_TAB_LINES - 1 ) * 255 + STRLEN( W_BODY_MSG ).
"Receivers List.
W_RECEIVERS-REC_TYPE = 'U'. "Internet address
W_RECEIVERS-RECEIVER = 'abc@xyz.com'.
W_RECEIVERS-COM_TYPE = 'INT'.
W_RECEIVERS-NOTIF_DEL = 'X'.
W_RECEIVERS-NOTIF_NDEL = 'X'.
APPEND W_RECEIVERS TO I_RECEIVERS .
CLEAR:W_RECEIVERS.
"Function module to send mail to Recipients
CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
EXPORTING
DOCUMENT_DATA = W_DOCUMENT_DATA
PUT_IN_OUTBOX = 'X'
COMMIT_WORK = 'X'
IMPORTING
SENT_TO_ALL = G_SENT_TO_ALL
TABLES
PACKING_LIST = I_PACKING_LIST
CONTENTS_TXT = I_BODY_MSG
RECEIVERS = I_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.
IF SY-SUBRC = 0 .
MESSAGE I303(ME) WITH 'Mail has been Successfully Sent.'.
ELSE.
WAIT UP TO 2 SECONDS.
"This program starts the SAPconnect send process.
SUBMIT RSCONN01 WITH MODE = 'INT'
WITH OUTPUT = 'X'
AND RETURN.
ENDIF.
ENDFORM. " send_mail
*&-----------------------------------------------------------*
" Form build_body_of_mail
*&-----------------------------------------------------------*
FORM BUILD_BODY_OF_MAIL USING L_MESSAGE.
W_BODY_MSG = L_MESSAGE.
APPEND W_BODY_MSG TO I_BODY_MSG.
CLEAR W_BODY_MSG.
ENDFORM. " build_body_of_mail
Within your user command module, you need to implement the above functionality.
Besides this, you need to make sure that email settings are configured in your system.
12-10-2013 10:41 AM
Hi Sharbani,
This is the sample code for sending an internal table as an attachment.
*&---------------------------------------------------------------------*
*& Report ZTEST_EMAIL
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_EMAIL.
**--------------------------------------------------------*
*" Data retrieval related declarations
**--------------------------------------------------------*
TYPES:
BEGIN OF T_EKBE1,
EBELN TYPE ebeln,
EBELP TYPE ebelp,
GJAHR TYPE gjahr,
MATNR TYPE matnr,
DMBTR TYPE dmbtr,
END OF T_EKBE1.
TYPES:
BEGIN OF T_EKBE,
EBELN(10) TYPE c,
EBELP(5) TYPE c,
GJAHR(4) TYPE c,
MATNR(18) TYPE c,
DMBTR(13) TYPE c,
END OF T_EKBE.
DATA: W_EKBE TYPE T_EKBE.
DATA:
I_EKBE TYPE STANDARD TABLE OF T_EKBE.
DATA: W_EKBE1 TYPE T_EKBE1.
DATA:
I_EKBE1 TYPE STANDARD TABLE OF T_EKBE1.
*--------------------------------------------------------*
" Mail related declarations
*--------------------------------------------------------*
"Variables
DATA :
G_SENT_TO_ALL TYPE SONV-FLAG,
G_TAB_LINES TYPE I.
"Types
TYPES:
T_DOCUMENT_DATA TYPE SODOCCHGI1,
T_PACKING_LIST TYPE SOPCKLSTI1,
T_ATTACHMENT TYPE SOLISTI1,
T_BODY_MSG TYPE SOLISTI1,
T_RECEIVERS TYPE SOMLRECI1.
"Workareas
DATA :
W_DOCUMENT_DATA TYPE T_DOCUMENT_DATA,
W_PACKING_LIST TYPE T_PACKING_LIST,
W_ATTACHMENT TYPE T_ATTACHMENT,
W_BODY_MSG TYPE T_BODY_MSG,
W_RECEIVERS TYPE T_RECEIVERS.
"Internal Tables
DATA :
I_DOCUMENT_DATA TYPE STANDARD TABLE OF T_DOCUMENT_DATA,
I_PACKING_LIST TYPE STANDARD TABLE OF T_PACKING_LIST,
I_ATTACHMENT TYPE STANDARD TABLE OF T_ATTACHMENT,
I_BODY_MSG TYPE STANDARD TABLE OF T_BODY_MSG,
I_RECEIVERS TYPE STANDARD TABLE OF T_RECEIVERS.
*--------------------------------------------------------*
Start-of-selection.
*--------------------------------------------------------*
START-OF-SELECTION.
PERFORM GET_DATA.
PERFORM BUILD_XLS_DATA_TABLE.
*--------------------------------------------------------*
"End-of-selection.
*--------------------------------------------------------*
END-OF-SELECTION.
PERFORM SEND_MAIL.
*&--------------------------------------------------------*
"Form get_data from PA0001
*&--------------------------------------------------------*
FORM GET_DATA.
SELECT EBELN
EBELP
GJAHR
MATNR
DMBTR
FROM EKBE
INTO CORRESPONDING FIELDS OF TABLE I_EKBE1
UP TO 10 ROWS.
loop at i_ekbe1 into w_ekbe1.
MOVE-CORRESPONDING w_ekbe1 to w_ekbe.
append w_ekbe to i_ekbe.
endloop.
ENDFORM. " get_data
*&---------------------------------------------------------*
"Form build_xls_data_table
*&---------------------------------------------------------*
FORM BUILD_XLS_DATA_TABLE.
"If you have Unicode check active in program attributes then
"you will need to declare constants as follows.
CLASS CL_ABAP_CHAR_UTILITIES DEFINITION LOAD.
CONSTANTS:
CON_TAB TYPE C VALUE CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB,
CON_CRET TYPE C VALUE CL_ABAP_CHAR_UTILITIES=>CR_LF.
CONCATENATE 'EBELN' 'EBELP' 'GJAHR' 'MATNR' 'DMBTR'
INTO W_ATTACHMENT
SEPARATED BY CON_TAB.
CONCATENATE CON_CRET
W_ATTACHMENT
INTO W_ATTACHMENT.
APPEND W_ATTACHMENT TO I_ATTACHMENT.
CLEAR W_ATTACHMENT.
LOOP AT I_EKBE INTO W_EKBE.
CONCATENATE W_EKBE-ebeln
W_EKBE-ebelp
W_EKBE-gjahr
W_EKBE-matnr
W_EKBE-dmbtr
INTO W_ATTACHMENT
SEPARATED BY CON_TAB.
CONCATENATE CON_CRET W_ATTACHMENT
INTO W_ATTACHMENT.
APPEND W_ATTACHMENT TO I_ATTACHMENT.
CLEAR W_ATTACHMENT.
ENDLOOP.
ENDFORM. "build_xls_data_table
*&----------------------------------------------------------*
"Form send_mail
"---------------
"PACKING LIST
"This table requires information about how the data in the
"tables OBJECT_HEADER, CONTENTS_BIN and CONTENTS_TXT are to
"be distributed to the documents and its attachments.The first
"row is for the document, the following rows are each for one
"attachment.
*&-----------------------------------------------------------*
FORM SEND_MAIL .
"Subject of the mail.
W_DOCUMENT_DATA-OBJ_NAME = 'MAIL_TO_HEAD'.
W_DOCUMENT_DATA-OBJ_DESCR = 'Regarding Mail Program by SAP ABAP'.
"Body of the mail
PERFORM BUILD_BODY_OF_MAIL
USING:SPACE,
'Hi,',
'I am fine. How are you? How are you doing ? ',
'This program has been created to send simple mail',
'with Subject,Body with Address of the sender. ',
'Regards,',
'Blog Admin,',
'SAP HR Technical Consultant.'.
"Write Packing List for Body
DESCRIBE TABLE I_BODY_MSG LINES G_TAB_LINES.
W_PACKING_LIST-HEAD_START = 1.
W_PACKING_LIST-HEAD_NUM = 0.
W_PACKING_LIST-BODY_START = 1.
W_PACKING_LIST-BODY_NUM = G_TAB_LINES.
W_PACKING_LIST-DOC_TYPE = 'RAW'.
APPEND W_PACKING_LIST TO I_PACKING_LIST.
CLEAR W_PACKING_LIST.
"Write Packing List for Attachment
W_PACKING_LIST-TRANSF_BIN = SPACE.
W_PACKING_LIST-HEAD_START = 1.
W_PACKING_LIST-HEAD_NUM = 1.
W_PACKING_LIST-BODY_START = G_TAB_LINES + 1.
DESCRIBE TABLE I_ATTACHMENT LINES W_PACKING_LIST-BODY_NUM.
W_PACKING_LIST-DOC_TYPE = 'XXL'.
W_PACKING_LIST-OBJ_DESCR = 'Excell Attachment'.
W_PACKING_LIST-OBJ_NAME = 'XLS_ATTACHMENT'.
W_PACKING_LIST-DOC_SIZE = W_PACKING_LIST-BODY_NUM * 255.
APPEND W_PACKING_LIST TO I_PACKING_LIST.
CLEAR W_PACKING_LIST.
APPEND LINES OF I_ATTACHMENT TO I_BODY_MSG.
"Fill the document data and get size of attachment
W_DOCUMENT_DATA-OBJ_LANGU = SY-LANGU.
READ TABLE I_BODY_MSG INTO W_BODY_MSG INDEX G_TAB_LINES.
W_DOCUMENT_DATA-DOC_SIZE = ( G_TAB_LINES - 1 ) * 255 + STRLEN( W_BODY_MSG ).
"Receivers List.
W_RECEIVERS-REC_TYPE = 'U'. "Internet address
W_RECEIVERS-RECEIVER = 'abc@xyz.com'.
W_RECEIVERS-COM_TYPE = 'INT'.
W_RECEIVERS-NOTIF_DEL = 'X'.
W_RECEIVERS-NOTIF_NDEL = 'X'.
APPEND W_RECEIVERS TO I_RECEIVERS .
CLEAR:W_RECEIVERS.
"Function module to send mail to Recipients
CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
EXPORTING
DOCUMENT_DATA = W_DOCUMENT_DATA
PUT_IN_OUTBOX = 'X'
COMMIT_WORK = 'X'
IMPORTING
SENT_TO_ALL = G_SENT_TO_ALL
TABLES
PACKING_LIST = I_PACKING_LIST
CONTENTS_TXT = I_BODY_MSG
RECEIVERS = I_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.
IF SY-SUBRC = 0 .
MESSAGE I303(ME) WITH 'Mail has been Successfully Sent.'.
ELSE.
WAIT UP TO 2 SECONDS.
"This program starts the SAPconnect send process.
SUBMIT RSCONN01 WITH MODE = 'INT'
WITH OUTPUT = 'X'
AND RETURN.
ENDIF.
ENDFORM. " send_mail
*&-----------------------------------------------------------*
" Form build_body_of_mail
*&-----------------------------------------------------------*
FORM BUILD_BODY_OF_MAIL USING L_MESSAGE.
W_BODY_MSG = L_MESSAGE.
APPEND W_BODY_MSG TO I_BODY_MSG.
CLEAR W_BODY_MSG.
ENDFORM. " build_body_of_mail
Within your user command module, you need to implement the above functionality.
Besides this, you need to make sure that email settings are configured in your system.
12-10-2013 11:21 AM
12-10-2013 10:48 AM
12-11-2013 3:21 AM
Hi,
It was for report program and its done. Thanks.
Regards,
Sharbani.
12-11-2013 3:22 AM