interne tabelle dynamisch in der select anweisung??????

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
17 Beiträge • Seite 1 von 2 (current) Nächste
17 Beiträge Seite 1 von 2 (current) Nächste

interne tabelle dynamisch in der select anweisung??????

Beitrag von Veritas (ForumUser / 5 / 0 / 0 ) »
Hallo,
ich möchte über ein select eine interne tabelle füllen.
ich habe mehrere interne tabellen.
abhängig von der variable x soll eine bestimmte interne tabelle aus einer bestimmten tabelle gefüllt werden.
ich weiss, daß ich in der select-anweisung den tabellennamen dynamisch mitgeben kann, indem ich klammern benutze.
Mein Problem ist, ich kann die interne tabelle nicht dynamisch mitgeben.
Kann mir jemand mit einem beispiel weiterhelfen???


so ungefähr sieht mein Code aus:

variablen:
x (radiobuttons),
tabname,
itabname.

tabellen:
tab1,
tab2,
tab3.

interne tabellen:
i_tab1,
i_tab2,
i_tab3.

if x='1'
tabname = 'tab1'.
itabname = 'i_tab1'
elsif x='2'
tabname = 'tab2'.
itabname = 'i_tab2'
elsif x='3'
tabname = 'tab3'.
itabname = 'i_tab3'
endif

select * from (tabname) into itabname.

hier wird itabname nicht als interne tabelle anerkannt.
klammern bringen auch nichts.

Würde mich über jeden Vorschlag mit einem Beispiel freuen.
Ciao
Veritas

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


Beitrag von Gast ( / / 0 / 3 ) »

Code: Alles auswählen.

if x='1' 
   tabname = 'tab1'. 
   select * from tab1 into i_tab1. 
elseif x='2' 
   tabname = 'tab2'. 
   select * from tab2 into i_tab2. 
elseif x='3' 
   tabname = 'tab3'. 
   select * from tab3 into i_tab3. 
endif 
Ich kann es Dir aber auch komplizierter posten, wenn Du möchtest.

Beitrag von Gast ( / / 0 / 3 ) »
sorry, vergessen Zeilen zu löschen:

Code: Alles auswählen.

if x='1' 
   select * from tab1 into i_tab1. 
elseif x='2' 
   select * from tab2 into i_tab2. 
elseif x='3' 
   select * from tab3 into i_tab3. 
endif. 
[/code][/quote]

Re: interne tabelle dynamisch in der select anweisung??????

Beitrag von Frank Dittrich (Expert / 674 / 0 / 15 ) »
Wenn Du Deinen Code so änderst:

Code: Alles auswählen.

FIELD-SYMBOLS <t> TYPE ANY TABLE.

if x='1'.
  tabname = 'tab1'.
  itabname = 'i_tab1[]'.
elsif x='2'.
  tabname = 'tab2'.
  itabname = 'i_tab2[]'.
elsif x='3'.
  tabname = 'tab3'.
  itabname = 'i_tab3[]'.
endif.
ASSIGN (itabname) TO <t>
select * from (tabname) into TABLE <t> ....
wird die entsprechende itab gefüllt.
das [] beim itab-Namen ist nur nötig, um den itab-body für interne tabellen mit Kopfzeilen anzusprechen.
Bei itabs ohne Kopfzeilen kann [] entfallen.
Wenn Du in eine Workarea (oder Kopfzeile einer itab) selektieren willst, geht

Code: Alles auswählen.

FIELD-SYMBOLS: <f> TYPE ANY.
...
wa = 'wa1'.
...
ASSIGN (wa) TO <f>.
...
SELECT * FROM (tabname) INTO <f> ...
Wobei itabs mit Kopfzeilen inzwischen eher vermieden werden sollten.
Und ich persönlich schreibe die Variablennamen ... in Literalen auch lieber groß, selbst wenn das System da an einigen Stellen (wie auch bei ASSIGN) tolerant ist.

Beitrag von Gast ( / / 0 / 3 ) »
Kann es sein, dass hier zensiert wird???

Ein Posting fehlt doch???

Der Assign-Befehl ist nicht uninteressant, aber wie soll nun die Weiterverarbeitung der verschiedenen Tabelle stattfinden.

Angenommen es handelt sich um die MARA, die LFA1 und die MAKT.

Klar geht das auch, aber ist es den Aufwand wert?

Beitrag von Hans-Hermann ( / / 0 / 3 ) »
Anonymous hat geschrieben:Klar geht das auch, aber ist es den Aufwand wert?
Und geht die ganze Dynamik nicht letzlich auch auf die Performance? Wenn genau 3 Möglichkeiten zur Auswahl stehen, würde ich auch die simple Methode von Anonymous wählen.

