SAP ABAP Create Program to Send Emails with long text subject and specific Sender address and excel based attachment

SAP ABAP Create Program to Send Emails with long text subject and specific Sender address and excel based attachment

Hello guys,,,

this time i would like to show you how to code in SAP ABAP, a simple program which can create an excel based attachment, and adjust the subject with long text, and set the specific sender address..

GRAB YOUR COFFEE and Here we GO.

*&---------------------------------------------------------------------*
*&  Include           ZZMM_TKDN_EMAILF01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  F_GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM F_GET_DATA .



SELECT * FROM zmm_enhance INTO CORRESPONDING FIELDS OF TABLE lt_tkdnbukrs
  WHERE progname = 'ZTMM_TKDN' AND
       bukrs in S_BUKRS   "  bukrs = ekko-bukrs
*  AND datab <= ekko-aedat "  AND datab <= ekko-aedat
*  AND datbi > ekko-aedat.
  .
SELECT * FROM tvarvc INTO CORRESPONDING FIELDS OF TABLE lt_tkdnbsart
  WHERE name = 'ZTMM_TKDN_BSART'.
*Delete s_bukrs yang tidak ada di lt_tkdnbukrs.
*Delete s_bsart yang tidak ada di lt_tkdnbsart.
SELECT * FROM ztmm_tkdn INTO CORRESPONDING FIELDS OF TABLE lt_TKDN
  WHERE ebeln IN s_ebeln AND bukrs IN s_bukrs.

*Logic untuk get data OA
SELECT * FROM ekko INTO CORRESPONDING FIELDS OF TABLE lt_oa
  WHERE ebeln IN s_ebeln AND bukrs IN s_bukrs
  AND bsart IN s_bsart AND bstyp = 'K'.
*  AND ekgrp IN s_ekgrp AND kdate LE S_ENDAT
*  AND bedat IN s_endat.
  if lt_oa[] is NOT INITIAL.
SELECT * FROM ekpo
  INTO CORRESPONDING FIELDS OF TABLE lt_oaitem
  FOR ALL ENTRIES IN lt_oa
  WHERE ebeln = lt_oa-ebeln AND loekz = ''.
SELECT * FROM t024 INTO CORRESPONDING FIELDS OF TABLE lt_t024
  FOR ALL ENTRIES IN lt_oa
  WHERE ekgrp = lt_oa-ekgrp.
SELECT * FROM lfa1 INTO CORRESPONDING FIELDS OF TABLE lt_lfa1
  FOR ALL ENTRIES IN lt_oa
  WHERE lifnr = lt_oa-lifnr.

LOOP at lt_oa INTO ls_oa.
READ TABLE lt_tkdn INTO ls_tkdn WITH KEY ebeln = ls_oa-ebeln.
IF sy-subrc = 0.
*DELETE LINE lt_oa.
ELSE.
ls_final-ebeln = ls_oa-ebeln.
ls_final-bsart = ls_oa-bsart.
ls_final-bukrs = ls_oa-bukrs.
ls_final-lifnr = ls_oa-lifnr.

READ TABLE lt_lfa1 INTO ls_lfa1 WITH KEY lifnr = ls_oa-lifnr.
if sy-subrc eq 0.
ls_final-vendorname = lfa1-name1.
endif.

READ TABLE lt_t024 INTO ls_t024 WITH KEY ekgrp = ls_oa-ekgrp.
IF sy-subrc eq 0.
CONCATENATE ls_oa-ekgrp '-' ls_t024-eknam INTO ls_final-ekgrp.
*ls_final-ekgrp = ls_oa-ekgrp & “-“ & t024-eknam.
ENDIF.
*ls_final-startdate = ls_oa-kdatb.
CONCATENATE ls_oa-kdatb+6(2) '.' ls_oa-kdatb+4(2) '.' ls_oa-kdatb(4) INTO  ls_final-startdate.
CONCATENATE ls_oa-kdate+6(2) '.' ls_oa-kdate+4(2) '.' ls_oa-kdate(4) INTO  ls_final-enddate.
*ls_final-enddate = ls_oa-kdate.

if ls_oa-bstyp eq 'K'.
name = ls_oa-ebeln.
CALL FUNCTION 'READ_TEXT'
  EXPORTING
    CLIENT                        = SY-MANDT
    ID                            = 'K02'
    LANGUAGE                      = lv_lang
    NAME                          = name
    OBJECT                        = 'EKKO'
*   ARCHIVE_HANDLE                = 0
*   LOCAL_CAT                     = ' '
* IMPORTING
*   HEADER                        =
*   OLD_LINE_COUNTER              =
  TABLES
    LINES                         = LINES[]
 EXCEPTIONS
   ID                            = 1
   LANGUAGE                      = 2
   NAME                          = 3
   NOT_FOUND                     = 4
   OBJECT                        = 5
   REFERENCE_CHECK               = 6
   WRONG_ACCESS_TO_ARCHIVE       = 7
   OTHERS                        = 8
          .
IF LINES[] is NOT INITIAL.
  READ TABLE lines INTO sline INDEX 1.
         IF  sy-subrc eq 0.
            ls_final-Judul        = sline-TDLINE.
            IF ls_final-judul IS INITIAL.
              READ TABLE lt_oaitem INTO ls_oaitem WITH KEY ebeln = ls_oa-ebeln.
              if sy-subrc eq 0.
              ls_final-Judul = ls_oaitem-TXZ01.
            ENDIF.
            ENDIF.
         ENDIF.
ENDIF.
ENDIF.


ls_final-totalval    = ls_oa-ktwrt.
ls_final-penawal     = ls_oa-zmmpenawal.
ls_final-waers       = ls_oa-waers.
ls_final-zzmtkdn     = ls_oa-zzmmtkdn.
ls_final-ZBTSMINTKDN = ls_oa-ZBTSMINTKDN.
APPEND ls_final to lt_final.
clear ls_final.
ENDIF.
ENDLOOP.
ENDif.
*
*Logic untuk get data PO

*SELECT a~ebeln a~bukrs b~eindt
*  FROM ekko AS a
*  INNER JOIN eket as b ON a~ebeln = b~ebeln "AND c~etenr = '0001'
*  INTO CORRESPONDING FIELDS OF TABLE lt_po
*WHERE a~ebeln IN s_ebeln AND a~bukrs IN s_bukrs
*  AND a~bstyp = 'F' AND a~ekgrp IN s_ekgrp AND  a~bedat IN S_ENDAT
**  AND c~eindt LT s_enddate
  .
  BREAK t_fachrezar.
SELECT * FROM ekko
  INTO TABLE lt_PO
  WHERE ebeln in s_ebeln AND bukrs in s_bukrs AND bstyp = 'F' AND ekgrp in s_ekgrp AND bedat in S_ENDAT.
*  AND a~zzmtkdn IS NOT initial AND a~zbtsmintkdn IS NOT INITIAL.
 if lt_po[] IS NOT INITIAL.

