ABAP: Tabelle dynamisch definieren

Hallo,

ich möchte in ABAP eine transparente Tabelle aus dem DDIC verwenden, deren Name ueber einen Parameter vorgegeben wird und deshalb dynamisch sein muss.
Die Anweisung TABLES: Txxx hilft mir da sicher nicht weiter, da eben Txxx nicht feststeht. Mit Feldsymbolen und evtl. CREATE DATA komme ich auch nicht weiter, da ich das ja nur fuer interne Tabellen verwenden kann.
Habt Ihr eine Idee?

Bin fuer jeden Tip dankbar!

Gruss
dennbam

Ich habe ein wenig herumgewühlt und folgenden ABAP gefunden. Hier kann eine X-Beliebige Tabelle angegeben werden und der Inhalt wird ausgegeben (entweder alle Einträge oder jeweils einer pro Mandant).

Möglicherweise hilft dir das.

Gruss

MilkShake


report ys_display_table_entries .

tables: dd02l.

data: tabname like dntab-tabname,
w_fld(3800),
clt(3).

parameters i_tab like dntab-tabname.
parameters i_all as checkbox. "display only first entry per client

tabname = i_tab.

start-of-selection.

select single * from dd02l where tabname = tabname.

if sy-subrc = 0.

select * from (tabname) client specified into w_fld order by mandt.
if i_all = ‚X‘.
write: / w_fld(3), ’ ', w_fld+3(80).
else.
if clt w_fld(3).
write: / w_fld(3), ’ ', w_fld+3(80).
clt = w_fld(3).
endif.
endif.
endselect.

else.
write: ‚Table‘, tabname, ‚not found in the system‘.
endif.

oder schau Dir mal den Report NROWS an.

Hallo Milchshake, hi Volker,

danke fuer Eure Tips. Das Problem, was ich habe, ist, dass die ich die hinter LIKE angegebene Tabelle nicht kenne. Die muss dynamisch ermittelt werden. Oder ist die DD02L eine allgemeine Tabelle, mit der alle Definitionen abgedeckt sind?

Ich mach mal ein Beispiel:

Es gibt einen Parameter P1. Bei dem kannst Du mal die T100 angeben und mal die TCURC eingeben. Beide haben unterschiedliche Strukturen. Wie kann ich denn dann z.B. SELECTS oder UPDATES auf den P1 machen?

Sieh Dir einmal meinen Test-Report an. Er ließt dynamisch eine Tabelle über SELECT. Dann macht er einen LOOP über diese dynamische Tabelle und ,…

Noch Fragen ???

Gruß
Arni

*&--------------------------------------------------------------*
*& Report *
*& *
*&--------------------------------------------------------------*
*& *
*& *
*&------- ---------------------------------------- ---------*
REPORT ZDTTEST11 .

* In der Tables-Anweisung müssen alle Tabellen definiert
* werden, die jemals dynamisch verwendet werden könnten. Dies
* ist bis SAP-Release 6.10 notwendig.
TABLES /RTC/AS_JOB_LS.
PARAMETERS: TABNAME LIKE DD02L-TABNAME DEFAULT ‚/RTC/AS_JOB_LS‘.

FIELD-SYMBOLS: TYPE TABLE.

data: table_fields like dbfield occurs 0 with header line.

data: begin of text_table occurs 0,
line(500).
data: end of text_table.

* Die drei folgenden Zeilen sind Systeme notwendig, die nur
* UNICODE Programme erlauben z.B. 6.10 er Systeme mit Profil-
* Parameter abap/unicode_check = on

*data: itab type ref to data.
*create data: itab type standard table of (tabname).
*assign: itab->* to .

* Muß in UNICODE-Systemem verwendet werden.
*perform read_table_data tables
* table_fields
* using tabname.

* Wird in nicht UNCODE-Systemen verwendet
PERFORM READ_TABLE_DATA TABLES TEXT_TABLE
TABLE_FIELDS
USING TABNAME.

* Ausgeben der Spalten-Überschriften
loop at table_fields.
write table_fields-name.
endloop.
write :/.

* Muß in UNICODE-Systemem verwendet werden.
*perform write_list tables
* using tabname.

* Wird in nicht UNCODE-Systemen verwendet
PERFORM WRITE_LIST TABLES TEXT_TABLE
USING TABNAME.

*---------------------------------------------------------------*
* FORM WRITE_LIST *
*----------------------------------- ---------------------------*
* … *
*------------------ --------------------------------------------*
* Ausgabe der einzelnen Tabellen-Zeilen

FORM WRITE_LIST TABLES ITAB
USING TABNAME.

FIELD-SYMBOLS: TYPE TABLE,
TYPE ANY,
.

ASSIGN (TABNAME) TO .

ASSIGN LOCAL COPY OF: ITAB[] TO .

LOOP AT INTO .
do.
read table table_fields index sy-index.
ASSIGN COMPONENT SY-INDEX OF STRUCTURE TO
.
if sy-subrc 0.
exit.
endif.
write : .
enddo.
write :/.
endloop.
ENDFORM.

*---------------------------------------------------------------*
* FORM read_table_data
*---------------------------------------------------------------*
*
*---------------------------------------------------------------*
* Lesen der Tabelleninfos z.B. Anzahl der Felder, Größe der
* Felder,…

FORM READ_TABLE_DATA TABLES ITAB
table_fields structure dbfield
using tabname.

call function ‚DB_GET_TABLE_FIELDS‘
exporting
* FIELD_INFO = ‚A‘
tabname = tabname
* IMPORTING
* SUBRC =
tables
dbfields = table_fields
exceptions
others = 1.

sort table_fields by keyflag descending keypos column.

* Lesen der Tabelle in interene Tabelle.
SELECT * FROM (TABNAME) INTO TABLE ITAB.

endform. "read_table_data

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo!

Wenn du wirklich mit der Tabellenstruktur arbeiten möchtest/ musst, dann wirst du nicht darum herum kommen, die einzelnen Felder aus der DD02L zu lesen, den Tabellennamen zu basteln und den Wert mittels ASSIGN zuzuweisen.
Also FELDNAME = ‚DDICTAB1-FELD1‘.
ASSIGN (FELDNAME) to .

Bzw. um dynamische SELECTs zu machen, musst du die gesamte WHERE-Bedingung in einer internen Tabelle zusammenstellen:
T_WHERE-BEDINGUNG = ‚DDICTAB1-FELD1 = PROGFELD1 AND‘.
T_WHERE-BEDINGUNG = 'DDICTAB1-FELD2 = ‚‚2000‘‘.
SELECT … where (T_WHERE).

Ansonsten gibt’s noch die Möglichkeit ein komplettes Programm dynamisch zu erzeugen…

Gruß, Enno