• Header exxsens Developer Blog

Daten nach XML transformieren / Simple Transformation

Der Datenaustausch per XML gehört heute zum Standard. Immer wieder wir die XML-Datei hier mühevoll von Hand im ABAP erzeugt sowie in einem weiteren Programm beim einlesen analysiert.

Das folgende Programm selektiert die Einträge der Tabelle USR02 und wandelt diese mit Hilfe der Technologie Simple Transformation in eine XML-Datei um. Anschließend wird die erzeugte XML-Datei mit der gleichen Transformation wieder in eine interne Tabelle umgewandelt. Diese Form der Entwicklung hat den Vorteil, dass Sie sowohl für IN- als auch OUTbound-Schnittstellen die gleiche Transformation verwenden können.


DATA: gv_xml       TYPE string,
      gt_usr02_new TYPE TABLE OF usr02,
      gt_xml_table TYPE STANDARD TABLE OF string.


* ein paar Daten selektieren
SELECT * FROM usr02 INTO TABLE @DATA(gt_usr02) ORDER BY bname.

* Umwandung in ein XML
CALL TRANSFORMATION z_exl_01
 SOURCE lt_usr02 = gt_usr02
 RESULT XML gv_xml.

* XML mal ausgeben
WRITE: gv_xml.

* und jetzt das XML wieder in eine interne Tabelle umwandeln
CALL TRANSFORMATION z_exl_01
 SOURCE XML gv_xml " lt_usr02 = gt_usr02_new
 RESULT lt_usr02 = gt_usr02_new. "XML gv_xml.


ULINE.
SKIP 2.

LOOP AT gt_usr02_new ASSIGNING FIELD-SYMBOL(<gs_usr02>).

  WRITE: / <gs_usr02>-bname, <gs_usr02>-gltgv, <gs_usr02>-gltgb.

ENDLOOP.


* Daten an itab für Download
APPEND gv_xml TO gt_xml_table.

* Download auf den Rechner ausführen
CALL METHOD cl_gui_frontend_services=>gui_download
  EXPORTING
    filename                = 'C:\Temp\example01.xml'
    filetype                = 'ASC'
  CHANGING
    data_tab                = gt_xml_table
  EXCEPTIONS
    file_write_error        = 1
    no_batch                = 2
    gui_refuse_filetransfer = 3
    invalid_type            = 4
    no_authority            = 5
    unknown_error           = 6
    header_not_allowed      = 7
    separator_not_allowed   = 8
    filesize_not_allowed    = 9
    header_too_long         = 10
    dp_error_create         = 11
    dp_error_send           = 12
    dp_error_write          = 13
    unknown_dp_error        = 14
    access_denied           = 15
    dp_out_of_memory        = 16
    disk_full               = 17
    dp_timeout              = 18
    file_not_found          = 19
    dataprovider_exception  = 20
    control_flush_error     = 21
    not_supported_by_gui    = 22
    error_no_gui            = 23
    OTHERS                  = 24.
IF sy-subrc <> 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ELSE.

ENDIF.

CALL METHOD cl_gui_frontend_services=>execute
  EXPORTING
    document               = 'C:\Temp\example01.xml'
    operation              = 'OPEN'
  EXCEPTIONS
    cntl_error             = 1
    error_no_gui           = 2
    bad_parameter          = 3
    file_not_found         = 4
    path_not_found         = 5
    file_extension_unknown = 6
    error_execute_failed   = 7
    synchronous_failed     = 8
    not_supported_by_gui   = 9
    OTHERS                 = 10.
IF sy-subrc <> 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF. 


Das folgende Coding enthält die dazugehörige Transformation.


<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates" xmlns:ddic="http://www.sap.com/abapxml/types/dictionary" xmlns:def="http://www.sap.com/abapxml/types/defined">
  <!-- Definition der Schnittstelle-->
  <tt:root name="LT_USR02"/>
  <tt:template>
    <!-- Hier wird das feste Root-Tag geöffnet-->
    <USR02>
      <!-- loop über die übergebene interne Tabelle -->
      <tt:loop name="line" ref=".LT_USR02">
        <USERID>
          <!-- die Spalte BNAME ist der Schlüssel, daher immer gefüllt und es ist keine Prüfung notwendig -->
          <BNAME>
            <tt:value ref="$line.bname"/>
          </BNAME>
          <!-- die Spalte GLTGV könnte leer sein, daher muss eine Bedingung mit eingebaut werden -->
          <tt:cond>
            <GLTGV>
              <tt:value ref="$line.gltgv"/>
            </GLTGV>
          </tt:cond>
        </USERID>
      </tt:loop>
      <!-- schließen des festen Root-Tags-->
    </USR02>
  </tt:template>
</tt:transform> 
Transaktionen sperren
employee notify TV

Ähnliche Beiträge

Empfehlen Sie uns weiter