Beitrag von Gast ( / / 0 / 3 ) »
Danke Hans Herman :D

Scheinst wohl aus der Praxis zu kommen :wink:

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Anonymous hat geschrieben:Der Assign-Befehl ist nicht uninteressant, aber wie soll nun die Weiterverarbeitung der verschiedenen Tabelle stattfinden.
ja, wie soll denn die Weiterverarbeitung aussehen? Wenn du in den einzelnen Tabellen die Felder gezielt ansprechen möchtest, dann geht das natürlich auch dynamisch, aber macht das dann Sinn??

Zumal das Coding dann ja für jede Tabelle anders aussehen muss; unabhängig davon, ob die Felder dynamisch oder fix angesprochen werden.

Der Select in ein Feldsymbol macht m.E. nur dann Sinn, wenn die internen Tabellen gleiche Felder haben, auf die dann fest zugegriffen werden kann. Das ist mit der MARA, MAKT und LFA1 nicht so.

Enno.

Beitrag von Veritas (ForumUser / 5 / 0 / 0 ) »
Also erst einmal vielen Dank für die ganzen Postings.

Zu Vorschlag 1 (von Gast):
Dieser vorschalg bringt mir nicht viel.

Die weitere Verabeitung ist eigentlich der Knackpunkt.

Es wird ein Funktionsbaustein (WS_DOWNLOAD) aufgerufen.
Diesem Funktionsbaustein wird diese Interne Tabelle (ITABNAME) mitgegeben.

(Der FB schreibt den Inhalt der Tabelle in eine Textdatei und legt sie auf der Festplatte ab.)

Wenn ich nun x verschiedene interne Tabellen habe, muss ich auch x verschiedene Funktionsbausteine aufrufen in dem die jeweilige interne Tabelle mitgegeben wird. Das ginge, aber ist doch sehr spartanisch nicht wahr???
Ach ja, jede dieser internen Tabellen hat eine andere Struktur.


Zu Vorschlag 2 (Frank Dittrich)
Muss ich mal ausprobieren. Aber geht erst am Mittwoch :)
Ich melde mich wieder und sage dann bescheid, ob das gefunzt hat.

Nochmal danke,
gruß
Veritas

Beitrag von Frank Dittrich (Expert / 674 / 0 / 15 ) »
Veritas hat geschrieben:Zu Vorschlag 2 (Frank Dittrich)
Muss ich mal ausprobieren. Aber geht erst am Mittwoch :)
Ich melde mich wieder und sage dann bescheid, ob das gefunzt hat.
Funktionieren wird es schon, nur jetzt, wo klar ist, was Du mit den itabs vorhast, würde ich wirklich von ASSIGN abraten, es geht auch einfacher.

Code: Alles auswählen.

CASE x.
  WHEN '1'.
    PERFORM download TABLES itab1 USING 'tab1'.
  WHEN '2'.
    PERFORM download TABLES itab2 USING 'tab2'.
  WHEN '3'.
    PERFORM download TABLES itab3 USING 'tab3'.
ENDCASE.
....
FORM download TABLES itab USING tabname.
  SELECT * from (tabname) INTO TABLE itab.
  ...
* Aufruf WS_DOWNLOAD mit Übergabe von itab.
ENDFORM.
Wenn es egal ist, ob die itab am Zeilenende überflüssige Leerzeichen enthält, kann man sich auch die Definition verschiedener itabs sparen und nur eine itab mit genügend großer Zeilenlänge definieren.
Dann könnte man den TABLES-Parameter aus der FORM-Schnittstelle löschen und itab lokal in der FORM definieren.

Beitrag von Veritas (ForumUser / 5 / 0 / 0 ) »
ja das sieht wirklich ganz hilfreich aus. mit assign hatte ich schon einige sachen ausprobiert, hat aber nicht geklappt.
ich weiss am mittwoch mehr :)
gruß
Zafer
Nochmal danke.

Beitrag von Gast ( / / 0 / 3 ) »
Super, hat geklappt.
Hier mein kompletter Quellcode mit Kommentar für Hasen wie mich :roll:


REPORT DOWNLOADTEST.


*********************** Tabellendeklarationen ***********************
TABLES: USOBT,
USOBT_C,
TSTC.
***************** ENDE Tabellendeklarationen ENDE *******************


************************** Datendeklarationen **********************
* Variable für Tabellenname zur internen Weiterverarbeitung
DATA: TTABNAME(10) TYPE C.

* Interne Tabellen
DATA: BEGIN OF I_USOBT OCCURS 20.
INCLUDE STRUCTURE USOBT.
DATA: END OF I_USOBT.

