SAP发送邮件作为附件

示例程序:


REPORT  zgr_sd_00_r_order_release.
TABLES: vbak, kna1, mvke, makt, vbap, objk,
        zgr_sd_usa_017,soparbi1.

TYPES: BEGIN OF ty_vbap,
         vbeln  TYPE vbak-vbeln,
         posnr  TYPE vbap-posnr,
         matnr  TYPE vbap-matnr,
         arktx  TYPE vbap-arktx,
         kwmeng TYPE vbap-kwmeng,
         werks  TYPE vbap-werks,
         lgort  TYPE vbap-lgort,
         edatu  TYPE vbep-edatu,
       END OF ty_vbap.


CONSTANTS:
  gc_tab  TYPE c VALUE cl_bcs_convert=>gc_tab,  "CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB
  gc_crlf TYPE c VALUE cl_bcs_convert=>gc_crlf. "CL_ABAP_CHAR_UTILITIES=>CR_LF

DATA: i_packing_list  LIKE sopcklsti1 OCCURS 0 WITH HEADER LINE,
      i_receivers     LIKE somlreci1 OCCURS 0 WITH HEADER LINE, "receivers
      i_contents_txt  LIKE solisti1 OCCURS 0 WITH HEADER LINE, "ASCII contents of object and attachments
      i_contents_hex  LIKE solix   OCCURS 0 WITH HEADER LINE, "Binary contents of object and attachments
      i_contents_bin  LIKE solisti1   OCCURS 0 WITH HEADER LINE,
      i_object_header LIKE solisti1 OCCURS 0 WITH HEADER LINE,  "attachments name
      w_doc_data      LIKE sodocchgi1.
DATA: c_mimetype TYPE char64 VALUE 'APPLICATION/MSEXCEL;charset=utf-16le'.
DATA: v_xattach TYPE xstring.
DATA: lv_string TYPE string.
DATA: tab_lines     LIKE sy-tabix,
      w_sent_all(1) TYPE c,
      w_error       TYPE sy-subrc.

DATA: wa_vbap   TYPE ty_vbap,
      itab_vbap TYPE STANDARD TABLE OF ty_vbap.

DATA: wa_log   TYPE zgr_sd_usa_017,
      itab_log TYPE STANDARD TABLE OF zgr_sd_usa_017.
TYPE-POOLS: ixml.
TYPES: BEGIN OF xml_line,
         data(255) TYPE x,
       END OF xml_line.

DATA: l_ixml          TYPE REF TO if_ixml,
      l_streamfactory TYPE REF TO if_ixml_stream_factory,
      l_ostream       TYPE REF TO if_ixml_ostream,
      l_renderer      TYPE REF TO if_ixml_renderer,
      l_document      TYPE REF TO if_ixml_document.
DATA: l_element_root       TYPE REF TO if_ixml_element,
      ns_attribute         TYPE REF TO if_ixml_attribute,
      r_element_properties TYPE REF TO if_ixml_element,
      r_element            TYPE REF TO if_ixml_element,
      r_worksheet          TYPE REF TO if_ixml_element,
      r_table              TYPE REF TO if_ixml_element,
      r_column             TYPE REF TO if_ixml_element,
      r_row                TYPE REF TO if_ixml_element,
      r_cell               TYPE REF TO if_ixml_element,
      r_data               TYPE REF TO if_ixml_element,
      l_value              TYPE string,
      l_type               TYPE string,
      l_text(100)          TYPE c,
      r_styles             TYPE REF TO if_ixml_element,
      r_style              TYPE REF TO if_ixml_element,
      r_style1             TYPE REF TO if_ixml_element,
      r_format             TYPE REF TO if_ixml_element,
      r_border             TYPE REF TO if_ixml_element,
      num_rows             TYPE i.

DATA: l_xml_table TYPE TABLE OF xml_line,
      wa_xml      TYPE xml_line,
      l_xml_size  TYPE i,
      l_rc        TYPE i.
TYPE-POOLS: slis.
DATA: fieldcatalog     TYPE slis_t_fieldcat_alv WITH HEADER LINE,     "slis_t_fieldcat_alv WITH HEADER LINE,slis_t_fieldcat_alv
      fieldcatalog_alv TYPE slis_t_fieldcat_alv WITH HEADER LINE,
      i_events         TYPE slis_t_event,              "alv事件
      w_events         LIKE LINE OF i_events,
      gd_tab_group     TYPE slis_t_sp_group_alv,
