Code-Schnippsel: bel. Daten mittels RTTI bestimmen


Hinweise, Tips und Tricks, FAQs - keine Anfragen!!

Moderatoren: Jan, Steff, SRMler

Code-Schnippsel: bel. Daten mittels RTTI bestimmen

Beitragvon a-dead-trousers » 04.01.2012, 09:36

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.
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.07
Basis: 7.40

Für diese Nachricht hat a-dead-trousers 4 Dankeschön bekommen :
ibo, Icke0801, nickname8, Spookykid
a-dead-trousers
Top Expert
 
Beiträge: 2962
Registriert: 07.02.2011, 13:40
Dank erhalten: 730 mal
Ich bin: Entwickler/in

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

Überleitung zu RTTC

Beitragvon a-dead-trousers » 04.01.2012, 10:15

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.
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.07
Basis: 7.40

Für diese Nachricht hat a-dead-trousers einen Dank bekommen :
ibo
a-dead-trousers
Top Expert
 
Beiträge: 2962
Registriert: 07.02.2011, 13:40
Dank erhalten: 730 mal
Ich bin: Entwickler/in


Zurück zu Tips + Tricks & FAQs

  Aktuelle Beiträge   
Steuerkommandos in Adobe Forms
vor 8 Stunden von ewx 0 Antw.
Bilder aus SMW0 im Dynpro nutzen?
vor 13 Stunden von newone 0 Antw.
OLE (Excel): GET PROPERTY OF cell 'Value' feld
vor 14 Stunden von heiko-77 3 Antw.
HUMV4-IDENT Handling Unit Tabelle
Gestern von ewx 1 Antw.
Transaktion für Pflege Custom. Tabelle
Gestern von DeathAndPain 4 Antw.

  Ähnliche Beiträge beta
gelöst Spalte im ALV bestimmen
04.04.2005, 09:29 von Gast 1 Antw.
Sap Download mittels Excel(+VBA)
18.04.2004, 14:48 von ich 4 Antw.
Zugriff auf XML-Document mittels XPATH
23.05.2017, 10:02 von mydoghasworms 3 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron