CALL TRANSFORMATION - 4AP.de - ABAP Syntaxbeispiele:

(kopieren erlaubt aber auf eigene Gefahr :-))

Mit dem Befehl Call Transformation kann man z.B. aus einer Tabelle direkt XML erzeugen. Das Ergebnis steht in lv_xml_out.

 

REPORT zca_tn_call_transformation." LINE-SIZE 120.

DATA:
  lt_source LIKE TABLE OF mara,
  lv_xml_out TYPE string.
SELECT FROM mara
  UP TO ROWS
  INTO TABLE lt_source.

CALL TRANSFORMATION ('ID')
*  OPTIONS XML_HEADER = 'without_encoding'
SOURCE aus_der_mara lt_source
RESULT XML lv_xml_out.


* write lv_xml_out.
 

#################

Dabei ist entscheidend wie der Ausgabestring definiert wird. Als String oder als Xstring. Dementsprechend wird der erzeugte Zeichensatz angepasst: mal UTF-8, mal iso-8859-1.

Wird ein String benutzt, darf die Daten-Struktur der erzeugenden Daten selber keinen String enthalten. Daher im Beispeil der Austausch gegen TEXT8192.

Wird ein Xstring benutzt ist das kein Problem!

 

REPORT  zca_tn_create_xml_utf_8.

START-OF-SELECTION.

* CREATE der Klasse CL_ABAP_STRUCTDESCR zur Erzeugung von Typobjekten für strukturierte Datentypen
* auf Basis einer Komponententabelle.
  DATA:
    ls_struct_ordrsp TYPE zi2m_lss_ordrsp,
    ls_text          TYPE zi2m_lss_string_to_text. " Struktur enthält genau ein Feld namens TEXT vom Typ String

  DATA:
  lr_structdescr TYPE REF TO cl_abap_structdescr,
  lr_datadescr TYPE REF TO cl_abap_datadescr,
  lr_datadescr_incl TYPE REF TO cl_abap_datadescr,
  lt_components TYPE abap_component_tab,
  lt_components_xml TYPE cl_abap_structdescr=>component_table,
  ls_components TYPE LINE OF abap_component_tab,
  ls_components_string TYPE LINE OF abap_component_tab. " für den Sonderfall String

* now describe the special TEXT8192 structure
  lr_structdescr ?= cl_abap_structdescr=>describe_by_datals_text ).
  lt_components lr_structdescr->get_components).
  LOOP AT lt_components INTO ls_components_string WHERE name 'TEXT'.
*   so, haben wir
  ENDLOOP. " AT lt_components INTO ls_components

* now describe the ls_struct_ORDRSP structure
  lr_structdescr ?= cl_abap_structdescr=>describe_by_datals_struct_ordrsp ).
  lt_components lr_structdescr->get_components).

  LOOP AT lt_components INTO ls_components.
    lr_datadescr ls_components-type. " type ~~ cl_abap_datadesc
    IF lr_datadescr->type_kind 'g'. " String  TYPEKIND_STRING
*     STRING mit TEXT ersetzen
      APPEND ls_components_string TO lt_components_xml.
    ELSE.
*     Normalfall
      APPEND ls_components TO lt_components_xml.
    ENDIF.
  ENDLOOP. " AT lt_components INTO ls_components

  DATA: ls_xml_struct_type TYPE REF TO cl_abap_structdescr.
  ls_xml_struct_type cl_abap_structdescr=>createlt_components_xml ). " das entspricht der NEUEN Struktur

* eine neue Struktur erzeugen
  DATA:
    ls_ordrsp_without_strings TYPE REF TO data,
    lt_ordrsp_without_strings TYPE REF TO data,
    ls_recadv_without_strings TYPE REF TO data,
    lt_recadv_without_strings TYPE REF TO data.
  FIELD-SYMBOLS:
    <ls_ordrsp_without_strings>        TYPE ANY,
    <lt_ordrsp_without_strings>        TYPE STANDARD TABLE,
    <ls_recadv_without_strings>        TYPE ANY,
    <lt_recadv_without_strings>        TYPE STANDARD TABLE.

  CREATE DATA ls_ordrsp_without_strings TYPE HANDLE ls_xml_struct_type.
  ASSIGN ls_ordrsp_without_strings->TO <ls_ordrsp_without_strings>.

* aus der Struktur eine Tabelle erzeugen
  DATA: lo_tabledescr  TYPE REF TO cl_abap_tabledescr.
  CALL METHOD cl_abap_tabledescr=>create
    EXPORTING
      p_line_type  ls_xml_struct_type
*      P_TABLE_KIND = TABLEKIND_STD
*      P_UNIQUE     = ABAP_FALSE
*      P_KEY        =
*      P_KEY_KIND   = KEYDEFKIND_DEFAULT
    RECEIVING
      p_result     lo_tabledescr.
*  create data lr_dref like standard table of <ls_tab>.
  CREATE DATA lt_ordrsp_without_strings TYPE HANDLE lo_tabledescr.
  ASSIGN lt_ordrsp_without_strings->TO <lt_ordrsp_without_strings>.



* Testdaten holen
  DATA:
    lt_zi2m_lss_ordrsp TYPE TABLE OF zi2m_lss_ordrsp.

* ZI2M_LSS_ORDRSP
  SELECT FROM zi2m_lss_ordrsp CLIENT SPECIFIED
    INTO TABLE lt_zi2m_lss_ordrsp
   WHERE mandt sy-mandt
     AND lifnr '0010057277'
     AND ebeln =&nbsnbsp;'4700000038'.


  DATA: lv_xml_out TYPE string,
        lv_xml_xout TYPE xstring.
* Daten mappen
  IF NOT lt_zi2m_lss_ordrsp IS INITIAL.
*     ACHTUNG hier gehen jetzt ggfls. zu lange Texte verloren.
*     Falls in dem Text-String des Auftrages mehr als 8192 CHAR sind fehlt der Rest anschließend
    LOOP AT lt_zi2m_lss_ordrsp INTO ls_struct_ordrsp.
      MOVE-CORRESPONDING ls_struct_ordrsp TO <ls_ordrsp_without_strings>.
      APPEND <ls_ordrsp_without_strings> TO <lt_ordrsp_without_strings>.
    ENDLOOP." AT lt_zi2m_lss_ordrsp INTO ls_struct_ordrsp
*   XML erzeugen
    TRY.
        CALL TRANSFORMATION ID
          SOURCE ordrsp lt_zi2m_lss_ordrsp[]
          RESULT XML lv_xml_xout.  " UTF-8

        CALL TRANSFORMATION ('ID')
          SOURCE ordrsp <lt_ordrsp_without_strings>[]
          RESULT XML lv_xml_out.   " iso-8859-1
* wenn DATEI IM DEBUGGER ABGREIFEN!  ~ lv_xml_out
* !!! DANN Bindestriche entfernen

      CATCH cx_st_error.
*    jo
    ENDTRY.
  ENDIF. " NOT lt_zi2m_lss_ordrsp IS INITIAL


  IF 1.
  ENDIF.