*      gd_layout    TYPE lvc_s_layo,     "slis_layout_alv,
      gd_layout        TYPE  slis_layout_alv,
      usercommand      TYPE slis_fieldname VALUE 'USERCOMMAND',
      gd_repid         LIKE sy-repid.

SELECTION-SCREEN BEGIN OF BLOCK blk3 WITH FRAME TITLE TEXT-103.
PARAMETER p_email AS CHECKBOX USER-COMMAND send MODIF ID  m2.
SELECT-OPTIONS s_addres FOR soparbi1-value NO INTERVALS  MODIF ID  m1.
SELECTION-SCREEN END OF BLOCK blk3.

INITIALIZATION.

AT  SELECTION-SCREEN  OUTPUT .
  LOOP  AT  SCREEN .
    CASE  screen-group1.
      WHEN  'M1' .
        IF  p_email EQ  'X'  .
          screen-active = 1 .
        ELSE .
          screen-active = 0 .
        ENDIF .
    ENDCASE .
    MODIFY  SCREEN .
  ENDLOOP .

START-OF-SELECTION.
  PERFORM fetch_data.
  PERFORM frm_email.
  PERFORM layout_build. "2.用于定义ALV表单的相关格式、属性
  PERFORM fields_build. "3.用来定义表单中的各个列的相关信息,比如列名等
  PERFORM display_data. "4.用来显示ALV表单

END-OF-SELECTION.

*&---------------------------------------------------------------------*
*&      Form  FETCH_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM fetch_data .

  CLEAR:wa_vbap,itab_vbap.



  CLEAR:wa_log,itab_log.

  DATA:   l_date     TYPE sy-datum.
  DATA: wa_header  TYPE bapisdh1,  "表头
        wa_headerx TYPE bapisdh1x, "表头标志
        wa_item    TYPE bapisditm,  "行项目
        wa_itemx   TYPE bapisditmx,
        wa_return  TYPE bapiret2.
  DATA:

    lt_item   TYPE STANDARD TABLE OF bapisditm,
    lt_itemx  TYPE STANDARD TABLE OF bapisditmx,
    lt_return TYPE STANDARD TABLE OF bapiret2.

  DATA: cp_eind TYPE c.

  CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
    EXPORTING
      date      = sy-datum
      days      = 7
      months    = 0
      signum    = '+'
      years     = 0
    IMPORTING
      calc_date = l_date.

  SELECT
         vbap~vbeln
         vbap~posnr
         vbap~matnr
         vbap~arktx
         vbap~kwmeng
         vbap~werks
         vbap~lgort
         vbep~edatu
         "edatu
     FROM
    vbak JOIN vbap ON vbak~vbeln = vbap~vbeln
    JOIN vbep ON vbap~vbeln = vbep~vbeln AND vbap~posnr = vbep~posnr

    INTO CORRESPONDING FIELDS OF TABLE itab_vbap
    WHERE vbep~etenr = 1
    AND vbak~vkorg = '1410'
    AND vbap~abgru = 'U2'
    AND vbep~edatu <= l_date.


  LOOP AT itab_vbap INTO wa_vbap.
*    UPDATE vbap SET abgru = ''
*      WHERE vbeln = wa_vbap-vbeln AND posnr = wa_vbap-posnr.
    CLEAR wa_item.
    CLEAR wa_itemx.
    CLEAR lt_item.
    CLEAR lt_itemx.

    wa_headerx-updateflag = 'U'.

    wa_item-itm_number = wa_vbap-posnr.
    wa_itemx-itm_number =  wa_vbap-posnr.
    wa_itemx-updateflag = 'U'.
    wa_itemx-reason_rej = 'X'.

    APPEND wa_item TO lt_item.
    APPEND wa_itemx TO lt_itemx.

    CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
      EXPORTING
        salesdocument    = wa_vbap-vbeln
        order_header_inx = wa_headerx
      TABLES
        return           = lt_return
        order_item_in    = lt_item[]
        order_item_inx   = lt_itemx[].


* 处理错误消息:通过判断消息的类型,来判断BAPI是否成功
    LOOP AT lt_return INTO wa_return.
