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 / 4396 / 223 / 1182 ) »
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 / 4396 / 223 / 1182 ) »
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

0
Antw.
6393
Views
1
Antw.
5839
Views
Code-Schnippsel: SPLIT & CONCATENATE für Text
von a-dead-trousers » 06.09.2011 15:38 • Verfasst in Tips + Tricks & FAQs
1
Antw.
8916
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.
1340
Views
Plz Help Code richtig aber trotzdem falsche Daten
von Littlered » 03.06.2005 20:23 • Verfasst in ABAP® Core
4
Antw.
1741
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

Dialog-Container mit Toolbar/Status
vor 3 Stunden von black_adept gelöst 23 / 3568
User Exit EXIT_RQCPRM10_001
vor 3 Stunden von a-dead-trousers 2 / 182
Trennen Strasse und Hausnummer
vor 9 Stunden von payten 13 / 10483
Daten an Tabelle binden
Gestern von Lukas Sanders 2 / 1240

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

Dialog-Container mit Toolbar/Status
vor 3 Stunden von black_adept gelöst 23 / 3568
User Exit EXIT_RQCPRM10_001
vor 3 Stunden von a-dead-trousers 2 / 182
Trennen Strasse und Hausnummer
vor 9 Stunden von payten 13 / 10483
Daten an Tabelle binden
Gestern von Lukas Sanders 2 / 1240

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2790
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9370