Code-Schnippsel: bel. Daten mittels RTTI bestimmen

Hinweise, Tips und Tricks, FAQs - keine Anfragen!!
2 Beiträge • Seite 1 von 1
2 Beiträge Seite 1 von 1

Code-Schnippsel: bel. Daten mittels RTTI bestimmen

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
hi!

Ein weiterer Code-Schnippsel meinerseits.
Grundsätzlich ist das Coding dazu da, aus einer internen Tabelle/Struktur die Componenten auszulesen, aber kann auch als Beispiel dienen was man mit den RTTI Klassen von ABAP alles machen kann. Wiedermal hab ich der Einfachheit halber das ganze von einer Methode in eine Form-Routine gepackt.

Code: Alles auswählen.

FORM return_components USING ur_typedescr TYPE REF TO cl_abap_typedescr
                       CHANGING ct_component TYPE abap_component_tab.
  DATA:
    lt_component_sub       TYPE abap_component_tab,
    lt_component_org       TYPE abap_component_tab,
    lt_component_new       TYPE abap_component_tab,
    lr_structdescr         TYPE REF TO cl_abap_structdescr,
    lr_tabledescr          TYPE REF TO cl_abap_tabledescr,
    lr_datadescr           TYPE REF TO cl_abap_datadescr,
    lr_refdescr            TYPE REF TO cl_abap_refdescr,
    lr_typedescr           TYPE REF TO cl_abap_typedescr.

  FIELD-SYMBOLS:
    <ls_component_sub>     TYPE abap_componentdescr,
    <ls_component>         TYPE abap_componentdescr.

  REFRESH ct_component.

  IF ur_typedescr IS NOT BOUND.
    RETURN.
  ENDIF.

  lr_typedescr = ur_typedescr.

* Referenzen auflösen
  WHILE lr_typedescr->kind EQ cl_abap_typedescr=>kind_ref.
    lr_refdescr ?= lr_typedescr.
    lr_typedescr = lr_refdescr->get_referenced_type( ).
  ENDWHILE.

  CASE lr_typedescr->kind.
    WHEN cl_abap_typedescr=>kind_table.
      lr_tabledescr ?= lr_typedescr.
      lr_datadescr = lr_tabledescr->get_table_line_type( ).
      lr_typedescr = lr_datadescr.
      PERFORM return_components USING lr_typedescr CHANGING ct_component.
    WHEN cl_abap_typedescr=>kind_struct.
      lr_structdescr ?= lr_typedescr.
      lt_component_org = lr_structdescr->get_components( ).
* Prüfen ob es Includes gibt die aufgelöst werden müssen
      READ TABLE lt_component_org TRANSPORTING NO FIELDS WITH KEY as_include = abap_true.
* Wenn keine Includes gefunden wurden...
      IF sy-subrc NE 0.
* ... die zuvor erstelle Struktur zurückgeben ...
        ct_component = lt_component_org.
* ... sonst auflösen und neu erstellen
      ELSE.
        REFRESH lt_component_new.

        LOOP AT lt_component_org ASSIGNING <ls_component>.
          IF <ls_component>-as_include EQ abap_true.
            lr_typedescr = <ls_component>-type.
            PERFORM return_components USING lr_typedescr CHANGING lt_component_sub.
            IF <ls_component>-suffix IS NOT INITIAL.
              LOOP AT lt_component_sub ASSIGNING <ls_component_sub>.
                CONCATENATE <ls_component_sub>-name <ls_component>-suffix INTO <ls_component_sub>-name.
              ENDLOOP.
            ENDIF.
            INSERT LINES OF lt_component_sub INTO TABLE lt_component_new.
          ELSE.
            INSERT <ls_component> INTO TABLE lt_component_new.
          ENDIF.
        ENDLOOP.

        ct_component = lt_component_new.
      ENDIF.
    WHEN cl_abap_typedescr=>kind_elem.
      APPEND INITIAL LINE TO ct_component ASSIGNING <ls_component>.
*      <ls_component>-name = 'TABLE_LINE'.
      <ls_component>-type ?= lr_typedescr.
  ENDCASE.
ENDFORM.
So kann man das Coding aufrufen:

Code: Alles auswählen.

DATA: lr_typedescr TYPE REF TO cl_abap_typedescr,
      lt_component TYPE abap_component_tab.

lr_typedescr = cl_abap_typedescr=>describe_by_data( ... ).
PERFORM return_components USING lr_typedescr CHANGING lt_component.
Ich hoffe damit sollte es etwas klarer werden wie man RTTI einsetzten kann.

lg ADT

EDIT: Kleine Fehlerkorrektur :oops:
Zuletzt geändert von a-dead-trousers am 21.01.2014 12:30, insgesamt 3-mal geändert.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag (Insgesamt 5):
Spookykidnickname8Icke0801iboLegxis

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Überleitung zu RTTC

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
Das Ergebnis "lt_component" vom Typ ABAP_COMPONENT_TAB kann übrigens als Eingabe-Parameter für CL_ABAP_STRUCTDESCR=>CREATE fungieren mit der man eine dyn. Strukturbeschreibung erstellen kann. Das Ergbnis daraus kann man wiederum der CL_ABAP_TABLEDESCR=>CREATE übergeben und man erhällt einen dyn. Tabellentyp. Mit CREATE DATA ... TYPE HANDLE ... kann man so eine dyn. interne Tabelle erstellen.
Man kann auch die "lt_component" um zusätzliche Felder erweitert und so eine völlig neue interne Tabellen erstellen.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag (Insgesamt 2):
iboIcke0801

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Seite 1 von 1

Vergleichbare Themen

1
Antw.
5516
Views
Code-Schnippsel: SPLIT & CONCATENATE für Text
von a-dead-trousers » 06.09.2011 15:38 • Verfasst in Tips + Tricks & FAQs
0
Antw.
6124
Views
1
Antw.
8558
Views
Code-Schnippsel: Richtiger Umgang mit SM30/SM34 Zeitpunkten
von a-dead-trousers » 06.03.2012 13:50 • Verfasst in Tips + Tricks & FAQs
2
Antw.
1184
Views
Plz Help Code richtig aber trotzdem falsche Daten
von Littlered » 03.06.2005 20:23 • Verfasst in ABAP® Core
4
Antw.
1626
Views
RTTI Klassen
von JohnLocklay » 28.11.2018 14:43 • Verfasst in ABAP Objects®

Über diesen Beitrag

a-dead-trousers
Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 254

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 254

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 107
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 140