加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

SAP 创建内表数据转换成XML格式方法

(2016-02-28 16:17:52)
标签:

xml

分类: abap

  *&------------------------------------------------------------------
*& TEST FOR  REVERSING BETWEEN ITAB AND XML
*& Author Tractor
*&------------------------------------------------------------------
report ztest1.

type-poolstruxs ,sydes.

typesbegin of ty_items ,
    posnr  like vbap-posnr,
    matnr  like vbap-matnr,
    matkl  like vbap-matkl,
    arktx  like vbap-arktx,
end of ty_items.
typesitems type ty_items occurs 0.
datawa_items type ty_items.

typesbegin of ty_order,
   vbeln  like  vbak-vbeln,
   erdat  like  vbak-erdat,
   ernam  like  vbak-ernam,
   auart  like  vbak-auart,
   items  type  items,
end of ty_order.

dataitab_order  type standard table of ty_order with header line.
datawa_order type ty_order.

databegin of itab_all occurs 0,
   vbeln  like vbak-vbeln,
   erdat  like vbak-erdat,
   ernam  like vbak-ernam,
   auart  like vbak-auart,
   posnr  like vbap-posnr,
   matnr  like vbap-matnr,
   matkl  like vbap-matkl,
   arktx  like vbap-arktx,
end of itab_all .
datatmpvbeln like vbak-vbeln.
typesbegin of stype_fields,
    fieldname  type name_feld,
end of stype_fields.
datag_t_fields  type table of stype_fields,
      g_s_fields  type stype_fields.

datag_t_td       type sydes_desc,
      g_s_typeinfo type sydes_typeinfo,
      g_s_nameinfo type sydes_nameinfo.

 --declare
datal_ixml type ref to if_ixml,
      l_encoding  type ref to if_ixml_encoding,
      l_comment   type ref to if_ixml_comment,
      l_atrribute type ref to if_ixml_attribute,
      l_factory   type ref to if_ixml_stream_factory,

      l_doc       type ref to if_ixml_document,
      l_root      type ref to if_ixml_element,
      l_order     type ref to if_ixml_element,
      l_head      type ref to if_ixml_element,
      l_item      type ref to if_ixml_element,
      l_element   type ref to if_ixml_element,
      l_ostream   type ref to if_ixml_ostream.


typesbegin of xml_line,
   data(256type x,
end of xml_line.
data:xml_table type table of xml_line,
     xml_size  type i.
datal_rval type i.
datastr type string.

select-optionss_vbeln for itab_all-vbeln.

start-of-selection.

  perform get_fields.
  perform get_data.
  perform create_xml.
*&---------------------------------------------------------------------*
*&      Form  get_data
*&---------------------------------------------------------------------*
      text
*----------------------------------------------------------------------*
form get_data.
  datalc_subrc type sy-subrc.

  select (g_t_fields)
    into  corresponding fields of table  itab_all
    from vbak as vbak
    inner join vbap as vbap on vbak~vbeln vbap~vbeln
    where vbak~vbeln in s_vbeln.
  sort  itab_all by  vbeln posnr.

  loop at itab_all.
    on change of itab_all-vbeln.
      clearitab_order-items ,tmpvbeln.
      tmpvbeln itab_all-vbeln.
      loop at itab_all where vbeln tmpvbeln.
           wa_items-posnr itab_all-posnr.
           wa_items-matnr itab_all-matnr.
           wa_items-matkl itab_all-matkl.
           wa_items-arktx itab_all-arktx.
           append wa_items to itab_order-items.
      endloop.
      sort itab_order by vbeln.
      itab_order-vbeln itab_all-vbeln.
      itab_order-erdat itab_all-erdat.
      itab_order-ernam itab_all-ernam.
      itab_order-auart itab_all-auart.
      append itab_order.
    endon.
  endloop.
endform                   "get_data
*&---------------------------------------------------------------------*
*&      Form  create_xml
*&---------------------------------------------------------------------*
      text
*----------------------------------------------------------------------*
form create_xml.
 the variant with load addition loads global class from the class library.
   class cl_ixml definition load.
 create class object
  l_ixml cl_ixml=>create).
 create xml
  call method l_ixml->create_document
      receiving
         rval l_doc.
 create/set encoding attribution/comment
  call method l_ixml->create_encoding
      exporting
          byte_order    0
          character_set 'utf-16'
      receiving
          rval          l_encoding.
  call method l_doc->set_encoding
      exporting
          encoding      l_encoding.
 create  mode set mode attribute set comment
  call method l_doc->create_simple_element
      exporting
         name    'DELIVERY'
         parent  l_doc
      receiving
         rval    l_root.
  call method l_doc->create_simple_element
      exporting
          name   'HEADER'
          parent l_root
      receiving
          rval   l_head.

   loop at itab_order.
     str itab_order-vbeln.
     call method l_doc->create_simple_element
       exporting
           name   'VBELN'
           parent l_head
           value  str
       receiving
           rval   l_element.
     clearstr.
     str itab_order-erdat.
     call method l_doc->create_simple_element
       exporting
           name   'ERDAT'
           parent l_head
           value  str
       receiving
           rval   l_element.
     clearstr.
     str itab_order-ernam.
     call method l_doc->create_simple_element
       exporting
           name   'ERNAM'
           parent l_head
           value  str
       receiving
           rval   l_element.
     clearstr.
     str itab_order-auart.
     call method l_doc->create_simple_element
       exporting
           name   'AUART'
           parent l_head
           value  str
       receiving
           rval   l_element.
     perform fill_itemstoxml tables itab_order-items
                            using   l_head.
   endloop.
  输出XML AS STRING
 create ostream facotry to implement IXML stream output
  break-point.
   call method  l_ixml->create_stream_factory
       receiving
          rval   l_factory.
  clear:str.
   call method  l_factory->create_ostream_cstring
       exporting
         string   str
       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  get_fields
*&---------------------------------------------------------------------*
      text
*----------------------------------------------------------------------*
form get_fields.

find out the fields of structure of itab_all
  describe field itab_all into g_t_td.

  loop at  g_t_td-names into g_s_nameinfo.
    case g_s_nameinfo-name+4(1).
      when '-'.
        g_s_nameinfo-name+4(1'~'.
        append g_s_nameinfo-name to  g_t_fields.
      when others.
    endcase.
  endloop.

  if g_t_fields[] is initial.
    message e001(00with  'Error '.
  else.
    sort g_t_fields.
    delete adjacent duplicates from g_t_fields.
  endif.
endform                   "get_fields

form fill_itemstoxml tables intab
                   using  l_parent   type ref to if_ixml_element.
databegin of headtab occurs 0,
    length    type i,
    decimals  type i,
    type_kind type c,
    name(20 type c,
end of headtab.

datadescr_ref type ref to cl_abap_structdescr.
field-symbols  type abap_compdescr,
               ,
                type any .

data   type itext1 type c,
      str  type string,
      itemname type string,
      l_item  type ref to if_ixml_element,
      l_node  type ref to if_ixml_element.
 descr_ref ?= cl_abap_typedescr=>describe_by_dataintab ).
 break-point.
 loop at descr_ref->components assigning .
    move-corresponding  to headtab.
    append headtab.
 endloop.
 describe table headtab lines n.

  loop at intab assigning .
   call method l_doc->create_simple_element
     exporting
        name     'ITEM'
        parent    l_parent
     receiving
        rval    l_item.
     do times.
       assign component sy-index of structure  to .
       str .
       shift str left deleting leading '0'.
       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.

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有