Code: Alles auswählen.
TYPES: BEGIN OF typ_s_xmltree,
layout(80) TYPE C,
BEGIN OF typ_zone,
zone(80) TYPE C,
posX(80) TYPE C,
posY(80) TYPE C,
width(80) TYPE C,
height(80) TYPE C,
END OF typ_zone,
BEGIN OF typ_lbl,
lbl(80) TYPE C,
target_obj(80) TYPE C,
posX(80) TYPE C,
posY(80) TYPE C,
font(80) TYPE C,
END OF typ_lbl,
BEGIN OF typ_flux,
flux(80) TYPE C,
target_obj(80) TYPE C,
source_obj(80) TYPE C,
typ(80) TYPE C,
color(80) TYPE C,
END OF typ_flux,
BEGIN OF typ_status,
status(80) TYPE C,
target_obj(80) TYPE C,
BEGIN OF typ_werte,
wert(80) TYPE C,
inhalt(80) TYPE C,
END OF typ_werte,
END OF typ_status,
END OF typ_s_xmltree.
Code: Alles auswählen.
TYPES:
BEGIN OF typ_s_werte_line,
wert TYPE char40,
inhalt TYPE char40,
END OF typ_s_werte_line.
TYPES: typ_t_werte TYPE typ_s_werte_line OCCURS 0.
TYPES:
BEGIN OF typ_s_status_line,
status(80) TYPE c,
target_obj(80) TYPE c,
t_werte TYPE typ_t_werte,
END OF typ_s_status_line.Code: Alles auswählen.
DATA:
lo_structdescr TYPE REF TO cl_abap_structdescr,
lo_tabledescr TYPE REF TO cl_abap_tabledescr,
lt_components TYPE cl_abap_structdescr=>component_table,
ls_component LIKE LINE OF lt_components,
lds_struct TYPE REF TO data,
ldt_table TYPE REF TO data.
FIELD-SYMBOLS:
<lt_table> TYPE ANY TABLE.
ls_component-fieldname = 'MATNR'.
ls_component-type = cl_abap_typedescr=>describe_by_name( p_name = 'MATNR' ).
INSERT ls_component INTO TABLE lt_components.
..."weitere Felder
lo_structdescr = cl_abap_structdescr=>create( p_components = lt_components ).
CREATE DATA lds_struct TYPE HANDLE lo_structdescr.
lo_tabledescr = cl_abap_tabledescr=>create(
p_line_type = lo_structdescr
p_table_kind = cl_abap_tabledescr=>tablkind_std ).
CREATE DATA ldt_table TYPE HANDLE lo_tabledescr.
ASSIGN ldt_table->* TO <lt_table>.Bin zwar nicht Erlgram, aber hatte langeweile. Hier der Ablauf für deine tiefen Tabelle aus deinem ersten Post:MarkusW hat geschrieben: Ich bin gespannt auf ein Ansatz von Dir
Code: Alles auswählen.
REPORT z_test_dyn_struct.
TYPE-POOLS: abap.
* Objectrefernezen für Struckturbeschreibung
DATA: lr_strucdescr_typ_s_xmltree TYPE REF TO cl_abap_structdescr,
lr_strucdescr_typ_zone TYPE REF TO cl_abap_structdescr,
lr_strucdescr_typ_lbl TYPE REF TO cl_abap_structdescr,
lr_strucdescr_typ_flux TYPE REF TO cl_abap_structdescr,
lr_strucdescr_typ_status TYPE REF TO cl_abap_structdescr,
lr_strucdescr_typ_werte TYPE REF TO cl_abap_structdescr.
* Zeiger auf erzeugte Strucktur
DATA: lr_strucdata_typ_s_xmltree TYPE REF TO data.
* Objectreferenzen für Tabellenbeschreibung
DATA: lr_tabledescr_typ_s_xmltree TYPE REF TO cl_abap_tabledescr,
lr_tabledescr_typ_zone TYPE REF TO cl_abap_tabledescr,
lr_tabledescr_typ_lbl TYPE REF TO cl_abap_tabledescr,
lr_tabledescr_typ_flux TYPE REF TO cl_abap_tabledescr,
lr_tabledescr_typ_status TYPE REF TO cl_abap_tabledescr,
lr_tabledescr_typ_werte TYPE REF TO cl_abap_tabledescr.
* Zeiger auf erzeugete Tabelle
DATA: lr_tabledata_typ_s_xmltree TYPE REF TO data.
DATA: ls_component TYPE abap_componentdescr, "Zeile der Strukturbeschreibung
lt_component TYPE abap_component_tab. "Tabelle der Strukturbeschreibung
* Field-Symboles um mit den Daten arbeiten zu können
FIELD-SYMBOLS: <fs_comp> TYPE ANY, "Um auf eine Komponente zu zugreifen
<fs_struct> TYPE ANY, "Um auf die Struktur zu zugreifen
<fs_table> TYPE ANY. "Um auf die Tabelle zu zugreifen
START-OF-SELECTION.
*** Struckturen von innen nach aussen aufbauen:
** STEP 1: type_werte
* Tabelle mit Komponenten der Strucktur erstellen
CLEAR ls_component.
ls_component-name = 'WERT'.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
APPEND ls_component TO lt_component.
CLEAR ls_component.
ls_component-name = 'INHALT'.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
APPEND ls_component TO lt_component.
* Struckturbeschreibung für type_werte erstellen
lr_strucdescr_typ_werte ?= cl_abap_structdescr=>create( lt_component ).
* Tabellenbeschreibung für type_wert erstellen
lr_tabledescr_typ_werte ?= cl_abap_tabledescr=>create( lr_strucdescr_typ_werte ).
** STEP 2: type_status
REFRESH lt_component.
CLEAR ls_component.
ls_component-name = 'STATUS'.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
APPEND ls_component TO lt_component.
CLEAR ls_component.
ls_component-name = 'TARGET_OBJ'.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
APPEND ls_component TO lt_component.
CLEAR ls_component.
ls_component-name = 'TYP_WERTE'.
ls_component-type ?= lr_tabledescr_typ_werte. "Tabellendefinition aus Step1
APPEND ls_component TO lt_component.
* Struckturbeschreibung für type_status erstellen
lr_strucdescr_typ_status ?= cl_abap_structdescr=>create( lt_component ).
* Tabellenbeschreibung für type_status erstellen
lr_tabledescr_typ_status ?= cl_abap_tabledescr=>create( lr_strucdescr_typ_status ).
** STEP 3: type_flux
REFRESH lt_component.
CLEAR ls_component.
ls_component-name = 'FLUX'.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
APPEND ls_component TO lt_component.
CLEAR ls_component.
ls_component-name = 'TARGET_OBJ'.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
APPEND ls_component TO lt_component.
CLEAR ls_component.
ls_component-name = 'SOURCE_OBJ'.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
APPEND ls_component TO lt_component.
CLEAR ls_component.
ls_component-name = 'TYP'.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
APPEND ls_component TO lt_component.
CLEAR ls_component.
ls_component-name = 'COLOR'.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
APPEND ls_component TO lt_component.
* Struckturbeschreibung für type_flux erstellen
lr_strucdescr_typ_flux ?= cl_abap_structdescr=>create( lt_component ).
* Tabellenbeschreibung für type_flux erstellen
lr_tabledescr_typ_flux ?= cl_abap_tabledescr=>create( lr_strucdescr_typ_flux ).
** STEP 4: type_lbl
REFRESH lt_component.
CLEAR ls_component.
ls_component-name = 'LBL'.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
APPEND ls_component TO lt_component.
CLEAR ls_component.
ls_component-name = 'TARGET_OBJ'.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
APPEND ls_component TO lt_component.
CLEAR ls_component.
ls_component-name = 'POSX'.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
APPEND ls_component TO lt_component.
CLEAR ls_component.
ls_component-name = 'POSY'.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
APPEND ls_component TO lt_component.
CLEAR ls_component.
ls_component-name = 'FONT'.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
APPEND ls_component TO lt_component.
* Struckturbeschreibung für type_lbl erstellen
lr_strucdescr_typ_lbl ?= cl_abap_structdescr=>create( lt_component ).
* Tabellenbeschreibung für type_lbl erstellen
lr_tabledescr_typ_lbl ?= cl_abap_tabledescr=>create( lr_strucdescr_typ_lbl ).
** STEP 5: type_zone
REFRESH lt_component.
CLEAR ls_component.
ls_component-name = 'ZONE'.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
APPEND ls_component TO lt_component.
CLEAR ls_component.
ls_component-name = 'POSX'.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
APPEND ls_component TO lt_component.
CLEAR ls_component.
ls_component-name = 'POSY'.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
APPEND ls_component TO lt_component.
CLEAR ls_component.
ls_component-name = 'WIDTH'.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
APPEND ls_component TO lt_component.
CLEAR ls_component.
ls_component-name = 'HEIGHT'.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
APPEND ls_component TO lt_component.
* Struckturbeschreibung für type_zone erstellen
lr_strucdescr_typ_zone ?= cl_abap_structdescr=>create( lt_component ).
* Tabellenbeschreibung für type_zone erstellen
lr_tabledescr_typ_zone ?= cl_abap_tabledescr=>create( lr_strucdescr_typ_zone ).
** STEP 6: typ_s_xmltree
REFRESH lt_component.
CLEAR ls_component.
ls_component-name = 'LAYOUT'.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
APPEND ls_component TO lt_component.
CLEAR ls_component.
ls_component-name = 'TYPE_ZONE'.
ls_component-type ?= lr_tabledescr_typ_zone.
APPEND ls_component TO lt_component.
CLEAR ls_component.
ls_component-name = 'TYPE_LBL'.
ls_component-type ?= lr_tabledescr_typ_lbl.
APPEND ls_component TO lt_component.
CLEAR ls_component.
ls_component-name = 'TYPE_FLUX'.
ls_component-type ?= lr_tabledescr_typ_flux.
APPEND ls_component TO lt_component.
CLEAR ls_component.
ls_component-name = 'TYPE_STATUS'.
ls_component-type ?= lr_tabledescr_typ_status.
APPEND ls_component TO lt_component.
* Struckturbeschreibung für type_s_xmltree erstellen
lr_strucdescr_typ_s_xmltree ?= cl_abap_structdescr=>create( lt_component ).
* Tabellenbeschreibung für type_s_xmltree erstellen
lr_tabledescr_typ_s_xmltree ?= cl_abap_tabledescr=>create( lr_strucdescr_typ_s_xmltree ).
** STEP 7: Tabelle erzeugen und ein Feld-Symbole drauf
CREATE DATA lr_strucdata_typ_s_xmltree TYPE HANDLE lr_strucdescr_typ_s_xmltree.
ASSIGN lr_strucdata_typ_s_xmltree->* TO <fs_struct>.
CREATE DATA lr_tabledata_typ_s_xmltree TYPE HANDLE lr_tabledescr_typ_s_xmltree.
ASSIGN lr_tabledata_typ_s_xmltree->* TO <fs_table> .
Code: Alles auswählen.
DATA: ls_component TYPE abap_componentdescr, "Zeile der Strukturbeschreibung
lt_component TYPE abap_component_tab. "Tabelle der Strukturbeschreibung Code: Alles auswählen.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ). Ist aus dem TypePool ABAP. abap_componentdescr kommt dierekt nachMarkusW hat geschrieben:woher ist der Typ? (abap_componentdescr und die _tab)
in den Type-pools 'abap' gibt es nur ein 'abap_compdescr' bzw. 'abap_compdescr_tab'.
Wenn ich das änder, geht der rest aber auch nicht ,weil du anderen Namen benutzt.
Hm, keine Ahnung ist die Klasse cl_abap_elemdescr vorhanden?MarkusW hat geschrieben: zudem gibt es die methode get_c nicht.Code: Alles auswählen.
ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
Bei mir Basis 6.40. Da scheint es Unterschiede zu geben. Die RTTS sind erst mit Reales 6.10 eingeführt worden. Evtl. wurde da von Reales zu Releas was bei gestrickt.MarkusW hat geschrieben: bin auf nem 4.7 unicode system.
basis ist 620.