Auf Strukturen untypisierter Tabellen zugreifen

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
7 Beiträge • Seite 1 von 1
7 Beiträge Seite 1 von 1

Auf Strukturen untypisierter Tabellen zugreifen

Beitrag von Timo7 (ForumUser / 21 / 0 / 0 ) »
Hallo Leute,

ich möchte innerhalb einer Form-Routine auf die Struktur einer Tabelle zugreifen und dort überprüfen, ob ein bestimmtes Feld in der Struktur vorhanden ist. Dabei soll die Routine allerdings jede Tabelle verarbeiten können. Ich habe schon einiges mit Feldsymbolen probiert, aber leider noch keine Lösung gefunden. Folgend dazu dieses Beispielprogramm:

Code: Alles auswählen.

DATA:
  lt_mara TYPE TABLE OF MARA,
  lt_marc TYPE TABLE OF MARC.

  PERFORM TEST USING lt_mara 'MANDT'.
  PERFORM TEST USING lt_mara 'ABCDE'.
  PERFORM TEST USING lt_marc 'MANDT'.
  PERFORM TEST USING lt_marc 'ABCDE'.

FORM TEST USING lt_data     TYPE ANY TABLE
                l_fieldname TYPE c.

*
* Hier geschieht ein Wunder :)
*

  IF SY-SUBRC = 0.
    WRITE 'vorhanden'.
  ELSE.
    WRITE 'nicht vorhanden'.
  ENDIF.

ENDFORM.
Hat jemand eine Idee, wie man dieses Problem angehen kann?

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


Re: Auf Strukturen untypisierter Tabellen zugreifen

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
Timo7 hat geschrieben:Hat jemand eine Idee, wie man dieses Problem angehen kann?
Hast du dir einmal die RTTS - Run Time Type Services angeschaut? Diese liefern dir zur Laufzeit Informationen zu Datenelementen. Für Tabellen und Strukturen gibt es die Klassen:
CL_ABAP_STRUCTDESCR
CL_ABAP_TABLEDESCR

Beispiele findest du in der Dokumentation der Klassen.
Gruß Hendrik

Beitrag von poldi (Specialist / 116 / 0 / 0 ) »
Hallo Timo7,

der Funktionsbaustein NAMETAB_GET ist dafür auch geeignet.

Viele Grüße
Wilfried
Wir sind lustig und haben es gar nicht nötig!

Beitrag von Timo7 (ForumUser / 21 / 0 / 0 ) »
Vielen Dank für die schnellen Antworten!

Hab es jetzt mit dem objektorientierten Ansatz gelöst. Sehr kurz und einfach:

Code: Alles auswählen.

DATA:
  lt_mara TYPE TABLE OF MARA,
  lt_marc TYPE TABLE OF MARC.

  PERFORM TEST USING lt_mara 'MANDT'.
  PERFORM TEST USING lt_mara 'ABCDE'.
  PERFORM TEST USING lt_marc 'MANDT'.
  PERFORM TEST USING lt_marc 'ABCDE'.

FORM TEST USING lt_data     TYPE ANY TABLE
                l_fieldname TYPE c.
  DATA:
    lo_tabdef TYPE ref to cl_abap_tabledescr.

  lo_tabdef ?= cl_abap_typedescr=>DESCRIBE_BY_DATA( LT_data ).

  READ TABLE lo_tabdef->key WITH KEY NAME = l_fieldname
    TRANSPORTING NO FIELDS.
  IF SY-SUBRC = 0.
    WRITE / 'vorhanden'.
  ELSE.
    WRITE / 'nicht vorhanden'.
  ENDIF.

ENDFORM.

Beitrag von Timo7 (ForumUser / 21 / 0 / 0 ) »
:? Kann man auch irgendwie erreichen, dass Integer-, Packed- und Float-Felder in der Struktur gefunden werden?

Code: Alles auswählen.

TYPES:
  BEGIN OF tw_test,
    C TYPE c,
    N TYPE n,
    D TYPE d,
    T TYPE t,
    X TYPE x,
    I TYPE i,
    P TYPE p,
    F TYPE f,
    S TYPE string,
    Z TYPE xstring,
  END OF tw_test.

DATA:
  lt_test TYPE TABLE OF tw_test.


  PERFORM TEST USING lt_test 'C'.
  PERFORM TEST USING lt_test 'N'.
  PERFORM TEST USING lt_test 'D'.
  PERFORM TEST USING lt_test 'T'.
  PERFORM TEST USING lt_test 'X'.
  PERFORM TEST USING lt_test 'I'.
  PERFORM TEST USING lt_test 'P'.
  PERFORM TEST USING lt_test 'F'.
  PERFORM TEST USING lt_test 'S'.
  PERFORM TEST USING lt_test 'Z'.

FORM TEST USING lt_data     TYPE ANY TABLE
                l_fieldname TYPE c.
  DATA:
    lo_tabdef TYPE ref to cl_abap_tabledescr.

  lo_tabdef ?= cl_abap_typedescr=>DESCRIBE_BY_DATA( LT_data ).

  READ TABLE lo_tabdef->key WITH KEY NAME = l_fieldname
    TRANSPORTING NO FIELDS.
  IF SY-SUBRC = 0.
    WRITE: / l_fieldname, ': vorhanden'.
  ELSE.
    WRITE: / l_fieldname, ': nicht vorhanden'.
  ENDIF.