DATA: BEGIN OF I_USOBT_C OCCURS 20.
INCLUDE STRUCTURE USOBT_C.
DATA: END OF I_USOBT_C.

DATA: BEGIN OF I_TSTC OCCURS 20.
INCLUDE STRUCTURE TSTC.
DATA: END OF I_TSTC.
**************** ENDE Datendeklarationen ENDE *****************

*********************** Eingabeparameter ***********************
PARAMETERS: RUSOBT RADIOBUTTON GROUP RAD1 DEFAULT 'X',
RUSOBT_C RADIOBUTTON GROUP RAD1,
RTSTC RADIOBUTTON GROUP RAD1.
******************* ENDE Eingabeparameter ENDE ******************

************************ HAUPTPROGRAMM *************************
START-OF-SELECTION.

* Überprüfung welche Tabelle (Radiobuttton) ausgewählt wurde
* Das Unterprogramm 'DOWNLOAD' wird aufgerufen und
* entsprechende parameter mitgegeben

IF RUSOBT = 'X'.
TTABNAME = 'USOBT'.
PERFORM DOWNLOAD TABLES I_USOBT USING TTABNAME.

ELSEIF RUSOBT_C = 'X'.
TTABNAME = 'USOBT_C'.
PERFORM DOWNLOAD TABLES I_USOBT_C USING TTABNAME.

ELSEIF RTSTC = 'X'.
TTABNAME = 'TSTC'.
PERFORM DOWNLOAD TABLES I_TSTC USING TTABNAME.

ENDIF.


*&---------------------------------------------------------------------
*& Form DOWNLOAD
*&---------------------------------------------------------------------

FORM DOWNLOAD TABLES ITAB USING TTABNAME.

* Datenbankabfrage
* Tabelle wird in ITAB geschrieben
SELECT * FROM (TTABNAME) INTO TABLE ITAB.

*-------------------------------------------
* Funktionsbaustein zum Download der Datei
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
FILETYPE = 'ASC'
FILENAME = 'C:\testfilesap.txt'
TABLES
DATA_TAB = ITAB
*-------------------------------------------


* Listausgabe auf Bildschirm
LOOP AT ITAB.
WRITE ITAB.
ENDLOOP.

ENDFORM.

Beitrag von Daniel (Specialist / 314 / 68 / 44 ) »
Für 3 Tabellen ist das so OK,
für eine vorher unbestimmte Anzahl/Namen
ist der Assign richtig.
Download geht auch mit Feldsymbol.

Gruss
Daniel

Beitrag von Gast ( / / 0 / 3 ) »
Es geht auch ohne assign:

GENERATE SUBROUTINE POOL TAB NAME PROG
MESSAGE MSG
LINE LINE.

Damit lade ich ca. 15 Tabelle runter.

Beitrag von Veritas (ForumUser / 5 / 0 / 0 ) »
@Daniel:
Ich mache das mit 6 Tabellen :)
Kannst Du mir mal ein beispiel für den obigen fall geben?
Mit dem assign habe ich mir fast den kopf zerbrochen.

@Gast: gilt das gleiche

Danke im voraus...

Vergleichbare Themen

5
Antw.
35817
Views
Select-Anweisung auf eine interne Tabelle ???
von bohne » 21.01.2007 23:46 • Verfasst in ABAP® für Anfänger
3
Antw.
2622
Views
Interne Tabelle dynamisch im Select verwenden
von Dude » 14.11.2006 11:26 • Verfasst in ABAP® Core
8
Antw.
5176
Views
Interne Tabelle dynamisch generieren
von inab » 22.10.2008 10:19 • Verfasst in ABAP Objects®
12
Antw.
7689
Views
dynamisch interne Tabelle füllen
von LittleT » 03.04.2007 15:27 • Verfasst in ABAP® für Anfänger
8
Antw.
1036
Views
Interne Tabelle dynamisch erzeugen
von Der Formulator » 21.10.2021 09:30 • Verfasst in ABAP® Core

Aktuelle Forenbeiträge

SELECT CHAR16 in CHAR12-Feld
vor 27 Minuten von Patrick1982 gelöst 5 / 54
alv_grid aktualisieren
vor 5 Stunden von Egzon gelöst 4 / 81

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

SELECT CHAR16 in CHAR12-Feld
vor 27 Minuten von Patrick1982 gelöst 5 / 54
alv_grid aktualisieren
vor 5 Stunden von Egzon gelöst 4 / 81

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 4 Wochen von Lucyalison 1 / 134
Group Items auf einer Filterbar
vor 5 Wochen von Bright4.5 1 / 170