DATA : lt_eket TYPE TABLE OF eket,
       ls_eket TYPE eket,
       lt_ekpo TYPE TABLE OF ekpo,
       ls_ekpo TYPE ekpo.
SELECT * FROM eket INTO TABLE lt_eket
  FOR ALL ENTRIES IN lt_po
  WHERE ebeln eq lt_po-ebeln AND etenr = '0001' .

SELECT * FROM ekpo INTO TABLE lt_ekpo
  FOR ALL ENTRIES IN lt_po
  WHERE  ebeln = lt_po-ebeln AND loekz eq space."AND etenr = '0001'.

SELECT * FROM t024 APPENDING TABLE lt_t024 "INTO CORRESPONDING FIELDS OF TABLE lt_t024
  FOR ALL ENTRIES IN lt_po
  WHERE ekgrp = lt_po-ekgrp.
 
LOOP AT lt_po INTO ls_po.
READ TABLE lt_eket INTO ls_eket WITH KEY ebeln = ls_po-ebeln.
IF sy-subrc eq 0.
  READ TABLE lt_ekpo INTO ls_ekpo WITH KEY ebelp = ls_eket-ebelp.
  IF sy-subrc eq 0.

  ELSE.
    delete lt_po WHERE ebeln = ls_po-ebeln.
  ENDIF.
ELSE.
    delete lt_po WHERE ebeln = ls_po-ebeln.
    ENDIF.
ENDLOOP.
*lt_poitem = lt_po2.
lt_poitem = lt_po2 = lt_po.

SORT lt_po2  DESCENDING by ebeln eq_eindt.

DELETE ADJACENT DUPLICATES FROM lt_po2 COMPARING ebeln.
*DELETE duplikasi lt_po2 berdasarkan ebeln. (agar PO dengan multilines dengan delivery date yang belum expired tidak ikut terkirim)

LOOP at lt_po2 into ls_po2 ."WHERE eq_eindt LT S_ENDAT.

READ TABLE lt_tkdn INTO ls_tkdn WITH KEY ebeln = ls_po2-ebeln.
IF sy-subrc = 0.
*DELETE LINE lt_poheader.
ELSE.
ls_final-ebeln = ls_po2-ebeln.
ls_final-bsart = ls_po2-bsart.
ls_final-bukrs = ls_po2-bukrs.
ls_final-lifnr = ls_po2-lifnr.
ls_final-vendorname = lfa1-name1.
*ls_final-ekgrp = lt_po2-ekgrp & “-“ & t024-eknam.

READ TABLE lt_t024 INTO ls_t024 WITH KEY ekgrp = ls_po2-ekgrp.
IF sy-subrc eq 0.
CONCATENATE ls_oa-ekgrp '-' ls_t024-eknam INTO ls_final-ekgrp.
ENDIF.


ls_final-startdate = ls_po2-bedat.
 
*Pakai FM READ_TEXT untuk lt_final-judul.
IF ls_po2-bstyp = 'F'.

name = ls_po2-ebeln.
CALL FUNCTION 'READ_TEXT'
  EXPORTING
    CLIENT                        = SY-MANDT
    ID                            = 'F02'
    LANGUAGE                      = lv_lang
    NAME                          = name
    OBJECT                        = 'EKKO'
*   ARCHIVE_HANDLE                = 0
*   LOCAL_CAT                     = ' '
* IMPORTING
*   HEADER                        =
*   OLD_LINE_COUNTER              =
  TABLES
    LINES                         = LINES[]
 EXCEPTIONS
   ID                            = 1
   LANGUAGE                      = 2
   NAME                          = 3
   NOT_FOUND                     = 4
   OBJECT                        = 5
   REFERENCE_CHECK               = 6
   WRONG_ACCESS_TO_ARCHIVE       = 7
   OTHERS                        = 8
          .
IF LINES[] is NOT INITIAL.
  READ TABLE lines INTO sline INDEX 1.
         IF  sy-subrc eq 0.
            ls_final-Judul        = sline-TDLINE.
            IF ls_final-judul IS INITIAL.
              READ TABLE lt_oaitem INTO ls_oaitem WITH KEY ebeln = ls_oa-ebeln.
              if sy-subrc eq 0.
              ls_final-Judul = ls_oaitem-TXZ01.
            ENDIF.
            ENDIF.
         ENDIF.
ENDIF.
ENDIF.


LOOP at lt_ekpo INTO ls_ekpo WHERE ebeln = ls_po2-ebeln.
  ls_final-totalval = ls_final-totalval + ls_ekpo-netwr.
ENDLOOP.

ls_final-penawal     = ls_po2-zmmpenawal.
ls_final-waers       = ls_po2-waers.
ls_final-zzmtkdn     = ls_po2-zzmmtkdn.
ls_final-ZBTSMINTKDN = ls_po2-ZBTSMINTKDN.
APPEND ls_final to lt_final.
CLEAR ls_final.
ENDIF.
ENDLOOP.
endif.
ENDFORM.                    " F_GET_DATA
*&---------------------------------------------------------------------*
*&      Form  F_PREP_XML
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM F_PREP_XML .

* Creating a ixml Factory
  l_ixml = cl_ixml=>create( ).

* Creating the DOM Object Model
  l_document = l_ixml->create_document( ).

* Create Root Node 'Workbook'
  l_element_root  = l_document->create_simple_element( name = 'Workbook'  parent = l_document ).
  l_element_root->set_attribute( name = 'xmlns'  value = 'urn:schemas-microsoft-com:office:spreadsheet' ).

  ns_attribute = l_document->create_namespace_decl( name = 'ss'  prefix = 'xmlns'  uri = 'urn:schemas-microsoft-com:office:spreadsheet' ).
  l_element_root->set_attribute_node( ns_attribute ).

  ns_attribute = l_document->create_namespace_decl( name = 'x'  prefix = 'xmlns'  uri = 'urn:schemas-microsoft-com:office:excel' ).
  l_element_root->set_attribute_node( ns_attribute ).

* Create node for document properties.
  r_element_properties = l_document->create_simple_element( name = 'TEST_REPORT'  parent = l_element_root ).
  l_value = sy-uname.
  l_document->create_simple_element( name = 'Author'  value = l_value  parent = r_element_properties  ).

* Styles
  r_styles = l_document->create_simple_element( name = 'Styles'  parent = l_element_root  ).

