• ABAP内表数据做层次XML输出


     
    *&---------------------------------------------------------------------*
    *& Report  Z_BARRY_TEST_XML
    *&---------------------------------------------------------------------*
    *& 46C - ECC6 通用
    *&---------------------------------------------------------------------*
    REPORT  z_barry_test_xml.
    TYPES: BEGIN OF ty_item ,
             ebelp LIKE ekpo-ebelp ,
             menge LIKE ekpo-menge ,
           END OF ty_item .
    TYPES tt_item TYPE STANDARD TABLE OF ty_item WITH DEFAULT KEY  .
    DATA: itab_item TYPE STANDARD TABLE OF ty_item WITH HEADER LINE  ,
          wa_item LIKE LINE OF itab_item.
    TYPES: BEGIN OF ty_po ,
             ebeln LIKE ekko-ebeln ,
             aedat LIKE ekko-aedat ,
             item TYPE tt_item ,
           END OF ty_po .
    DATA: itab_po TYPE STANDARD TABLE OF ty_po WITH HEADER LINE  .
    DATA: BEGIN OF itab_all OCCURS 0 ,
            ebeln LIKE ekko-ebeln ,
            aedat LIKE ekko-aedat ,
            ebelp LIKE ekpo-ebelp ,
            menge LIKE ekpo-menge ,
          END OF itab_all.
    DATA: tmpebeln LIKE ekko-ebeln.
    DATA: l_ixml TYPE REF TO if_ixml,
          l_encoding TYPE REF TO if_ixml_encoding,
          l_comment TYPE REF TO if_ixml_comment,
          l_doc TYPE REF TO if_ixml_document,
          l_root TYPE REF TO if_ixml_element,
          l_po   TYPE REF TO if_ixml_element,
          l_pohead TYPE REF TO if_ixml_element,
          l_item TYPE REF TO if_ixml_element,
          l_element TYPE REF TO if_ixml_element,
          l_attribute TYPE REF TO if_ixml_attribute,
          l_ostream TYPE REF TO if_ixml_ostream,
          l_factory  TYPE REF TO if_ixml_stream_factory.
    TYPES: BEGIN OF xml_line,
            data(256) TYPE x,
          END OF xml_line.
    DATA: xml_table TYPE TABLE OF xml_line,
          xml_size  TYPE i.
    DATA: l_rval TYPE i.
    DATA: str TYPE string .
    SELECT-OPTIONS : s_ebeln FOR itab_all-ebeln.
    START-OF-SELECTION.
      PERFORM getdata.
      PERFORM create_xml.
      PERFORM download.
    *---------------------------------------------------------------------*
    *       FORM getdata                                                  *
    *---------------------------------------------------------------------*
    FORM getdata.
      SELECT ekko~ebeln ekko~aedat ekpo~ebelp ekpo~menge
      INTO TABLE itab_all
      FROM ekko INNER JOIN ekpo ON ekko~ebeln = ekpo~ebeln
      WHERE ekko~ebeln IN s_ebeln.
      SORT itab_all BY ebeln ebelp.
      LOOP AT itab_all .
        ON CHANGE OF itab_all-ebeln .
          CLEAR itab_po-item .
          CLEAR tmpebeln .
          tmpebeln = itab_all-ebeln .
          LOOP AT itab_all WHERE ebeln = tmpebeln .
            wa_item-ebelp = itab_all-ebelp .
            wa_item-menge = itab_all-menge .
            APPEND wa_item TO itab_po-item .
          ENDLOOP .
          SORT itab_po-item BY ebelp.
          itab_po-ebeln = itab_all-ebeln .
          itab_po-aedat = itab_all-aedat .
          APPEND itab_po .
        ENDON .
      ENDLOOP .
    ENDFORM.                    "getdata
    *---------------------------------------------------------------------*
    *       FORM create_xml                                               *
    *---------------------------------------------------------------------*
    FORM create_xml.
      CLASS cl_ixml DEFINITION LOAD.
      l_ixml = cl_ixml=>create( ).
      CALL METHOD l_ixml->create_encoding
        EXPORTING
          byte_order    = 0
          character_set = 'gb2312'
        RECEIVING
          rval          = l_encoding.
      CALL METHOD l_ixml->create_document
        RECEIVING
          rval = l_doc.
      CALL METHOD l_doc->set_encoding
        EXPORTING
          encoding = l_encoding.
      CALL METHOD l_doc->create_simple_element
        EXPORTING
          name   = 'Root'
          parent = l_doc
        RECEIVING
          rval   = l_root.
      CALL METHOD l_root->set_attribute
        EXPORTING
          name  = 'ATTRIBUTE'
          value = 'sample'
        RECEIVING
          rval  = l_rval.
      CALL METHOD l_doc->create_comment
        EXPORTING
          comment = '''上面ATTRIBUTE为属性示例'''
        RECEIVING
          rval    = l_comment.
      CALL METHOD l_root->append_child
        EXPORTING
          new_child = l_comment
        RECEIVING
          rval      = l_rval.
      LOOP AT itab_po.
        CALL METHOD l_doc->create_simple_element
          EXPORTING
            name   = 'po'
            parent = l_root
          RECEIVING
            rval   = l_po.
        CALL METHOD l_doc->create_simple_element
        EXPORTING
          name   = 'pohead'
          parent = l_po
        RECEIVING
          rval   = l_pohead.
        str = itab_po-ebeln .
        CALL METHOD l_doc->create_simple_element
          EXPORTING
            name   = 'ponumber'
            parent = l_pohead
            value  = str
          RECEIVING
            rval   = l_element.
        str = itab_po-aedat .
        CALL METHOD l_doc->create_simple_element
          EXPORTING
            name   = 'podate'
            parent = l_pohead
            value  = str
          RECEIVING
            rval   = l_element.
        PERFORM fill_itab2xml TABLES  itab_po-item
                              USING   'pobody'
                                      'poitem'
                                      l_po.
      ENDLOOP.
      CALL METHOD l_ixml->create_stream_factory
        RECEIVING
          rval = l_factory.
      CALL METHOD l_factory->create_ostream_itable
        EXPORTING
          table = xml_table
        RECEIVING
          rval  = l_ostream.
      CALL METHOD l_doc->render
        EXPORTING
          ostream   = l_ostream
          recursive = 'X'.
      CALL METHOD l_ostream->get_num_written_raw
        RECEIVING
          rval = xml_size.
    ENDFORM.                    "create_xml
    *---------------------------------------------------------------------*
    *       FORM fill_itab                                                *
    *---------------------------------------------------------------------*
    FORM fill_itab2xml TABLES intab
                       USING node1name TYPE string
                             node2name TYPE string
                             l_parent TYPE REF TO if_ixml_element.
      DATA: BEGIN OF headtab OCCURS 0 ,
              length    TYPE i ,
              decimals  TYPE i,
              type_kind TYPE c,
              name(30)  TYPE c,
            END OF headtab.
      DATA descr_ref TYPE REF TO cl_abap_structdescr.
      FIELD-SYMBOLS: <comp_wa> TYPE abap_compdescr ,
                     <f_field> ,
                     <f_intab> TYPE ANY .
      DATA: n TYPE i ,
            str TYPE string ,
            itemname TYPE string ,
            text1 TYPE c ,
            l_node TYPE REF TO if_ixml_element ,
            l_item TYPE REF TO if_ixml_element .
      descr_ref ?= cl_abap_typedescr=>describe_by_data( intab ).
      LOOP AT descr_ref->components ASSIGNING <comp_wa>.
        MOVE-CORRESPONDING <comp_wa> TO headtab.
        APPEND headtab.
      ENDLOOP.
      CALL METHOD l_doc->create_simple_element
        EXPORTING
          name   = node1name
          parent = l_parent
        RECEIVING
          rval   = l_node.
      DESCRIBE TABLE headtab LINES n.
      LOOP AT intab ASSIGNING <f_intab>.
        CALL METHOD l_doc->create_simple_element
          EXPORTING
            name   = node2name
            parent = l_node
          RECEIVING
            rval   = l_item.
        DO n TIMES.
          ASSIGN COMPONENT sy-index OF STRUCTURE <f_intab> TO <f_field>.
          str = <f_field>.
          READ TABLE headtab INDEX sy-index.
          IF headtab-type_kind = 'I' OR headtab-type_kind = 'P'
                                     OR headtab-type_kind = 'F'.
            SEARCH str FOR '-'.
            IF sy-subrc = 0 AND sy-fdpos <> 0.
              SPLIT str AT '-' INTO str text1.
              CONDENSE str.
              CONCATENATE '-' str INTO str.
            ELSE.
              CONDENSE str.
            ENDIF.
          ELSE.
    *        SHIFT str LEFT DELETING LEADING '0' .
          ENDIF.
          itemname = headtab-name .
          CALL METHOD l_doc->create_simple_element
            EXPORTING
              name   = itemname
              parent = l_item
              value  = str
            RECEIVING
              rval   = l_element.
        ENDDO.
      ENDLOOP.
    ENDFORM.                    "fill_itab2xml
    *---------------------------------------------------------------------*
    *       FORM download                                                 *
    *---------------------------------------------------------------------*
    FORM download.
      CALL FUNCTION 'GUI_DOWNLOAD'
           EXPORTING
                bin_filesize = xml_size
                filename     = 'C:46C.XML'
                filetype     = 'BIN'
           TABLES
                data_tab     = xml_table.
    ENDFORM.                    "download
     
     
     
    稍微修改一下,就能达到下图的效果:

  • 相关阅读:
    tyvj4751 NOIP春季系列课程 H's Problem (树状数组)
    卡牌分组([AtCoder ARC073]Ball Coloring)
    bzoj1036 [ZJOI2008]树的统计Count (树链剖分+线段树)
    bzoj2287 POJ Challenge 消失之物(背包)
    不能建立引用数组
    CString和string的区别
    防止应用程序重复启动
    public,protected,private
    ATL
    c++头文件中定义全局变量
  • 原文地址:https://www.cnblogs.com/rainysblog/p/3822776.html
Copyright © 2020-2023  润新知