*    CLEAR ls_msg.
*    ls_msg-class   = 'BUS'.
*    ls_msg-msgtyp  = wa_return-type.
*    ls_msg-msgno   = wa_return-number.
*    ls_msg-msgtxt  = wa_return-message.
*    APPEND ls_msg TO tp_message.
      IF wa_return-type EQ 'E' OR
          wa_return-type = 'A' OR
          wa_return = 'X'.
        cp_eind = 'X'.  "失败
      ENDIF.


    ENDLOOP.


    IF cp_eind NE 'X'.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.

      CLEAR:wa_log.
      MOVE-CORRESPONDING wa_vbap TO wa_log.
      GET TIME.
      wa_log-datum = sy-datum.
      wa_log-uzeit = sy-uzeit.
      APPEND wa_log TO itab_log.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
    ENDIF.


  ENDLOOP.

  INSERT zgr_sd_usa_017 FROM TABLE itab_log.

  "alv


ENDFORM.                    " FETCH_DATA


*&---------------------------------------------------------------------*
*&      Form  DEFINE_MAIL_HEADER
*&---------------------------------------------------------------------*
FORM define_mail_header .
  DATA: tmp_date LIKE sy-datum.
  DATA: tmp_char(30).
  tmp_date = sy-datum.
  CONCATENATE 'Overdue Batch  ' sy-datum INTO tmp_char.
********define subject and priority************
  w_doc_data-obj_descr = 'Hello'.  "Email Subject.
  w_doc_data-priority = 1.         "mail PRIORITY¡A 1 is highest
  w_doc_data-obj_langu = sy-langu.
  w_doc_data-obj_name = 'OFFER'.  "Name of document..
  w_doc_data-sensitivty = 'O'.     "Document sensitivity.
********mail main context***********************
  i_contents_txt = 'Dear Mr and Miss:'.
  APPEND i_contents_txt.
  i_contents_txt = ' '.
  APPEND i_contents_txt.
  i_contents_txt = '     Please check attachment in time!'.
  APPEND i_contents_txt.
  i_contents_txt = '     This Email is sent by systme, Do not Return the Email.'.
  APPEND i_contents_txt.
  i_contents_txt ='     If you have any problem, please contact with ERP.'.
  APPEND i_contents_txt.
  i_contents_txt = ' '.
  APPEND i_contents_txt.
  i_contents_txt = tmp_date.
  APPEND i_contents_txt.
  DESCRIBE TABLE i_contents_txt LINES tab_lines.
  READ TABLE i_contents_txt INDEX tab_lines.
  w_doc_data-doc_size = ( tab_lines - 1 ) * 255 + strlen( i_contents_txt ).
********count lines by man context*************
  CLEAR   i_packing_list-transf_bin.
  i_packing_list-transf_bin = space.    "ASCII format/binary format
  i_packing_list-head_start = 1.
  i_packing_list-head_num = 0.
  i_packing_list-body_start = 1.
  i_packing_list-body_num = tab_lines.
  i_packing_list-doc_type = 'RAW'.
  APPEND i_packing_list.
ENDFORM. " DEFINE_MAIL_HEADER
*&---------------------------------------------------------------------*
*&      Form  DEFINE_MAIL_ATTACHMENT
*&---------------------------------------------------------------------*
FORM define_mail_attachment .
  LOOP AT itab_vbap INTO wa_vbap.

    DATA:l_kwmeng TYPE string.
    MOVE wa_vbap-kwmeng TO l_kwmeng.
    CONCATENATE lv_string
            wa_vbap-vbeln    gc_tab
            wa_vbap-posnr    gc_tab
            wa_vbap-matnr gc_tab
            wa_vbap-arktx  gc_tab
            l_kwmeng  gc_tab
            wa_vbap-edatu    gc_crlf
            INTO lv_string.
  ENDLOOP.
* Convert string to xstring type
* 'APPLICATION/MSEXCEL;charset=utf-16le'
  CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
    EXPORTING
      text     = lv_string
      mimetype = c_mimetype
    IMPORTING
      buffer   = v_xattach
    EXCEPTIONS
      failed   = 1
      OTHERS   = 2.
* Add the file header for utf-16le. .
  IF sy-subrc = 0.
    CONCATENATE cl_abap_char_utilities=>byte_order_mark_little
    v_xattach INTO v_xattach IN BYTE MODE.
  ENDIF.
  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      buffer     = v_xattach
    TABLES
      binary_tab = i_contents_hex.