* Style for Header
  r_style  = l_document->create_simple_element( name = 'Style'   parent = r_styles  ).
  r_style->set_attribute_ns( name = 'ID'  prefix = 'ss'  value = 'Header' ).

  r_format  = l_document->create_simple_element( name = 'Font'  parent = r_style  ).
  r_format->set_attribute_ns( name = 'Bold'  prefix = 'ss'  value = '1' ).

  r_format  = l_document->create_simple_element( name = 'Interior' parent = r_style  ).
  r_format->set_attribute_ns( name = 'Color'   prefix = 'ss'  value = '#92D050' ).
  r_format->set_attribute_ns( name = 'Pattern' prefix = 'ss'  value = 'Solid' ).

  r_format  = l_document->create_simple_element( name = 'Alignment'  parent = r_style  ).
  r_format->set_attribute_ns( name = 'Vertical'  prefix = 'ss'  value = 'Center' ).
  r_format->set_attribute_ns( name = 'WrapText'  prefix = 'ss'  value = '1' ).

  r_border  = l_document->create_simple_element( name = 'Borders'  parent = r_style ).
  r_format  = l_document->create_simple_element( name = 'Border'   parent = r_border  ).
  r_format->set_attribute_ns( name = 'Position'  prefix = 'ss'  value = 'Bottom' ).
  r_format->set_attribute_ns( name = 'LineStyle'  prefix = 'ss'  value = 'Continuous' ).
  r_format->set_attribute_ns( name = 'Weight'  prefix = 'ss'  value = '1' ).

  r_format  = l_document->create_simple_element( name = 'Border'   parent = r_border  ).
  r_format->set_attribute_ns( name = 'Position'  prefix = 'ss'  value = 'Left' ).
  r_format->set_attribute_ns( name = 'LineStyle'  prefix = 'ss'  value = 'Continuous' ).
  r_format->set_attribute_ns( name = 'Weight'  prefix = 'ss'  value = '1' ).

  r_format  = l_document->create_simple_element( name = 'Border'   parent = r_border  ).
  r_format->set_attribute_ns( name = 'Position'  prefix = 'ss'  value = 'Top' ).
  r_format->set_attribute_ns( name = 'LineStyle'  prefix = 'ss'  value = 'Continuous' ).
  r_format->set_attribute_ns( name = 'Weight'  prefix = 'ss'  value = '1' ).

  r_format  = l_document->create_simple_element( name = 'Border'   parent = r_border  ).
  r_format->set_attribute_ns( name = 'Position'  prefix = 'ss'  value = 'Right' ).
  r_format->set_attribute_ns( name = 'LineStyle'  prefix = 'ss'  value = 'Continuous' ).
  r_format->set_attribute_ns( name = 'Weight'  prefix = 'ss'  value = '1' ).

* Style for Data
  r_style1  = l_document->create_simple_element( name = 'Style'   parent = r_styles  ).
  r_style1->set_attribute_ns( name = 'ID'  prefix = 'ss'  value = 'Data' ).

  r_border  = l_document->create_simple_element( name = 'Borders'  parent = r_style1 ).
  r_format  = l_document->create_simple_element( name = 'Border'   parent = r_border  ).
  r_format->set_attribute_ns( name = 'Position'  prefix = 'ss'  value = 'Bottom' ).
  r_format->set_attribute_ns( name = 'LineStyle'  prefix = 'ss'  value = 'Continuous' ).
  r_format->set_attribute_ns( name = 'Weight'  prefix = 'ss'  value = '1' ).

  r_format  = l_document->create_simple_element( name = 'Border'   parent = r_border  ).
  r_format->set_attribute_ns( name = 'Position'  prefix = 'ss'  value = 'Left' ).
  r_format->set_attribute_ns( name = 'LineStyle'  prefix = 'ss'  value = 'Continuous' ).
  r_format->set_attribute_ns( name = 'Weight'  prefix = 'ss'  value = '1' ).

  r_format  = l_document->create_simple_element( name = 'Border'   parent = r_border  ).
  r_format->set_attribute_ns( name = 'Position'  prefix = 'ss'  value = 'Top' ).
  r_format->set_attribute_ns( name = 'LineStyle'  prefix = 'ss'  value = 'Continuous' ).
  r_format->set_attribute_ns( name = 'Weight'  prefix = 'ss'  value = '1' ).

  r_format  = l_document->create_simple_element( name = 'Border'   parent = r_border  ).
  r_format->set_attribute_ns( name = 'Position'  prefix = 'ss'  value = 'Right' ).
  r_format->set_attribute_ns( name = 'LineStyle'  prefix = 'ss'  value = 'Continuous' ).
  r_format->set_attribute_ns( name = 'Weight'  prefix = 'ss'  value = '1' ).

* Style for TL Red
  r_style2  = l_document->create_simple_element( name = 'Style'   parent = r_styles  ).
  r_style2->set_attribute_ns( name = 'ID'  prefix = 'ss'  value = 'TLRed' ).

  r_border2  = l_document->create_simple_element( name = 'Borders'  parent = r_style2 ).
  r_format   = l_document->create_simple_element( name = 'Border'   parent = r_border2  ).
  r_format->set_attribute_ns( name = 'Position'  prefix = 'ss'  value = 'Bottom' ).
  r_format->set_attribute_ns( name = 'LineStyle'  prefix = 'ss'  value = 'Continuous' ).
  r_format->set_attribute_ns( name = 'Weight'  prefix = 'ss'  value = '1' ).

  r_format  = l_document->create_simple_element( name = 'Border'   parent = r_border2  ).
  r_format->set_attribute_ns( name = 'Position'  prefix = 'ss'  value = 'Left' ).
  r_format->set_attribute_ns( name = 'LineStyle'  prefix = 'ss'  value = 'Continuous' ).
  r_format->set_attribute_ns( name = 'Weight'  prefix = 'ss'  value = '1' ).

  r_format  = l_document->create_simple_element( name = 'Border'   parent = r_border2  ).
  r_format->set_attribute_ns( name = 'Position'  prefix = 'ss'  value = 'Top' ).
  r_format->set_attribute_ns( name = 'LineStyle'  prefix = 'ss'  value = 'Continuous' ).
  r_format->set_attribute_ns( name = 'Weight'  prefix = 'ss'  value = '1' ).

  r_format  = l_document->create_simple_element( name = 'Border'   parent = r_border2  ).
  r_format->set_attribute_ns( name = 'Position'  prefix = 'ss'  value = 'Right' ).
  r_format->set_attribute_ns( name = 'LineStyle'  prefix = 'ss'  value = 'Continuous' ).
  r_format->set_attribute_ns( name = 'Weight'  prefix = 'ss'  value = '1' ).

  r_format  = l_document->create_simple_element( name = 'Interior' parent = r_style2  ).
  r_format->set_attribute_ns( name = 'Color'   prefix = 'ss'  value = '#f00232' ).
  r_format->set_attribute_ns( name = 'Pattern' prefix = 'ss'  value = 'Solid' ).

