http://help.sap.com/saphelp_nw2004s/helpdata/en/e3/7d4719ca581441b6841f1054ff1326/frameset.htm
*&---------------------------------------------------------------------*
*& Report Z_BARRY_XML_CALL
*&
*&---------------------------------------------------------------------*
*& CALL TRANSFORMATION的方法生成XML例程
*& 适用ECC5以上系统
*& 普通方法生成XML:http://blog.chinaunix.net/u1/40527/showart_468389.html
*&---------------------------------------------------------------------*
REPORT z_barry_xml_call.
DATA: BEGIN OF it_xml OCCURS 0,
line(100) TYPE c,
END OF it_xml.
DATA: w_xml TYPE string,
w_len TYPE i,
w_fname TYPE string.
DATA: BEGIN OF line ,
matnr LIKE mara-matnr ,
maktx LIKE makt-maktx ,
END OF line .
DATA: BEGIN OF line2 ,
class LIKE m_wwgha-class,"部门
kschl LIKE m_wwgha-kschl,"DESC
END OF line2 .
DATA: itab_matnr LIKE TABLE OF line ,
itab_class LIKE TABLE OF line2 .
START-OF-SELECTION.
PERFORM getdata.
PERFORM create_xml.
*---------------------------------------------------------------------*
* 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') .
ENDFORM. "getdata
*&---------------------------------------------------------------------*
*& Form create_xml
*&---------------------------------------------------------------------*
FORM create_xml.
CALL TRANSFORMATION ztest2
SOURCE prd = itab_matnr
class = itab_class
RESULT XML w_xml.
CALL FUNCTION 'SCMS_STRING_TO_FTEXT'
EXPORTING
text = w_xml
IMPORTING
length = w_len
TABLES
ftext_tab = it_xml.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = 'c:\xmlcall.xml'
filetype = 'BIN'
IMPORTING
filelength = w_len
TABLES
data_tab = it_xml.
ENDFORM. "create_xml
*Tcode:STRANS,Simple类型
*<?sap.transform simple?>
*<tt:transform xmlns:tt="http://www.sap.com/transformation-templates">
* <tt:root name="PRD"/>
* <tt:root name="CLASS"/>
* <tt:template>
* <ROOT>
* <Products>
* <tt:loop name="line" ref="PRD">
* <Product>
* <matnr>
* <tt:value ref="$line.matnr"/>
* </matnr>
* <maktx>
* <tt:value ref="$line.maktx"/>
* </maktx>
* </Product>
* </tt:loop>
* </Products>
* <Categories>
* <tt:loop name="line2" ref="CLASS">
* <Categorie>
* <CLASS>
* <tt:value ref="$line2.class"/>
* </CLASS>
* <KSCHL>
* <tt:value ref="$line2.kschl"/>
* </KSCHL>
* </Categorie>
* </tt:loop>
* </Categories>
* </ROOT>
* </tt:template>
*</tt:transform>
===================================
REPORT za4_031.
TABLES:skb1,bsis.
SELECT-OPTIONS: p_bukrs FOR bsis-bukrs NO INTERVALS NO-EXTENSION
OBLIGATORY,
p_gjahr FOR bsis-gjahr NO INTERVALS NO-EXTENSION
OBLIGATORY,
p_monat FOR bsis-monat NO INTERVALS NO-EXTENSION
OBLIGATORY.
SELECT-OPTIONS: s_saknr FOR skb1-saknr.
SELECT-OPTIONS: s_budat FOR bsis-budat .
DATA:t_bsis LIKE STANDARD TABLE OF bsis WITH HEADER LINE,
t_bsis_tmp LIKE bsis.
DATA:l_size TYPE i,
c(10) TYPE c,
l_value TYPE string,
l_ixml TYPE REF TO if_ixml,
l_doc TYPE REF TO if_ixml_document,
l_encoding TYPE REF TO if_ixml_encoding,
l_comment TYPE REF TO if_ixml_comment,
l_root TYPE REF TO if_ixml_element,
l_fidoc TYPE REF TO if_ixml_element,
l_header TYPE REF TO if_ixml_element,
l_item TYPE REF TO if_ixml_element,
l_item_entry TYPE REF TO if_ixml_element,
l_tmp TYPE REF TO if_ixml_element.
DATA: l_xml TYPE REF TO cl_xml_document.
DATA:BEGIN OF s_xml,
data TYPE x LENGTH 256, "後面是BIN,所以要X
END OF s_xml,
t_xml LIKE STANDARD TABLE OF s_xml WITH HEADER LINE.
DEFINE xml_set_attribute.
clear l_value.
l_value = &3 .
call method &1->set_attribute
exporting
name = &2
value = l_value.
END-OF-DEFINITION.
DEFINE xml_create_element.
call method l_doc->create_simple_element
exporting
name = &2
parent = &1
receiving
rval = &3.
END-OF-DEFINITION.
DEFINE xml_create_element_with_value.
clear l_value.
l_value = &4 .
call method l_doc->create_simple_element
exporting
name = &2
value = l_value
parent = &1
receiving
rval = &3.
END-OF-DEFINITION.
DEFINE xml_set_comment.
call method l_doc->create_comment
exporting
comment = &2
receiving
rval = l_comment.
call method &1->append_child
exporting
new_child = l_comment.
END-OF-DEFINITION.
START-OF-SELECTION.
SELECT bukrs hkont gjahr belnr buzei budat bldat waers xblnr blart
monat bschl shkzg gsber mwskz fkont dmbtr
INTO CORRESPONDING FIELDS OF TABLE t_bsis
FROM bsis
WHERE bukrs IN p_bukrs
AND gjahr IN p_gjahr
AND monat IN p_monat
AND hkont IN s_saknr
AND budat IN s_budat.
l_ixml = cl_ixml=>create( ).
CALL METHOD l_ixml->create_document
RECEIVING
rval = l_doc.
CALL METHOD l_ixml->create_encoding
EXPORTING
byte_order = 0
character_set = 'utf-8'
RECEIVING
rval = l_encoding.
CALL METHOD l_doc->set_encoding
EXPORTING
encoding = l_encoding.
xml_create_element l_doc 'ufinterface' l_root.
xml_set_attribute l_root 'roottag' 'voucher'.
xml_set_attribute l_root 'billtype' ''.
xml_set_attribute l_root 'docid' ''.
xml_set_attribute l_root 'version' '2.0'.
xml_set_comment l_root '期的隆冬強'.
LOOP AT t_bsis.
MOVE-CORRESPONDING t_bsis TO t_bsis_tmp.
AT NEW belnr.
xml_create_element l_root 'voucher' l_fidoc.
xml_set_attribute l_fidoc 'id' t_bsis-belnr.
xml_create_element l_fidoc'voucher_head' l_header.
xml_create_element_with_value l_header 'voucher_type' l_tmp
'记'.
xml_create_element_with_value l_header 'fiscal_year' l_tmp
t_bsis-gjahr.
xml_create_element_with_value l_header 'company' l_tmp
t_bsis-bukrs.
xml_create_element_with_value l_header 'accounting_period'
l_tmp t_bsis_tmp-monat.
WRITE:t_bsis-monat.
NEW-LINE.
ENDAT.
ENDLOOP.
CREATE OBJECT l_xml .
CALL METHOD l_xml->create_with_dom
EXPORTING
document = l_doc.
CALL METHOD l_xml->render_2_table
IMPORTING
table = t_xml[]
size = l_size.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
bin_filesize = l_size
filename = 'c:\flights.xml'
filetype = 'BIN'
TABLES
data_tab = t_xml.
总结:
1. 做的过程中还遇到一个问题:在LOOP -> AT NEW中字符有时候会被输出成*
解决办法:在AT-NEW前就將WA 复制一份出来
LOOP AT t_bsis.
MOVE-CORRESPONDING t_bsis TO t_bsis_tmp.
AT NEW belnr.
xml_create_element_with_value l_header 'accounting_period'
l_tmp t_bsis_tmp-monat.
ENDAT.
ENDLOOP.
2. Parameters作为SQL条件时很麻烦,要判断是否为空
这种情况可以直接用Selection-option,WHERE 直接 IN:
SELECT-OPTIONS: p_bukrs FOR bsis-bukrs NO INTERVALS NO-EXTENSION