***set attachment name, count size*******************
  DESCRIBE TABLE itab_vbap LINES tab_lines.
  tab_lines = tab_lines .
  i_packing_list-transf_bin = 'X'.
  i_packing_list-head_start = 1.
  i_packing_list-head_num   = 0.
  i_packing_list-body_start = 1.
  i_packing_list-body_num = tab_lines.
  i_packing_list-doc_type = 'XLS'.
  i_packing_list-obj_name   = 'ATTACHMENT'.
  i_packing_list-obj_descr  = 'spfli'.
  i_packing_list-doc_size =  tab_lines * 255.
  APPEND i_packing_list.
ENDFORM. " DEFINE_MAIL_ATTACHMENT
*&---------------------------------------------------------------------*
*&      Form  GET_RECEIVERS
*&---------------------------------------------------------------------*
FORM get_receivers .
* Add the recipients email address
  CLEAR i_receivers.
  REFRESH i_receivers.
*  SELECT * FROM zszmail.
*  i_receivers-receiver = '461356592@qq.com'."Email Address
  i_receivers-receiver = 'hu.wang@sh.shin-china.com'."Email Address
  i_receivers-rec_type = 'U'.    "Internet address
  i_receivers-notif_read = 'X'.
  i_receivers-com_type = 'INT'.
  i_receivers-notif_del = 'X'.
  i_receivers-notif_ndel = 'X'.
  APPEND i_receivers.
*  ENDSELECT.
ENDFORM. " GET_RECEIVERS
*&---------------------------------------------------------------------*
*&      Form SEND_EMAIL_MESSAGE
*&---------------------------------------------------------------------*
FORM send_email_message.
  DATA: w_subrc LIKE sy-subrc.
* Call the FM to post the message to SAPMAIL
  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
    EXPORTING
      document_data              = w_doc_data         "Attributes of new document
      put_in_outbox              = 'X'                 "Flag: Move document to outbox after send
      commit_work                = 'X'                 "An explicit COMMIT WORK is to be set
    IMPORTING
      sent_to_all                = w_sent_all
    TABLES
      packing_list               = i_packing_list      "Information about structure of data tables
      object_header              = i_object_header
      contents_hex               = i_contents_hex
      contents_txt               = i_contents_txt       "ASCII contents of object and attachments
      receivers                  = i_receivers          "Document recipients with send attributes
    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.
  w_subrc = sy-subrc.
  WAIT UP TO 2 SECONDS.
  IF w_subrc EQ 0.
    SUBMIT rsconn01 WITH mode = 'INT'
                  WITH output = 'X'
                  AND RETURN.
  ENDIF.
ENDFORM. " SEND_EMAIL_MESSAGE
*&---------------------------------------------------------------------*
*&      Form  FRM_EMAIL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_email .
  CHECK p_email IS NOT INITIAL.
 CHECK sy-batch IS NOT INITIAL. "是否后台作业
  CHECK s_addres[] IS NOT INITIAL.
  PERFORM frm_process_email_data.
  PERFORM frm_send_email.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_PROCESS_EMAIL_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_process_email_data .
* 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 = 'Sales_Manager_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  ).

  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' ).

* 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
  PERFORM frm_column_format USING '70'.  "Sales Document

  PERFORM frm_column_format USING '50'.  "Item

  PERFORM frm_column_format USING '60'.  "Material

  PERFORM frm_column_format USING '130'.  "Material description

  PERFORM frm_column_format USING '80'.  "Order Qty

  PERFORM frm_column_format USING '60'.  "Plant

  PERFORM frm_column_format USING '130'.  "Storage location

  PERFORM frm_column_format USING '90'.  "Delivery date

  PERFORM frm_column_format USING '70'.  "Release date

*  PERFORM frm_column_format USING '70'.  "Release Time


* 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' ).

  PERFORM frm_header_description USING 'Sales Document'.

  PERFORM frm_header_description USING 'Item'.

  PERFORM frm_header_description USING 'Material'.

  PERFORM frm_header_description USING 'Material description'.

  PERFORM frm_header_description USING 'Order Qty'.

  PERFORM frm_header_description USING 'Storage location'.

  PERFORM frm_header_description USING 'Plant'.

  PERFORM frm_header_description USING 'Delivery date'.

  PERFORM frm_header_description USING 'Release date'.