* Style for TL Green
  r_style3  = l_document->create_simple_element( name = 'Style'   parent = r_styles  ).
  r_style3->set_attribute_ns( name = 'ID'  prefix = 'ss'  value = 'TLGreen' ).

  r_border3  = l_document->create_simple_element( name = 'Borders'  parent = r_style3 ).
  r_format   = l_document->create_simple_element( name = 'Border'   parent = r_border3  ).
  r_format->set_attribute_ns( name = 'Position'  prefix = 'ss'  value = 'Bottom' ).
  r_format->set_attribute_ns( name = 'LineStyle'  prefix = 'ss'  value = 'Continuous' ).
  r_format->set_attribute_ns( name = 'Weight'  prefix = 'ss'  value = '1' ).

  r_format  = l_document->create_simple_element( name = 'Border'   parent = r_border3  ).
  r_format->set_attribute_ns( name = 'Position'  prefix = 'ss'  value = 'Left' ).
  r_format->set_attribute_ns( name = 'LineStyle'  prefix = 'ss'  value = 'Continuous' ).
  r_format->set_attribute_ns( name = 'Weight'  prefix = 'ss'  value = '1' ).

  r_format  = l_document->create_simple_element( name = 'Border'   parent = r_border3  ).
  r_format->set_attribute_ns( name = 'Position'  prefix = 'ss'  value = 'Top' ).
  r_format->set_attribute_ns( name = 'LineStyle'  prefix = 'ss'  value = 'Continuous' ).
  r_format->set_attribute_ns( name = 'Weight'  prefix = 'ss'  value = '1' ).

  r_format  = l_document->create_simple_element( name = 'Border'   parent = r_border3  ).
  r_format->set_attribute_ns( name = 'Position'  prefix = 'ss'  value = 'Right' ).
  r_format->set_attribute_ns( name = 'LineStyle'  prefix = 'ss'  value = 'Continuous' ).
  r_format->set_attribute_ns( name = 'Weight'  prefix = 'ss'  value = '1' ).

  r_format  = l_document->create_simple_element( name = 'Interior' parent = r_style3  ).
  r_format->set_attribute_ns( name = 'Color'   prefix = 'ss'  value = '#92D050' ).
  r_format->set_attribute_ns( name = 'Pattern' prefix = 'ss'  value = 'Solid' ).

* Worksheet
  r_worksheet = l_document->create_simple_element( name = 'Worksheet'  parent = l_element_root ).
  r_worksheet->set_attribute_ns( name = 'Name'  prefix = 'ss'  value = 'Sheet1' ).

* Table
  r_table = l_document->create_simple_element( name = 'Table'  parent = r_worksheet ).
  r_table->set_attribute_ns( name = 'FullColumns'  prefix = 'x'  value = '1' ).
  r_table->set_attribute_ns( name = 'FullRows'     prefix = 'x'  value = '1' ).

* Column Formatting
  r_column = l_document->create_simple_element( name = 'Column'  parent = r_table ).
  r_column->set_attribute_ns( name = 'Width'  prefix = 'ss'  value = '30' ).

  r_column = l_document->create_simple_element( name = 'Column'  parent = r_table ).
  r_column->set_attribute_ns( name = 'Width'  prefix = 'ss'  value = '50' ).

  r_column = l_document->create_simple_element( name = 'Column'  parent = r_table ).
  r_column->set_attribute_ns( name = 'Width'  prefix = 'ss'  value = '50' ).

  r_column = l_document->create_simple_element( name = 'Column'  parent = r_table ).
  r_column->set_attribute_ns( name = 'Width'  prefix = 'ss'  value = '150' ).

  r_column = l_document->create_simple_element( name = 'Column'  parent = r_table ).
  r_column->set_attribute_ns( name = 'Width'  prefix = 'ss'  value = '50' ).

  r_column = l_document->create_simple_element( name = 'Column'  parent = r_table ).
  r_column->set_attribute_ns( name = 'Width'  prefix = 'ss'  value = '70' ).

  r_column = l_document->create_simple_element( name = 'Column'  parent = r_table ).
  r_column->set_attribute_ns( name = 'Width'  prefix = 'ss'  value = '150' ).

  r_column = l_document->create_simple_element( name = 'Column'  parent = r_table ).
  r_column->set_attribute_ns( name = 'Width'  prefix = 'ss'  value = '60' ).

  r_column = l_document->create_simple_element( name = 'Column'  parent = r_table ).
  r_column->set_attribute_ns( name = 'Width'  prefix = 'ss'  value = '60' ).

  r_column = l_document->create_simple_element( name = 'Column'  parent = r_table ).
  r_column->set_attribute_ns( name = 'Width'  prefix = 'ss'  value = '100' ).

  r_column = l_document->create_simple_element( name = 'Column'  parent = r_table ).
  r_column->set_attribute_ns( name = 'Width'  prefix = 'ss'  value = '30' ).

  r_column = l_document->create_simple_element( name = 'Column'  parent = r_table ).
  r_column->set_attribute_ns( name = 'Width'  prefix = 'ss'  value = '100' ).

  r_column = l_document->create_simple_element( name = 'Column'  parent = r_table ).
  r_column->set_attribute_ns( name = 'Width'  prefix = 'ss'  value = '30' ).

  r_column = l_document->create_simple_element( name = 'Column'  parent = r_table ).
  r_column->set_attribute_ns( name = 'Width'  prefix = 'ss'  value = '50' ).

** Blank Row
*  r_row = l_document->create_simple_element( name = 'Row'  parent = r_table ).

* Column Headers Row
  r_row = l_document->create_simple_element( name = 'Row'  parent = r_table ).
  r_row->set_attribute_ns( name = 'AutoFitHeight'  prefix = 'ss'  value = '1' ).

** Sequence No.
*  r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
*  r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Header' ).
*  r_data = l_document->create_simple_element( name = 'Data'  value = 'No.'  parent = r_cell ).
*  r_data->set_attribute_ns( name = 'Type'  prefix = 'ss' value = 'String' ).

* Purchasing Doc
  r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
  r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Header' ).
  r_data = l_document->create_simple_element( name = 'Data'  value = 'Purchasing Doc'  parent = r_cell ).
  r_data->set_attribute_ns( name = 'Type'  prefix = 'ss' value = 'String' ).

* Document Type
  r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
  r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Header' ).
  r_data = l_document->create_simple_element( name = 'Data'  value = 'Document Type'  parent = r_cell ).
  r_data->set_attribute_ns( name = 'Type'  prefix = 'ss' value = 'String' ).

* Cocd
  r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
  r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Header' ).
  r_data = l_document->create_simple_element( name = 'Data'  value = 'Cocd'  parent = r_cell ).
  r_data->set_attribute_ns( name = 'Type'  prefix = 'ss' value = 'String' ).

* Vendor
  r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
  r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Header' ).
  r_data = l_document->create_simple_element( name = 'Data'  value = 'Vendor'  parent = r_cell ).
  r_data->set_attribute_ns( name = 'Type'  prefix = 'ss' value = 'String' ).

* Vendor Name
  r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
  r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Header' ).
  r_data = l_document->create_simple_element( name = 'Data'  value = 'Vendor Name'  parent = r_cell ).
  r_data->set_attribute_ns( name = 'Type'  prefix = 'ss' value = 'String' ).

* Purchasing Group
  r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
  r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Header' ).
  r_data = l_document->create_simple_element( name = 'Data'  value = 'Purchasing Group'  parent = r_cell ).
  r_data->set_attribute_ns( name = 'Type'  prefix = 'ss' value = 'String' ).

* Start Date
  r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
  r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Header' ).
  r_data = l_document->create_simple_element( name = 'Data'  value = 'Start Date'  parent = r_cell ).
  r_data->set_attribute_ns( name = 'Type'  prefix = 'ss' value = 'String' ).