ENDFORM.

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
Timo7 hat geschrieben::? Kann man auch irgendwie erreichen, dass Integer-,
Packed- und Float-Felder in der Struktur gefunden werden?

Code: Alles auswählen.

  READ TABLE lo_tabdef->key WITH KEY NAME = l_fieldname
    TRANSPORTING NO FIELDS.
Vorsichtig die obere Anweisung greift nur auf die Schlüsselfelder der Tabelle zu. Du willst aber alle Felder der Zeile verproben, dafür mußt du die Zeilenstruktur auswerten:

Code: Alles auswählen.

FORM test USING lt_data     TYPE ANY TABLE
                l_fieldname TYPE c.
  DATA:
*   Referenz auf Tabellenbeschreibung
    lo_tabdef TYPE REF TO cl_abap_tabledescr,
*   Referenz auf Tabellenstrukturbeschreibung
    lo_datadef  TYPE REF TO cl_abap_datadescr,
    lo_strucdef TYPE REF TO cl_abap_structdescr.

* Tabellenbeschreibung hohlen
  lo_tabdef ?= cl_abap_typedescr=>describe_by_data( lt_data ).

* Tabellenstrukturbeschreibung hohlen
  CALL METHOD lo_tabdef->get_table_line_type
    RECEIVING
      p_descr_ref = lo_datadef.

* Typecasting
  lo_strucdef ?= lo_datadef.

* Felder der Tabellenstruktur verproben
  READ TABLE lo_strucdef->components WITH KEY name = l_fieldname
                                     TRANSPORTING NO FIELDS.

  IF sy-subrc = 0.
    WRITE: / l_fieldname, ': vorhanden'.
  ELSE.
    WRITE: / l_fieldname, ': nicht vorhanden'.
  ENDIF.

ENDFORM.                    "TEST
Gruß Hendrik

Beitrag von Timo7 (ForumUser / 21 / 0 / 0 ) »
Thxal - das wars dann :D

So funktionierts dann auch mit I-, F- und P-Feldern:

Code: Alles auswählen.

TYPES:
  BEGIN OF tw_test,
    C TYPE c,
    N TYPE n,
    D TYPE d,
    T TYPE t,
    X TYPE x,
    I TYPE i,
    P TYPE p,
    F TYPE f,
    S TYPE string,
    Z TYPE xstring,
  END OF tw_test.

DATA:
  lt_test TYPE TABLE OF tw_test.


  PERFORM TEST USING lt_test 'C'.
  PERFORM TEST USING lt_test 'N'.
  PERFORM TEST USING lt_test 'D'.
  PERFORM TEST USING lt_test 'T'.
  PERFORM TEST USING lt_test 'X'.
  PERFORM TEST USING lt_test 'I'.
  PERFORM TEST USING lt_test 'P'.
  PERFORM TEST USING lt_test 'F'.
  PERFORM TEST USING lt_test 'S'.
  PERFORM TEST USING lt_test 'Z'.

FORM TEST USING lt_data     TYPE ANY TABLE
                l_fieldname TYPE c.
  DATA:
    lo_tabdef TYPE ref to cl_abap_tabledescr,
    lo_strdef TYPE ref to cl_abap_structdescr.

  lo_tabdef ?= cl_abap_typedescr=>DESCRIBE_BY_DATA( LT_data ).
  lo_strdef ?= lo_tabdef->get_table_line_type( ).

  READ TABLE lo_strdef->components WITH KEY name = l_fieldname
                                   TRANSPORTING NO FIELDS.
  IF SY-SUBRC = 0.
    WRITE: / l_fieldname, ': vorhanden'.
  ELSE.
    WRITE: / l_fieldname, ': nicht vorhanden'.
  ENDIF.

ENDFORM.

Seite 1 von 1

Vergleichbare Themen

14
Antw.
814
Views
auf Tabellen in Strukturen zugreifen
von Micha_ela » 07.06.2023 15:46 • Verfasst in ABAP® für Anfänger
1
Antw.
2433
Views
Tabellen/Strukturen zusammenführen
von m4rkusr » 19.10.2006 08:00 • Verfasst in ABAP® Core
7
Antw.
3194
Views
dynamische Tabellen in komplexen Strukturen
von mike81503 » 28.07.2006 15:03 • Verfasst in ABAP® Core
0
Antw.
1098
Views
Auf MBS SQL-Server zugreifen
von bohne » 24.10.2005 11:52 • Verfasst in ABAP® für Anfänger
0
Antw.
3200
Views
Von Java auf SAP zugreifen
von Challana » 27.07.2007 09:40 • Verfasst in Java & SAP®

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Nach MESSAGE TYPE E Felder entsperren
vor 4 Stunden von msfox gelöst 7 / 6044
ABAP - Mail so10 Text
vor 10 Stunden von retsch 6 / 130
selection-screen comment mit icon
vor 18 Stunden von DeathAndPain 9 / 1174

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

Nach MESSAGE TYPE E Felder entsperren
vor 4 Stunden von msfox gelöst 7 / 6044
ABAP - Mail so10 Text
vor 10 Stunden von retsch 6 / 130
selection-screen comment mit icon
vor 18 Stunden von DeathAndPain 9 / 1174

Unbeantwortete Forenbeiträge

SD_PRINT_TERMS_OF_PAYMENT
vor 5 Tagen von Manfred K. 1 / 938
BUSOBJEKT zu CMIS PHIO ermitteln
vor 3 Wochen von snooga87 1 / 2747