ITPub博客

首页 > 应用开发 > IT综合 > sap 内表转xml,类的使用if_ixml_element

sap 内表转xml,类的使用if_ixml_element

IT综合 作者:sandong8 时间:2023-12-08 16:52:53 0 删除 编辑




*&---------------------------------------------------------------------*
*& Report  YTESTXML002
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

report  ytestxml002 .

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  up  to  10  rows
     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
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form download  .
   data :  pickedfolder  type string .
   data : initialfolder  type string .

   data : : filepath  like rlgrap -filename .

   call  method cl_gui_frontend_services =>directory_browse
     exporting
      initial_folder        = initialfolder
     changing
      selected_folder       = pickedfolder
     exceptions
      cntl_error            =  1
      error_no_gui          =  2
      not_supported_by_gui  =  3 .

   concatenate pickedfolder  '\' sy -uzeit  'testpo2.xml'  into pickedfolder .
**--将xml数据导出到本地
   call  method cl_gui_frontend_services =>gui_download
     exporting
      bin_filesize  = xml_size
      filename      = pickedfolder
      filetype      =  'BIN'
     changing
      data_tab      = xml_table[] .
endform .                     " DOWNLOAD

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9522162/viewspace-2999368/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-10-05

  • 博文量
    6
  • 访问量
    6314