* End Date
  r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
  r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Header' ).
  r_data = l_document->create_simple_element( name = 'Data'  value = 'End Date'  parent = r_cell ).
  r_data->set_attribute_ns( name = 'Type'  prefix = 'ss' value = 'String' ).

* Judul
  r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
  r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Header' ).
  r_data = l_document->create_simple_element( name = 'Data'  value = 'Judul'  parent = r_cell ).
  r_data->set_attribute_ns( name = 'Type'  prefix = 'ss' value = 'String' ).

* Total Value
  r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
  r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Header' ).
  r_data = l_document->create_simple_element( name = 'Data'  value = 'Total Value'  parent = r_cell ).
  r_data->set_attribute_ns( name = 'Type'  prefix = 'ss' value = 'String' ).

* Penawaran Awal
  r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
  r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Header' ).
  r_data = l_document->create_simple_element( name = 'Data'  value = 'Penawaran Awal'  parent = r_cell ).
  r_data->set_attribute_ns( name = 'Type'  prefix = 'ss' value = 'String' ).

* Currency
  r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
  r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Header' ).
  r_data = l_document->create_simple_element( name = 'Data'  value = 'Currency'  parent = r_cell ).
  r_data->set_attribute_ns( name = 'Type'  prefix = 'ss' value = 'String' ).

* Komitmen TKDN
  r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
  r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Header' ).
  r_data = l_document->create_simple_element( name = 'Data'  value = 'Komitmen TKDN'  parent = r_cell ).
  r_data->set_attribute_ns( name = 'Type'  prefix = 'ss' value = 'String' ).


* Batas Minimum TKDN
  r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
  r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Header' ).
  r_data = l_document->create_simple_element( name = 'Data'  value = 'Batas Minimum TKDN'  parent = r_cell ).
  r_data->set_attribute_ns( name = 'Type'  prefix = 'ss' value = 'String' ).

 
  loop at lt_final INTO ls_final.
    r_row = l_document->create_simple_element( name = 'Row'  parent = r_table ).

** No.
*    r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
*    r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Data' ).
*    l_value = sy-tabix.
*    CONDENSE l_value NO-GAPS.
*    r_data = l_document->create_simple_element( name = 'Data'  value = l_value   parent = r_cell ).           " Data
*    r_data->set_attribute_ns( name = 'Type'  prefix = 'ss'  value = 'Number' ).                               " Cell format

* Purchasing Doc
    r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
    r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Data' ).
    l_value = ls_final-EBELN.
    r_data = l_document->create_simple_element( name = 'Data'  value = l_value   parent = r_cell ).           " Data
    r_data->set_attribute_ns( name = 'Type'  prefix = 'ss'  value = 'String' ).                               " Cell format

* Document Type
    r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
    r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Data' ).
    l_value = ls_final-BSART.
    r_data = l_document->create_simple_element( name = 'Data'  value = l_value   parent = r_cell ).           " Data
    r_data->set_attribute_ns( name = 'Type'  prefix = 'ss'  value = 'String' ).                               " Cell format

* Cocd
    r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
    r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Data' ).
    l_value = ls_final-bukrs.
    r_data = l_document->create_simple_element( name = 'Data'  value = l_value   parent = r_cell ).           " Data
    r_data->set_attribute_ns( name = 'Type'  prefix = 'ss'  value = 'String' ).                               " Cell format

* Vendor
    r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
    r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Data' ).
    l_value = ls_final-lifnr .
    r_data = l_document->create_simple_element( name = 'Data'  value = l_value   parent = r_cell ).           " Data
    r_data->set_attribute_ns( name = 'Type'  prefix = 'ss'  value = 'String' ).                               " Cell format

* Vendor Name
    r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
    r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Data' ).
    l_value = ls_final-vendorname.
    r_data = l_document->create_simple_element( name = 'Data'  value = l_value   parent = r_cell ).          " Data
    r_data->set_attribute_ns( name = 'Type'  prefix = 'ss'  value = 'String' ).                              " Cell format

* Purchasing Group
    r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
    r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Data' ).
    l_value = ls_final-ekgrp.
    r_data = l_document->create_simple_element( name = 'Data'  value = l_value   parent = r_cell ).          " Data
    r_data->set_attribute_ns( name = 'Type'  prefix = 'ss'  value = 'String' ).                              " Cell format

* startdate
    r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
    r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Data' ).
    l_value = ls_final-startdate.
    r_data = l_document->create_simple_element( name = 'Data'  value = l_value   parent = r_cell ).           " Data
    r_data->set_attribute_ns( name = 'Type'  prefix = 'ss'  value = 'String' ).                               " Cell format

* End date
    r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
    r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Data' ).
    l_value = ls_final-enddate .
    r_data = l_document->create_simple_element( name = 'Data'  value = l_value   parent = r_cell ).           " Data
    r_data->set_attribute_ns( name = 'Type'  prefix = 'ss'  value = 'String' ).

* Judul
    r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
    r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Data' ).
    l_value = ls_final-judul.
    r_data = l_document->create_simple_element( name = 'Data'  value = l_value   parent = r_cell ).           " Data
    r_data->set_attribute_ns( name = 'Type'  prefix = 'ss'  value = 'String' ).



* Total Value
    r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
    r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Data' ).
    l_value = ls_final-totalval.
    r_data = l_document->create_simple_element( name = 'Data'  value = l_value   parent = r_cell ).           " Data
    r_data->set_attribute_ns( name = 'Type'  prefix = 'ss'  value = 'String' ).

* Penawaran Awal
    r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
    r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Data' ).
    l_value = ls_final-penawal .
    r_data = l_document->create_simple_element( name = 'Data'  value = l_value   parent = r_cell ).           " Data
    r_data->set_attribute_ns( name = 'Type'  prefix = 'ss'  value = 'String' ).

* Currency
    r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
    r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Data' ).
    l_value = ls_final-waers.
    r_data = l_document->create_simple_element( name = 'Data'  value = l_value   parent = r_cell ).           " Data
    r_data->set_attribute_ns( name = 'Type'  prefix = 'ss'  value = 'String' ).

* Komitment TKDN
    r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
    r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Data' ).
    l_value = ls_final-zzmtkdn.
    r_data = l_document->create_simple_element( name = 'Data'  value = l_value   parent = r_cell ).           " Data
    r_data->set_attribute_ns( name = 'Type'  prefix = 'ss'  value = 'String' ).

* Batas Minimum TKDN
    r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
    r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Data' ).
    l_value = ls_final-zbtsmintkdn.
    r_data = l_document->create_simple_element( name = 'Data'  value = l_value   parent = r_cell ).           " Data
    r_data->set_attribute_ns( name = 'Type'  prefix = 'ss'  value = 'String' ).

  ENDLOOP.

* Creating a Stream Factory
  l_streamfactory = l_ixml->create_stream_factory( ).

* Connect Internal XML Table to Stream Factory
  l_ostream = l_streamfactory->create_ostream_itable( table = l_xml_table ).

