导航

生成XML文件 两种方法 包括CALL TRANSFORMATION的方法

Posted on 2010-07-21 23:52  Hahappyppy  阅读(1565)  评论(0编辑  收藏  举报

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