天天看點

内表生成XML簡單執行個體

REPORT  zlm_xml_02.

*&---------------------------------------------------------------------*
*&聲明及定義部分
*&---------------------------------------------------------------------*

TYPE-POOLS: ixml.

****聲明存放XML檔案的結構
TYPES:BEGIN OF xml_line,
        data(256) 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.

****聲明XML元素
DATA:l_element_inpot      TYPE REF TO if_ixml_element,
     l_element_matnr      TYPE REF TO if_ixml_element,
     l_element_art        TYPE REF TO if_ixml_element,
     l_element_prueflos   TYPE REF TO if_ixml_element,
     l_element_budat      TYPE REF TO if_ixml_element,
     l_element_losmenge   TYPE REF TO if_ixml_element,
     l_element_enstehdat  TYPE REF TO if_ixml_element,
     l_value              TYPE string.

****聲明存放XML檔案的内表以及位元組數
DATA: l_xml_table       TYPE TABLE OF xml_line,
      l_xml_size        TYPE i,
      l_rc              TYPE i,
      flag              TYPE string.

****聲明資料内表
DATA:BEGIN OF i_data OCCURS 0,
       matnr LIKE qals-matnr,
       prueflos LIKE qals-prueflos,
       art   LIKE qals-art,
       budat    LIKE qals-budat,
       losmenge LIKE qals-losmenge,
       enstehdat LIKE qals-enstehdat,
     END OF i_data.

*&---------------------------------------------------------------------*
*& 主邏輯部分
*&---------------------------------------------------------------------*

START-OF-SELECTION.
PERFORM zform_get_data.
PERFORM zform_save_xml.


*&---------------------------------------------------------------------*
*& FORM定義部分
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  zform_get_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM zform_get_data.
  SELECT matnr art prueflos budat losmenge enstehdat
         INTO CORRESPONDING FIELDS OF TABLE i_data
         FROM qals
         WHERE budat = '20000412'.
ENDFORM.                    "zform_get_data

*&---------------------------------------------------------------------*
*&      Form  save_xml
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM zform_save_xml.
  LOOP AT i_data.
****建立一個XML容器
    AT FIRST.
      l_ixml = cl_ixml=>create( ).
****建立一個文檔對象模型
      l_document = l_ixml->create_document( ).
****填充根節點
      l_element_inpot = l_document->create_simple_element(
                        name = 'INPOT'
                        parent = l_document ).
    ENDAT.
    AT NEW matnr.
****填充子節點(物料)
      l_value = i_data-matnr.
      l_element_matnr = l_document->create_simple_element(
                        name = 'MATNR'
                        value = l_value
                        parent = l_element_inpot ).
      flag = flag + 1.
      l_rc = l_element_matnr->set_attribute( name = 'ID' value =
             flag ).
    ENDAT.
****填充子節點(檢驗批)
    AT NEW prueflos.
      l_value = i_data-prueflos.
      l_element_prueflos = l_document->create_simple_element(
                           name = 'PRUEFLOS'
                           value = l_value
                           parent = l_element_matnr ).
    ENDAT.
****填充子節點(檢驗批細節)
    l_value = i_data-art.
    l_element_art = l_document->create_simple_element(
                    name = 'ART'
                    value = l_value
                    parent = l_element_prueflos ).

    l_value = i_data-budat.
    l_element_budat = l_document->create_simple_element(
                      name = 'BUDAT'
                      value = l_value
                      parent = l_element_prueflos ).

    l_value = i_data-enstehdat.
    l_element_enstehdat = l_document->create_simple_element(
                          name = 'ENSTEHDAT'
                          value = l_value
                          parent = l_element_prueflos ).

    l_value = i_data-losmenge.
    l_element_losmenge = l_document->create_simple_element(
                          name = 'LOSMENGE'
                          value = l_value
                          parent = l_element_prueflos ).
  ENDLOOP.
****建立一個流容器
  l_streamfactory = l_ixml->create_stream_factory( ).
****連接配接内部XML表到流容器
  l_ostream = l_streamfactory->create_ostream_itable(
              table = l_xml_table ).
****遞交XML文檔
  l_renderer = l_ixml->create_renderer( ostream  = l_ostream
                                        document = l_document ).
  l_rc = l_renderer->render( ).
****儲存XML文檔
  l_xml_size = l_ostream->get_num_written_raw( ).
  CALL METHOD cl_gui_frontend_services=>gui_download
    EXPORTING
      bin_filesize = l_xml_size
      filename     = 'c:\temp\INPOT.xml'
      filetype     = 'BIN'
    CHANGING
      data_tab     = l_xml_table
    EXCEPTIONS
      OTHERS       = 24.
  IF sy-subrc = 0.
    MESSAGE 'XML檔案儲存成功!!!!' TYPE 'I'.
    STOP.
  ENDIF.
ENDFORM.                    "save_xml