*  PERFORM frm_header_description USING 'Release time'.

* Data Table
  LOOP AT itab_log INTO wa_log.
    r_row = l_document->create_simple_element( name = 'Row'  parent = r_table ).
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        input  = wa_log-vbeln
      IMPORTING
        output = wa_log-vbeln.
    PERFORM frm_fill_table USING 'String' wa_log-vbeln. "Sales Document

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        input  = wa_log-posnr
      IMPORTING
        output = wa_log-posnr.
    PERFORM frm_fill_table USING 'String' wa_log-posnr."Item
    PERFORM frm_fill_table USING 'String' wa_log-matnr.
    PERFORM frm_fill_table USING 'String' wa_log-arktx.
    PERFORM frm_fill_table USING 'String'  wa_log-kwmeng."
    PERFORM frm_fill_table USING 'String'  wa_log-werks."
    PERFORM frm_fill_table USING 'String'  wa_log-lgort.
    PERFORM frm_fill_table USING 'String'  wa_log-edatu.
    PERFORM frm_fill_table USING 'String'  wa_log-datum.
*    PERFORM frm_fill_table USING 'String'  wa_log-uzeit.

  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.
*&---------------------------------------------------------------------*
*&      Form  FRM_SEND_EMAIL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_send_email .
  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 sy-datlo+6(2) '-' sy-datlo+4(2) '-' sy-datlo+0(4) INTO subj_date.
*modify by hand  lixuexue  2015.03.25   SM 2238 -----start
  "old
*CONCATENATE 'SAP Sales Manager Report ' SUBJ_DATE INTO DOC_CHNG-OBJ_DESCR SEPARATED BY SPACE.
  "ne
  DATA job TYPE  btcjob.
*  SELECT SINGLE  jobname INTO job  FROM  v_op  WHERE jobname EQ 'ZMZ1400SD01' AND   status EQ 'R'. .
*  IF  sy-subrc = 0.
*    CONCATENATE 'Consumable Mo Sales Rpt' subj_date INTO doc_chng-obj_descr SEPARATED BY space.
*  ENDIF.
*  SELECT SINGLE  jobname INTO  job   FROM  v_op WHERE jobname EQ 'ZWZ1400SD27' AND   status EQ 'R'.
*  IF  sy-subrc = 0.
*    CONCATENATE '9700 Sales Rpt' subj_date INTO doc_chng-obj_descr SEPARATED BY space.
*  ENDIF.
*
*  SELECT SINGLE  jobname INTO  job   FROM  v_op  WHERE jobname EQ 'ZWZ1400SD28' AND  status EQ 'R'.
*  IF  sy-subrc = 0.
*    CONCATENATE '9800 Sales Rpt' subj_date INTO doc_chng-obj_descr SEPARATED BY space.
*  ENDIF.
*
*  SELECT SINGLE  jobname INTO  job   FROM  v_op  WHERE jobname EQ 'ZWZ1400SD29' AND   status EQ 'R'.
*  IF  sy-subrc = 0.
*    CONCATENATE '9800 Sales Rpt' subj_date INTO doc_chng-obj_descr SEPARATED BY space.
*  ENDIF.


  IF  doc_chng-obj_descr IS  INITIAL.
    CONCATENATE 'Release Blanket Order' subj_date INTO doc_chng-obj_descr SEPARATED BY space.
  ENDIF.
*modify by hand  lixuexue  2015.03.25   SM 2238 -----end
* 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.
  objhead = 'Release Blanket Order'.
  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.
*modify by hand  lixuexue  2015.03.25   SM 2238 -----start
  "old
*CONCATENATE 'SAP Sales Manager Report' SUBJ_DATE INTO OBJPACK-OBJ_DESCR SEPARATED BY SPACE.
  "new
  DATA job1 TYPE  btcjob.
  SELECT SINGLE  jobname INTO job1  FROM  v_op WHERE jobname EQ 'ZMZ1400SD01' AND   status EQ 'R'.
