Friday, November 19, 2010

SEND EMAIL IN ABAP PROGRAM (PART 2) : TABLE AND EXCEL FILE ATTACHMENT

SEND EMAIL IN ABAP PROGRAM (PART 2)
TABLE AND EXCEL FILE ATTACHMENT
         
          One modification that we can make from this is how to send internal table and compile it into excel file then send it as attachment in email.

Below is the sample code :

1.     a. Data Declaration
DATA: t_mailrecipients  LIKE somlreci1 OCCURS WITH HEADER LINE,
      t_mailtxt         
TYPE STANDARD TABLE OF soli      WITH HEADER LINE,
      t_attachment      
TYPE STANDARD TABLE OF solisti1  WITH HEADER LINE,
      t_mailsubject     
TYPE sodocchgi1,
      t_packing_list    
TYPE STANDARD TABLE OF sopcklsti1 WITH HEADER LINE,
      t_scarr 
TYPE TABLE OF scarr WITH HEADER LINE,
      d_cnt             
TYPE i,
      d_nama_xls(12) 
TYPE c.

2.     b. Input Parameter
SELECTION-SCREEN BEGIN OF BLOCK blok1 WITH FRAME TITLE text-001.
PARAMETERS: p_email 
TYPE so_recname DEFAULT 'mas.trias@gmail.com'.
PARAMETERS: p_user 
TYPE so_recname DEFAULT 'GUEST01'.
PARAMETERS: p_excel(8) 
DEFAULT 'SCARR'.
SELECTION-SCREEN END OF BLOCK blok1.

3.     c. Set Email Recipients
REFRESH t_mailrecipients.
CLEAR t_mailrecipients.
MOVE: p_user 
TO t_mailrecipients-receiver,
      
'X'      TO t_mailrecipients-express,
      
'B'      TO t_mailrecipients-rec_type.
APPEND t_mailrecipients.

CLEAR t_mailrecipients.
MOVE: p_email 
TO t_mailrecipients-receiver,
      
'U'      TO t_mailrecipients-rec_type.
APPEND t_mailrecipients.

d. Email Content
Example, we want to send data from SCARR.

* Get data.
SELECT FROM scarr INTO TABLE t_scarr.

* content email
t_mailtxt = 
'Try to make attachment in .XLS with data is below:'.
APPEND t_mailtxt. CLEAR t_mailtxt.

CONCATENATE 'CARRID' 'CARRNAME'
                      
INTO t_mailtxt-line SEPARATED BY space.
APPEND t_mailtxt.CLEAR t_mailtxt.

LOOP AT t_scarr.
  
CONCATENATE t_scarr-carrid t_scarr-carrname
                        
INTO t_mailtxt-line SEPARATED BY space.
  
APPEND t_mailtxt.CLEAR t_mailtxt.
ENDLOOP.

5.     e. Set to Excel File
Using Class : CL_ABAP_CHAR_UTILITIES

* excel data
LOOP AT t_scarr.
  
CONCATENATE t_scarr-carrid t_scarr-carrname
              
INTO t_attachment SEPARATED BY
              cl_abap_char_utilities=>horizontal_tab.

  
CONCATENATE cl_abap_char_utilities=>newline t_attachment
              
INTO t_attachment.

  
APPEND t_attachment. CLEAR t_attachment.
ENDLOOP.

t_packing_list-transf_bin  = space.
t_packing_list-head_start  = 1.
t_packing_list-head_num    = 
0.
t_packing_list-body_start  = 
1.
t_packing_list-body_num    = LINES( t_mailtxt ).
t_packing_list-doc_type    = 
'RAW'.
APPEND t_packing_list.
CLEAR t_packing_list.

CONCATENATE p_excel '.xls' INTO d_nama_xls.

t_packing_list-transf_bin  = 
'X'.
t_packing_list-head_start  = 
1.
t_packing_list-head_num    = 
1.
t_packing_list-body_start  = 
1.
t_packing_list-body_num    = LINES( t_attachment ).
t_packing_list-doc_type    = 
'XLS'" You can give RAW incase if you want just a txt file.
t_packing_list-obj_name    = d_nama_xls.
t_packing_list-obj_descr   = d_nama_xls.
t_packing_list-doc_size    = t_packing_list-body_num * 
255.
APPEND t_packing_list.
CLEAR t_packing_list.

7.     f. Set Email Subject

t_mailsubject-obj_name     = 'MAILATTACH'.
t_mailsubject-obj_langu    = sy-langu.
t_mailsubject-obj_descr    = 
'Message with excel file attached'.
t_mailsubject-sensitivty   = 
'F'.
d_cnt = LINES( t_attachment ).
t_mailsubject-doc_size     = ( d_cnt - 
) * 255 + STRLEN( t_attachment ).

8.     Call FM  SO_NEW_DOCUMENT_ATT_SEND_API1

CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
  
EXPORTING
    document_data              = t_mailsubject
    put_in_outbox              = 
'X'
    commit_work                = 
'X'
  
TABLES
    packing_list               = t_packing_list
    contents_bin               = t_attachment
    contents_txt               = t_mailtxt
    receivers                  = t_mailrecipients
  
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 EQ 0.
  
COMMIT WORK.
  
SUBMIT rsconn01 WITH mode 'INT' AND RETURN.
  
MESSAGE i003(aq) WITH 'Message Sent Succesfully'.
ELSE.
  
MESSAGE i003(aq) WITH 'Message Not Sent'.
ENDIF.

                                                      EXECUTE REPORT