* Rendering the Document
  l_renderer = l_ixml->create_renderer( ostream  = l_ostream  document = l_document ).
  l_rc = l_renderer->render( ).

* Saving the XML Document
  l_xml_size = l_ostream->get_num_written_raw( ).
ENDFORM.                    " F_PREP_XML
*&---------------------------------------------------------------------*
*&      Form  F_SEND_EMAIL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM F_SEND_EMAIL USING u_mail TYPE bi_smtp_addr..

  DATA: objpack   LIKE sopcklsti1 OCCURS 2 WITH HEADER LINE.
  DATA: objhead   LIKE solisti1 OCCURS 1 WITH HEADER LINE.
  DATA: objbin    LIKE solix OCCURS 10 WITH HEADER LINE.
  DATA: objtxt    LIKE solisti1 OCCURS 10 WITH HEADER LINE.
  DATA: reclist   LIKE somlreci1 OCCURS 5 WITH HEADER LINE.
  DATA: doc_chng  LIKE sodocchgi1.
  DATA: tab_lines LIKE sy-tabix.
  DATA: l_num(3).
  DATA: subj_date(10) TYPE c.

* Mail Subject
  CONCATENATE 'Notifikasi List Outstanding' 'Dokumen untuk Capaian TKDN di cocd' S_BUKRS-LOW INTO doc_chng-obj_descr SEPARATED BY space.

  objtxt = '<body> <html>'.
  APPEND objtxt.

* Mail Contents
  objtxt = 'Dengan hormat,<br>'.
  APPEND objtxt.

  objtxt = '<br>'.
  APPEND objtxt.

  CONCATENATE 'Berikut kami sampaikan list outstanding purchasing document yang' '<br>' INTO objtxt SEPARATED BY space.              " Mail Contents
  APPEND objtxt.

  CONCATENATE 'sudah expired tetapi belum dilakukan penginputan capaian TKDN.' '<br>' INTO objtxt SEPARATED BY space.              " Mail Contents
  APPEND objtxt.

  objtxt = '<br>'.
  APPEND objtxt.

  CONCATENATE 'Silahkan dikoordinasikan ke pihak terkait dan dilakukan input' '<br>' INTO objtxt SEPARATED BY space.              " Mail Contents
  APPEND objtxt.

  CONCATENATE 'capaian TKDN melalui tcode ZM105.' '<br>' INTO objtxt SEPARATED BY space.              " Mail Contents
  APPEND objtxt.

  objtxt = '<br>'.
  APPEND objtxt.

  CONCATENATE 'Terima kasih.' '<br>' INTO objtxt SEPARATED BY space.              " Mail Contents
  APPEND objtxt.

  objtxt = '</body> </html>'.
  APPEND objtxt.


  DESCRIBE TABLE objtxt LINES tab_lines.
  READ TABLE objtxt INDEX tab_lines.
  doc_chng-doc_size = ( tab_lines - 1 ) * 255 + strlen( objtxt ).

* Packing List For the E-mail Body
  objpack-head_start = 1.
  objpack-head_num   = 0.
  objpack-body_start = 1.
  objpack-body_num   = tab_lines.
  objpack-doc_type   = 'HTML'.
  APPEND objpack.

* Creation of the Document Attachment
  LOOP AT l_xml_table INTO wa_xml.
    CLEAR objbin.
    objbin-line = wa_xml-data.
    APPEND objbin.
  ENDLOOP.

  DESCRIBE TABLE objbin LINES tab_lines.
  CONCATENATE 'Notifikasi List Outstanding' 'Dokumen untuk Capaian TKDN di cocd' S_BUKRS-LOW  INTO objhead SEPARATED BY space.

  APPEND objhead.

* Packing List For the E-mail Attachment
  objpack-transf_bin = 'X'.
  objpack-head_start = 1.
  objpack-head_num   = 0.
  objpack-body_start = 1.
  objpack-body_num = tab_lines.
  CONCATENATE 'Notifikasi List Outstanding' 'Dokumen untuk Capaian TKDN di cocd' S_BUKRS-LOW  INTO objpack-obj_descr SEPARATED BY space.
  objpack-doc_type = 'XLS'.
  objpack-doc_size = tab_lines * 255.
  APPEND objpack.

* Target Recipent
  REFRESH reclist.
  reclist-receiver = u_mail.
  reclist-rec_type = 'U'.
  APPEND reclist.

* Sending the document
  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
    EXPORTING
      document_data              = doc_chng
      commit_work                = 'X'
    TABLES
      packing_list               = objpack
      object_header              = objhead
      contents_txt               = objtxt
      contents_hex               = objbin
      receivers                  = reclist
    EXCEPTIONS
      too_many_receivers         = 1
      document_not_sent          = 2
      operation_no_authorization = 4
      OTHERS                     = 99.


ENDFORM.                    " F_SEND_EMAIL
*&---------------------------------------------------------------------*
*&      Form  F_SEND_EMAIL2
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_MAIL  text
*----------------------------------------------------------------------*
FORM F_SEND_EMAIL2  USING MAIL.

  DATA : main_text      TYPE bcsy_text.
  DATA : send_request  TYPE REF TO cl_bcs,
         send_requests TYPE REF TO cl_bcs.
  DATA : document             TYPE REF TO cl_document_bcs,
         documents            TYPE REF TO cl_document_bcs,
         t_attachment_header  TYPE soli_tab,
         wa_attachment_header LIKE LINE OF t_attachment_header.
  DATA : recipient      TYPE REF TO if_recipient_bcs.
  DATA : bcs_exception  TYPE REF TO cx_bcs.
  DATA : ls_reclist TYPE somlreci1.
  DATA : mailto TYPE ad_smtpadr,
         mailcc TYPE ad_smtpadr.
  DATA : sent_to_all    TYPE os_boolean.
  DATA : save_outbox    TYPE os_boolean.
  DATA : size TYPE sood-objlen.
  DATA :
         subject TYPE so_obj_des,
         sub_str TYPE string,
         attsubj TYPE sood-objdes.
  DATA : xdata     TYPE xstring,
         rawdata   TYPE solix_tab,
         bytecount TYPE i.
  DATA : lo_excel             TYPE REF TO zcl_excel,
         lo_worksheet         TYPE REF TO zcl_excel_worksheet,
         lo_style_header      TYPE REF TO zcl_excel_style,
         lo_style_cell        TYPE REF TO zcl_excel_style,
         lo_cell_date         TYPE REF TO zcl_excel_style,
         lo_style_wrap        TYPE REF TO zcl_excel_style,
         lv_style_header_guid TYPE zexcel_cell_style,
         lv_style_cell_guid   TYPE zexcel_cell_style,
         lv_cell_date_guid    TYPE zexcel_cell_style,
         lv_style_wrap_guid   TYPE zexcel_cell_style,
         lo_border_dark       TYPE REF TO zcl_excel_style_border,
         column_dimension     TYPE REF TO zcl_excel_worksheet_columndime.
  DATA : cl_writer TYPE REF TO zif_excel_writer,
         l_row     TYPE i,
         l_check   TYPE flag.
  DATA : ls_line  LIKE LINE OF main_text,
         ls_email TYPE ztmm_emailexp.
  DATA : reclist TYPE STANDARD TABLE OF somlreci1.
  DATA: lo_sender TYPE REF TO if_sender_bcs VALUE IS INITIAL. "sender