*
*  IF  sy-subrc = 0.
*    CONCATENATE 'Consumable Mo Sales Rpt' subj_date INTO objpack-obj_descr SEPARATED BY space.
*  ENDIF.
*  SELECT SINGLE  jobname INTO  job1   FROM  v_op  WHERE jobname EQ 'ZWZ1400SD27' AND   status EQ 'R'.
*  IF  sy-subrc = 0.
*    CONCATENATE '9700 Sales Rpt' subj_date INTO objpack-obj_descr SEPARATED BY space.
*  ENDIF.
*  SELECT SINGLE  jobname INTO  job1   FROM  v_op  WHERE jobname EQ 'ZWZ1400SD28' AND   status EQ 'R'.
*  IF  sy-subrc = 0.
*    CONCATENATE '9800 Sales Rpt' subj_date INTO objpack-obj_descr SEPARATED BY space.
*  ENDIF.
*  SELECT SINGLE  jobname INTO  job1   FROM  v_op  WHERE jobname EQ 'ZWZ1400SD29' AND   status EQ 'R'.
*  IF  sy-subrc = 0.
*    CONCATENATE '9800 Sales Rpt' subj_date INTO objpack-obj_descr SEPARATED BY space.
*  ENDIF.

  IF  objpack-obj_descr IS INITIAL.
    CONCATENATE 'Release Blanket Order' subj_date INTO objpack-obj_descr SEPARATED BY space.
  ENDIF.
*modify by hand  lixuexue  2015.03.25   SM 2238 -----start
  objpack-doc_type = 'XLS'.
  objpack-doc_size = tab_lines * 255.
  APPEND objpack.

* Target Recipent
  CLEAR reclist.
  LOOP AT s_addres.
    reclist-receiver = s_addres-low.
    reclist-rec_type = 'U'.
    APPEND reclist.
  ENDLOOP.

* Sending the document
  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
    EXPORTING
      document_data              = doc_chng
      put_in_outbox              = '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.
  IF sy-subrc = 0.
    COMMIT WORK.
    MESSAGE 'Email send successfully' TYPE 'S'.
  ELSE.
    ROLLBACK WORK.
    MESSAGE 'Failed to send email' TYPE 'S' DISPLAY LIKE 'E'.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_COLUMN_FORMAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_1669   text
*----------------------------------------------------------------------*
FORM frm_column_format  USING    p_len.
  r_column = l_document->create_simple_element( name = 'Column'  parent = r_table ).
  r_column->set_attribute_ns( name = 'Width'  prefix = 'ss'  value = p_len ).
  r_column->set_attribute_ns( name = 'AutoFitWidth'  prefix = 'ss'  value = '1' ).

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_FILL_TABLE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_1796   text
*      -->P_WA_LOG_VBELN  text
*----------------------------------------------------------------------*
FORM frm_fill_table  USING    p_type
                              p_value.
  r_cell = l_document->create_simple_element( name = 'Cell'  parent = r_row ).
  r_cell->set_attribute_ns( name = 'StyleID'  prefix = 'ss'  value = 'Data' ).
  IF p_type = 'Number'.
    PERFORM frm_number_format USING p_value CHANGING l_value.
  ELSE.
    l_value = p_value.
  ENDIF.
  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 = p_type ).
ENDFORM.                    " FRM_FILL_TABLE
*&---------------------------------------------------------------------*
*&      Form  FRM_HEADER_DESCRIPTION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_1730   text
*----------------------------------------------------------------------*
FORM frm_header_description  USING  p_desc.
  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 = p_desc  parent = r_cell ).
  r_data->set_attribute_ns( name = 'Type'  prefix = 'ss' value = 'String' ).
ENDFORM.                    " FRM_HEADER_DESCRIPTION
*&---------------------------------------------------------------------*
*&      Form  FRM_NUMBER_FORMAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_P_VALUE  text
*      <--P_L_VALUE  text
*----------------------------------------------------------------------*
FORM frm_number_format  USING    p_wa_tab_boqty
                        CHANGING p_l_value.

  IF p_wa_tab_boqty < 0.
    p_wa_tab_boqty = p_wa_tab_boqty * -1.
    p_l_value = p_wa_tab_boqty.
    CONCATENATE '-' p_l_value INTO p_l_value.
    CONDENSE p_l_value NO-GAPS.
    p_wa_tab_boqty = p_wa_tab_boqty * -1.
  ELSE.
    p_l_value = p_wa_tab_boqty.
    CONDENSE p_l_value NO-GAPS.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  LAYOUT_BUILD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM layout_build .
  gd_layout-zebra             = 'X'.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FIELDS_BUILD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM fields_build .

  fieldcatalog-fieldname   = 'VBELN'."
  fieldcatalog-seltext_m   = TEXT-111.
  fieldcatalog-col_pos     = 1.
  fieldcatalog-outputlen   = 10.
  fieldcatalog-emphasize   = 'X'.
  fieldcatalog-key         = 'X'.
