今天有个兄弟问如何实现以XML的方式输出内表的内容,这个问题我以前好像没有写过。倒不是不会写,而是写的方法太多了,有极其简单的,也有很复杂的,而且网上资料也很多。

找到以前写的一个程序,稍微修改了一下,能实现一般的功能。
 
*&---------------------------------------------------------------------*
*& Report  Z_BARRY_TEST_XML
*&
*&---------------------------------------------------------------------*
*& 46C - ECC6 通用
*&---------------------------------------------------------------------*
REPORT  z_barry_test_xml.
DATA: BEGIN OF itab_matnr OCCURS 0 ,
        matnr LIKE mara-matnr ,
        maktx LIKE makt-maktx ,
      END OF itab_matnr .
DATA: BEGIN OF itab_class OCCURS 0 ,
        class LIKE m_wwgha-class,"部门
        kschl LIKE m_wwgha-kschl,"DESC
      END OF itab_class .
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_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.
START-OF-SELECTION.
  PERFORM getdata.
  PERFORM create_xml.
  PERFORM download.
*---------------------------------------------------------------------*
*       FORM getdata                                                  *
*---------------------------------------------------------------------*
FORM getdata.
  SELECT matnr maktx FROM makt
  INTO TABLE itab_matnr
  UP TO 4 ROWS
  WHERE spras = '1' .
  SELECT class kschl FROM m_wwgha
  INTO TABLE itab_class
  UP TO 4 ROWS
  WHERE spras IN ('1','E') .
  DELETE itab_class WHERE class = '0'.
  APPEND itab_class. "演示空数据
ENDFORM.
*---------------------------------------------------------------------*
*       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.
  PERFORM fill_itab2xml TABLES  itab_matnr
                        USING   'Products'
                                'Product'
                                l_root.
  PERFORM fill_itab2xml TABLES  itab_class
                        USING   'Categories'
                                'Categorie'
                                l_root.
  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.
*---------------------------------------------------------------------*
*       FORM download                                                 *
*---------------------------------------------------------------------*
FORM download.
  CALL FUNCTION 'GUI_DOWNLOAD'
       EXPORTING
            bin_filesize = xml_size
            filename     = 'C:\ECC6.XML'
            filetype     = 'BIN'
       TABLES
            data_tab     = xml_table.
ENDFORM.
*---------------------------------------------------------------------*
*       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.

SAP内表转XML文件的更多相关文章

  1. ABAP 内表与XML转换

    1需求说明 在系统交互中需要将SAP内表转换为XML文件,发送给其他系统,并且将其他系统返回的XML文件转换为SAP内表. 2创建转换编辑器 事务代码:STRANS 选择简单转换 以图形方式编辑 右键 ...

  2. 用java语言将数据库中的数据表转换为xml文件的通用程序(细化)

    转自:https://www.cnblogs.com/wudage/p/7650685.html 总是在网络上copy别人的源代码,今天我也贴出自己今天写的源码,相信这个程序会对大家在平时的工作中需要 ...

  3. sap 内表

    内表的目的在ABAP/4中,主要使用表格.表格是R/3系统中的关键数据结构.长期使用的数据存储在关系数据库表格中.关于如何读取和处理数据库表格的详细信息,参见读取并处理数据库表.除了数据库表格,还可以 ...

  4. SAP内表查询速度优化实例-OPEN SQL

    一.FOR ALL ENTRIES IN 案例 今天碰到工单报工统计分析表查询速度特别慢 经查看源代码: SELECT afpo~dwerk afko~aufnr afpo~matnr AS plnb ...

  5. SAP内表类型及其数据读取效率评估

    内表大概分3种: 1.标准表standard tables:如果不指定BINARY SEARCH附加选项,则默认为线性查找(linear search),既一条一条的查找. 2.排序表(sorted ...

  6. Strans 内表-xml文件

    一.内表到xml文件 <?sap.transform simple?> <tt:transform xmlns:tt="http://www.sap.com/transfo ...

  7. 20170319 ABAP 生成XML文件

    方法一:ABAP 使用method方式操作XML 转自:http://www.cnblogs.com/jiangzhengjun/p/4265595.html 方法二:STRANS 转换工具;使用st ...

  8. PO 审批及生成xml文件

    *********************************************************************** * Report : YTST_RAINY_MM2 * ...

  9. Hibernate使用Log4j日志记录(使用xml文件)

    日志记录使程序员能够将日志详细信息永久写入文件. Log4j和Logback框架可以在hibernate框架中使用来支持日志记录. 使用log4j执行日志记录有两种方法: 通过log4j.xml文件( ...

随机推荐

  1. Java的位运算

    左移位操作 左移位运算的符号为[<<],左移位运算符左面的操作元称作被移位数,右面的操作数称作移位量. 左移位运算是双目运算符,操作元必须是整型类型的数据,其移动过程是:[a <&l ...

  2. Solution to Triangle by Codility

    question: https://codility.com/programmers/lessons/4 we need two parts to prove our solution. on one ...

  3. Shiro学习小结

    1. What is Shiro? Apache旗下一个开源的Java权限框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权.加密.会话管理等功能,组成了一个通用的安全认证框架 ...

  4. sql CHARINDEX() 与 PATINDEX() LEN() substring() COLLATE RAISERROR

    CHARINDEX()  在一个表达式中搜索另一个表达式并返回其起始位置(如果找到). CHARINDEX ( expressionToFind , expressionToSearch [ , st ...

  5. MySQL5.5中文支持

    1. /etc/my.cnf.d/client.cnf [client] #password = [your_password] port = 3306 socket = /tmp/mysql.soc ...

  6. linux查看mysql运行日志

    在命令行输入下面命令就可以了,如果看到报错的话,直接copy去谷歌就OK: [root@localhost /]# vim /var/log/mysqld.log

  7. css 控制文本显示两行 超过省略号显示

    display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; word-break: break-all; ov ...

  8. R410自带SAS6IR卡折腾记

    因为需要一些做一些自动编译的工作,所以打算淘换一台多核的主机.淘宝找一圈,感觉换下来的dell R410 ~ R710 都可以. 综合对比了一下感觉最低配的R410就能满足要求,最后选择了:X5675 ...

  9. Vim使用个人心得

    个人最近在Windows上使用gVim 1.移动光标 h,j,k,l 键为左,下,上,右,方向键,控制光标移动,插入状态下不可用,插入状态下,按V键进入查看状态,可使用. 2.进入编辑模式:按 i 键 ...

  10. SetTimer时间间隔的问题

    1.用WM_TIMER来设置定时器   SetTimer函数的原型 UINT_PTR SetTimer( HWND hWnd,                      // 窗体句柄 UINT_PT ...