*  SELECT zemail
*      FROM ztmm_emailexp
*      INTO ls_reclist-receiver
*      WHERE zprog = sy-repid
*        AND zfunc = 'TO'
*        AND bukrs IN s_group. "--> PEDK979174 07.08.2018 By Yulian Req By Vika Add Filter Group for CICO-OSES
    ls_reclist-receiver = MAIL.
    ls_reclist-rec_type = 'U' .
    ls_reclist-express = 'X' .
    APPEND ls_reclist TO reclist .
*  ENDSELECT.

 

  DELETE reclist WHERE receiver IS INITIAL.

  CREATE OBJECT cl_writer TYPE zcl_excel_writer_2007.

  IF lo_excel IS INITIAL.
    CREATE OBJECT lo_excel.
  ENDIF.

  " Get active sheet
  lo_worksheet = lo_excel->get_active_worksheet( ).

  TRY.
      CALL METHOD lo_worksheet->set_title
        EXPORTING
          ip_title = 'Sheet TKDN'.
    CATCH zcx_excel .
  ENDTRY.

  IF lo_border_dark IS INITIAL.
    CREATE OBJECT lo_border_dark.
  ENDIF.

  lo_border_dark->border_color-rgb = zcl_excel_style_color=>c_black.
  lo_border_dark->border_style = zcl_excel_style_border=>c_border_thin.

  "Header: Center, Middle, Bold, Fill, Border
  lo_style_header = lo_excel->add_new_style( ).
  lo_style_header->font->bold = abap_true.
  lo_style_header->font->italic = abap_false.
  lo_style_header->font->color-rgb = zcl_excel_style_color=>c_black.
  lo_style_header->fill->filltype = zcl_excel_style_fill=>c_fill_solid.
  lo_style_header->fill->fgcolor-theme  = zcl_excel_style_color=>c_theme_accent6.
  lo_style_header->borders->allborders = lo_border_dark.
  lo_style_header->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_center.
  lo_style_header->alignment->vertical = zcl_excel_style_alignment=>c_vertical_center.
  lv_style_header_guid = lo_style_header->get_guid( ).

  "Cell:
  lo_style_cell = lo_excel->add_new_style( ).
  lo_style_cell->alignment->vertical = zcl_excel_style_alignment=>c_vertical_top.
  lo_style_cell->borders->allborders = lo_border_dark.
  lv_style_cell_guid = lo_style_cell->get_guid( ).

  "Cell DATE
  lo_cell_date = lo_excel->add_new_style( ).
*  lo_cell_date->alignment->vertical = zcl_excel_style_alignment=>c_vertical_top.
  lo_cell_date->borders->allborders = lo_border_dark.
  lo_cell_date->number_format->format_code = zcl_excel_style_number_format=>c_format_date_ddmmyyyy.
  lv_cell_date_guid = lo_cell_date->get_guid( ).

  "Wrap:
  lo_style_wrap = lo_excel->add_new_style( ).
  lo_style_wrap->borders->allborders = lo_border_dark.
  lo_style_wrap->alignment->horizontal = zcl_excel_style_alignment=>c_horizontal_justify.
  lo_style_wrap->alignment->vertical = zcl_excel_style_alignment=>c_vertical_top.
  lv_style_wrap_guid = lo_style_wrap->get_guid( ).

*** KOLOM HEADER
  TRY.
      lo_worksheet->set_cell( ip_row = 1 ip_column = 'A' ip_value  = 'Purchasing Doc'   ip_style = lv_style_header_guid ).
      lo_worksheet->set_cell( ip_row = 1 ip_column = 'B' ip_value  = 'Document Type'   ip_style = lv_style_header_guid ).
      lo_worksheet->set_cell( ip_row = 1 ip_column = 'C' ip_value  = 'Cocd'   ip_style = lv_style_header_guid ).
      lo_worksheet->set_cell( ip_row = 1 ip_column = 'D' ip_value  = 'Vendor'   ip_style = lv_style_header_guid ).
      lo_worksheet->set_cell( ip_row = 1 ip_column = 'E' ip_value  = 'Vendor Name'   ip_style = lv_style_header_guid ).
      lo_worksheet->set_cell( ip_row = 1 ip_column = 'F' ip_value  = 'Purchasing Group'   ip_style = lv_style_header_guid ).
      lo_worksheet->set_cell( ip_row = 1 ip_column = 'G' ip_value  = 'Start Date'   ip_style = lv_style_header_guid ).
      lo_worksheet->set_cell( ip_row = 1 ip_column = 'H' ip_value  = 'End Date'   ip_style = lv_style_header_guid ).
      lo_worksheet->set_cell( ip_row = 1 ip_column = 'I' ip_value  = 'Judul'   ip_style = lv_style_header_guid ).
      lo_worksheet->set_cell( ip_row = 1 ip_column = 'J' ip_value  = 'Total Value'   ip_style = lv_style_header_guid ).
      lo_worksheet->set_cell( ip_row = 1 ip_column = 'K' ip_value  = 'Penawaran Awal'   ip_style = lv_style_header_guid ).
      lo_worksheet->set_cell( ip_row = 1 ip_column = 'L' ip_value  = 'Currency'   ip_style = lv_style_header_guid ).
      lo_worksheet->set_cell( ip_row = 1 ip_column = 'M' ip_value  = 'Komitmen TKDN'   ip_style = lv_style_header_guid ).
      lo_worksheet->set_cell( ip_row = 1 ip_column = 'N' ip_value  = 'Batas Minimum TKDN'   ip_style = lv_style_header_guid ). 
    CATCH zcx_excel.
  ENDTRY.

  l_row = 1.

  LOOP AT LT_FINAL INTO ls_final.
    add 1 to l_row.
    TRY.
        lo_worksheet->set_cell( ip_row = l_row ip_column = 'A' ip_value = ls_final-ebeln       ip_style = lv_style_cell_guid ).
        lo_worksheet->set_cell( ip_row = l_row ip_column = 'B' ip_value = ls_final-bsart       ip_style = lv_style_cell_guid ).
        lo_worksheet->set_cell( ip_row = l_row ip_column = 'C' ip_value = ls_final-bukrs       ip_style = lv_style_cell_guid ).
        lo_worksheet->set_cell( ip_row = l_row ip_column = 'D' ip_value = ls_final-lifnr       ip_style = lv_style_cell_guid ).
        lo_worksheet->set_cell( ip_row = l_row ip_column = 'E' ip_value = ls_final-vendorname  ip_style = lv_cell_date_guid ).
        lo_worksheet->set_cell( ip_row = l_row ip_column = 'F' ip_value = ls_final-ekgrp       ip_style = lv_style_cell_guid ).
        lo_worksheet->set_cell( ip_row = l_row ip_column = 'G' ip_value = ls_final-startdate   ip_style = lv_style_cell_guid ).
        lo_worksheet->set_cell( ip_row = l_row ip_column = 'H' ip_value = ls_final-enddate     ip_style = lv_style_cell_guid ).
        lo_worksheet->set_cell( ip_row = l_row ip_column = 'I' ip_value = ls_final-judul       ip_style =  lv_style_cell_guid ).
        lo_worksheet->set_cell( ip_row = l_row ip_column = 'J' ip_value = ls_final-totalval    ip_style = lv_style_cell_guid ).
        lo_worksheet->set_cell( ip_row = l_row ip_column = 'K' ip_value = ls_final-penawal     ip_style = lv_style_cell_guid ).
        lo_worksheet->set_cell( ip_row = l_row ip_column = 'L' ip_value = ls_final-waers       ip_style = lv_style_cell_guid ).
        lo_worksheet->set_cell( ip_row = l_row ip_column = 'M' ip_value = ls_final-zzmtkdn     ip_style = lv_style_cell_guid ).
        lo_worksheet->set_cell( ip_row = l_row ip_column = 'N' ip_value = ls_final-zbtsmintkdn ip_style = lv_style_cell_guid ). 

      CATCH zcx_excel.
    ENDTRY.
  ENDLOOP. 
  xdata = cl_writer->write_file( lo_excel ).
  rawdata = cl_bcs_convert=>xstring_to_solix( iv_xstring  = xdata ).
  bytecount = xstrlen( xdata ).


  ls_line = '<body> <html>'.
  APPEND ls_line TO main_text.