*  fieldcatalog-do_sum      = 'X'.
  fieldcatalog-no_zero     = 'X'.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.


  fieldcatalog-fieldname   = 'POSNR'."
  fieldcatalog-seltext_m   = TEXT-002.
  fieldcatalog-col_pos     = 2.
  fieldcatalog-outputlen   = 10.
  fieldcatalog-emphasize   = 'X'.
  fieldcatalog-key         = 'X'.
*  fieldcatalog-do_sum      = 'X'.
*  fieldcatalog-no_zero     = 'X'.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'MATNR'."‘
  fieldcatalog-seltext_m   = TEXT-003.
  fieldcatalog-col_pos     = 3.
  fieldcatalog-outputlen   = 10.
  fieldcatalog-emphasize   = 'X'.
  fieldcatalog-key         = 'X'.
*  fieldcatalog-do_sum      = 'X'.
*  fieldcatalog-no_zero     = 'X'.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'ARKTX'.
  fieldcatalog-seltext_m   = TEXT-004.
  fieldcatalog-col_pos     = 4.
  fieldcatalog-outputlen   = 20.
  fieldcatalog-emphasize   = 'X'.
  fieldcatalog-key         = 'X'.
*  fieldcatalog-do_sum      = 'X'.
*  fieldcatalog-no_zero     = 'X'.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.



  fieldcatalog-fieldname   = 'KWMENG'."‘可用性日期’
  fieldcatalog-seltext_m   = TEXT-005.
  fieldcatalog-col_pos     = 5.
  fieldcatalog-outputlen   = 10.
  fieldcatalog-emphasize   = 'X'.
  fieldcatalog-key         = 'X'.
*  fieldcatalog-do_sum      = 'X'.
*  fieldcatalog-no_zero     = 'X'.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'WERKS'."收获日期
  fieldcatalog-seltext_m   = TEXT-006.
  fieldcatalog-col_pos     = 6.
  fieldcatalog-outputlen   = 10.
  fieldcatalog-emphasize   = 'X'.
  fieldcatalog-key         = 'X'.
*  fieldcatalog-do_sum      = 'X'.
*  fieldcatalog-no_zero     = 'X'.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.


  fieldcatalog-fieldname   = 'LGORT'.
  fieldcatalog-seltext_m   = TEXT-007.
  fieldcatalog-col_pos     = 7.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.


  fieldcatalog-fieldname   = 'EDATU'.
  fieldcatalog-seltext_m   = TEXT-008.
  fieldcatalog-col_pos     = 8.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'DATUM'.
  fieldcatalog-seltext_m   = TEXT-009.
  fieldcatalog-col_pos     = 9.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'UZEIT'.
  fieldcatalog-seltext_m   = TEXT-010.
  fieldcatalog-col_pos     = 10.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  DISPLAY_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM display_data .
  gd_repid = sy-repid.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = gd_repid
*     i_callback_top_of_page   = 'TOP-OF-PAGE'  "see FORM
*     i_callback_pf_status_set = 'SET_PF_STATUS'
      i_callback_user_command  = 'USER_COMMAND'
*     i_grid_title             = outtext
      i_callback_pf_status_set = 'FRM_SETSTATUS'
      is_layout                = gd_layout
      it_fieldcat              = fieldcatalog[]
*     it_special_groups        = gd_tabgroup
*     IT_EVENTS                = GT_XEVENTS
*     i_save                   = 'X'
*     is_variant               = z_template
    TABLES
      t_outtab                 = itab_log
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
ENDFORM.

FORM frm_setstatus USING pt_extab TYPE slis_t_extab. "固定参数
  SET PF-STATUS 'STANDARD_FULLSCREEN' .
ENDFORM.

FORM user_command USING ucomm LIKE sy-ucomm selfield TYPE slis_selfield.
  CASE  ucomm.
    WHEN '&EMAIL'.
      IF s_addres[] IS INITIAL.
        MESSAGE 'Please input the email address in selection screen' TYPE 'E'.
        EXIT.
      ENDIF.
      PERFORM frm_process_email_data
      PERFORM frm_send_email.
  ENDCASE.
ENDFORM. 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值