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 5 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_data( ls_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_data( ls_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=>create( lt_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 = 1.
ENDIF.