SAP内表转XML文件

今天有个兄弟问如何实现以XML的方式输出内表的内容,这个问题我以前好像没有写过。倒不是不会写,而是写的方法太多了,有极其简单的,也有很复杂的,而且网上资料也很多。
*& Report Z_BARRY_TEST_XML
*&
*&---------------------------------------------------------------------*
*& 46C - ECC6 通用
*&---------------------------------------------------------------------*
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.
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.
USING 'Products'
'Product'
l_root.
PERFORM fill_itab2xml TABLES itab_class
USING 'Categories'
'Categorie'
l_root.
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.
CALL METHOD l_doc->create_simple_element
EXPORTING
name = itemname
parent = l_item
value = str
RECEIVING
rval = l_element .
ENDDO.
ENDLOOP.
ENDFORM.
SAP内表转XML文件的更多相关文章
- ABAP 内表与XML转换
1需求说明 在系统交互中需要将SAP内表转换为XML文件,发送给其他系统,并且将其他系统返回的XML文件转换为SAP内表. 2创建转换编辑器 事务代码:STRANS 选择简单转换 以图形方式编辑 右键 ...
- 用java语言将数据库中的数据表转换为xml文件的通用程序(细化)
转自:https://www.cnblogs.com/wudage/p/7650685.html 总是在网络上copy别人的源代码,今天我也贴出自己今天写的源码,相信这个程序会对大家在平时的工作中需要 ...
- sap 内表
内表的目的在ABAP/4中,主要使用表格.表格是R/3系统中的关键数据结构.长期使用的数据存储在关系数据库表格中.关于如何读取和处理数据库表格的详细信息,参见读取并处理数据库表.除了数据库表格,还可以 ...
- SAP内表查询速度优化实例-OPEN SQL
一.FOR ALL ENTRIES IN 案例 今天碰到工单报工统计分析表查询速度特别慢 经查看源代码: SELECT afpo~dwerk afko~aufnr afpo~matnr AS plnb ...
- SAP内表类型及其数据读取效率评估
内表大概分3种: 1.标准表standard tables:如果不指定BINARY SEARCH附加选项,则默认为线性查找(linear search),既一条一条的查找. 2.排序表(sorted ...
- Strans 内表-xml文件
一.内表到xml文件 <?sap.transform simple?> <tt:transform xmlns:tt="http://www.sap.com/transfo ...
- 20170319 ABAP 生成XML文件
方法一:ABAP 使用method方式操作XML 转自:http://www.cnblogs.com/jiangzhengjun/p/4265595.html 方法二:STRANS 转换工具;使用st ...
- PO 审批及生成xml文件
*********************************************************************** * Report : YTST_RAINY_MM2 * ...
- Hibernate使用Log4j日志记录(使用xml文件)
日志记录使程序员能够将日志详细信息永久写入文件. Log4j和Logback框架可以在hibernate框架中使用来支持日志记录. 使用log4j执行日志记录有两种方法: 通过log4j.xml文件( ...
随机推荐
- Java的位运算
左移位操作 左移位运算的符号为[<<],左移位运算符左面的操作元称作被移位数,右面的操作数称作移位量. 左移位运算是双目运算符,操作元必须是整型类型的数据,其移动过程是:[a <&l ...
- Solution to Triangle by Codility
question: https://codility.com/programmers/lessons/4 we need two parts to prove our solution. on one ...
- Shiro学习小结
1. What is Shiro? Apache旗下一个开源的Java权限框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权.加密.会话管理等功能,组成了一个通用的安全认证框架 ...
- sql CHARINDEX() 与 PATINDEX() LEN() substring() COLLATE RAISERROR
CHARINDEX() 在一个表达式中搜索另一个表达式并返回其起始位置(如果找到). CHARINDEX ( expressionToFind , expressionToSearch [ , st ...
- MySQL5.5中文支持
1. /etc/my.cnf.d/client.cnf [client] #password = [your_password] port = 3306 socket = /tmp/mysql.soc ...
- linux查看mysql运行日志
在命令行输入下面命令就可以了,如果看到报错的话,直接copy去谷歌就OK: [root@localhost /]# vim /var/log/mysqld.log
- css 控制文本显示两行 超过省略号显示
display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; word-break: break-all; ov ...
- R410自带SAS6IR卡折腾记
因为需要一些做一些自动编译的工作,所以打算淘换一台多核的主机.淘宝找一圈,感觉换下来的dell R410 ~ R710 都可以. 综合对比了一下感觉最低配的R410就能满足要求,最后选择了:X5675 ...
- Vim使用个人心得
个人最近在Windows上使用gVim 1.移动光标 h,j,k,l 键为左,下,上,右,方向键,控制光标移动,插入状态下不可用,插入状态下,按V键进入查看状态,可使用. 2.进入编辑模式:按 i 键 ...
- SetTimer时间间隔的问题
1.用WM_TIMER来设置定时器 SetTimer函数的原型 UINT_PTR SetTimer( HWND hWnd, // 窗体句柄 UINT_PT ...