* Mail Contents
  ls_line = 'Dengan hormat,<br>'.
  APPEND ls_line TO main_text.

  ls_line = '<br>'.
  APPEND ls_line TO main_text.

  CONCATENATE 'Berikut kami sampaikan list outstanding purchasing document yang' '<br>' INTO ls_line SEPARATED BY space.              " Mail Contents
  APPEND ls_line TO main_text.

  CONCATENATE 'sudah expired tetapi belum dilakukan penginputan capaian TKDN.' '<br>' INTO ls_line SEPARATED BY space.              " Mail Contents
  APPEND ls_line TO main_text.

  ls_line = '<br>'.
  APPEND ls_line TO main_text.

  CONCATENATE 'Silahkan dikoordinasikan ke pihak terkait dan dilakukan input' '<br>' INTO ls_line SEPARATED BY space.              " Mail Contents
  APPEND ls_line TO main_text.

  CONCATENATE 'capaian TKDN melalui tcode ZM105.' '<br>' INTO ls_line SEPARATED BY space.              " Mail Contents
  APPEND ls_line TO main_text.

  ls_line = '<br>'.
  APPEND ls_line TO main_text.

  CONCATENATE 'Terima kasih.' '<br>' INTO ls_line SEPARATED BY space.              " Mail Contents
  APPEND ls_line TO main_text.

  ls_line = '</body> </html>'.
  APPEND ls_line TO main_text.
 
  CONCATENATE 'Notifikasi List Outstanding' 'Dokumen untuk Capaian TKDN di cocd' S_BUKRS-LOW
*  CONCATENATE 'HBM/HBI Report - ' sy-datum+6(2) '.' sy-datum+4(2) '.' sy-datum+0(4)
    INTO sub_str SEPARATED BY space.
  attsubj = 'TKDN_Report.xlsx'.
*
  TRY.
*     -------- create persistent send request ------------------------
      send_request = cl_bcs=>create_persistent( ).

*     -------- create and set document with attachment ---------------
*     create document object from internal table with text

      document = cl_document_bcs=>create_document(
          i_type    = 'HTM'                                 "#EC NOTEXT
          i_text    = main_text
          i_subject = ``
            ).
*          i_subject = subject ).

*        catch CX_SEND_REQ_BCS.    "
      size = bytecount.
      CONCATENATE '&SO_FILENAME=' attsubj INTO wa_attachment_header.
      APPEND wa_attachment_header TO t_attachment_header.
*     add the spread sheet as attachment to document object
      document->add_attachment(
        i_attachment_type    = 'XLS'                        "#EC NOTEXT
        i_attachment_subject = attsubj
        i_attachment_size    = size
        i_att_content_hex    = rawdata
        i_attachment_header  = t_attachment_header ).

*     add document object to send request

      call METHOD send_request->SET_MESSAGE_SUBJECT
        exporting
          IP_SUBJECT      =  sub_str   " Subject of MIME Message
        .
      send_request->set_document( document ).

      data: sender type ref to cl_sapuser_bcs.
      data: lo_ref_sender type ref to IF_SENDER_BCS.
*      data: lo_ref_sender type ref to cl_cam_address_bcs.
      data: lv_smtp_addr TYPE ADR6-SMTP_ADDR.
      lv_smtp_addr = 'sap.noreply@xyz.com'.

      lo_ref_sender = cl_cam_address_bcs=>create_internet_address(
      i_address_string = lv_smtp_addr
      i_address_name = lv_smtp_addr ).
*      TRY.
      call METHOD SEND_REQUEST->SET_SENDER
        exporting
          I_SENDER        =  lo_ref_sender   " Sender
        . 

      LOOP AT reclist INTO ls_reclist.
        IF ls_reclist-copy IS INITIAL.
          MOVE ls_reclist-receiver TO mailto.
          recipient = cl_cam_address_bcs=>create_internet_address( mailto ).

          CALL METHOD send_request->add_recipient
            EXPORTING
              i_recipient = recipient
              i_express   = 'X'.

        ELSEIF ls_reclist-copy IS NOT INITIAL.
          MOVE ls_reclist-receiver TO mailcc.
          recipient = cl_cam_address_bcs=>create_internet_address( mailcc ).

          CALL METHOD send_request->add_recipient
            EXPORTING
              i_recipient = recipient
              i_express   = 'X'
              i_copy      = 'X'.

        ENDIF.
      ENDLOOP.

*     add recipient object to send request
      send_request->add_recipient( recipient ).
* set outbox flag

      send_request->send_request->set_link_to_outbox( 'X' ).

*     ---------- send document ---------------------------------------
      sent_to_all = send_request->send( i_with_error_screen = 'X' ).

      COMMIT WORK.

      IF sent_to_all IS INITIAL.
        MESSAGE i500(sbcoms) WITH mailto.
      ELSE.
        MESSAGE s022(so).
      ENDIF.

**   ------------ exception handling ----------------------------------
**   replace this rudimentary exception handling with your own one !!!
    CATCH cx_bcs INTO bcs_exception.
      MESSAGE i865(so) WITH bcs_exception->error_type.
  ENDTRY.

ENDFORM.                    " F_SEND_EMAIL2

this method though has one deficiency,

when you check the SOST tcode, the subject sections remains empty, BUT when you check the email on your mailbox, the subject is filled.

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *