Spalten Interner Tabellen nacheinander auslesen.

Getting started ... Alles für einen gelungenen Start.
18 Beiträge • Seite 1 von 2 (current) Nächste
18 Beiträge Seite 1 von 2 (current) Nächste

Spalten Interner Tabellen nacheinander auslesen.

Beitrag von JulDen (ForumUser / 2 / 0 / 0 ) »
Hey Ihr!
Ich habe eine Frage und zwar möchte ich eine Interne Tabelle auslesen. Hierbei jedoch spalte für spalte vorgehen.
Habe die Tabelle bis jetzt mit einem Loop und ASSINGNING FIELD-SYMBOL ausgelesen. Ungefähr so:

it_test:
Spalte1 Spalte2 Spalte3 Spalte4
12 15 16 18
13 29 13 13

LOOP AT it_test ASSIGNING FIELD-SYMBOL(<fs_line>).
var = <fs_line>-[Name der Spalte]
ENDLOOP.

Nun will ich die selbe Loop schleife mehrmals ausführen und dabei die Spalte hochzählen lassen. Also beim zweiten durchlauf die Werte der nächsten spalte auslesen und so weiter.
Die größe der Tabelle ist hierbei dynamisch. Wie kann ich das tun? Habe in verschiedenen Foren noch keine Erklärung dafür gefunden.

Schonmal Vielen Dank für die Hilfe!

LG JulDen

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


Re: Spalten Interner Tabellen nacheinander auslesen.

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »

Code: Alles auswählen.

LOOP AT it_test ASSIGNING FIELD-SYMBOL(<fs_line>).
do.

" Greife dir Feld 1, Feld 2, etc.
assign component sy-index 
of structure <fs_line> 
to <field>. "type any

" letztes Feld erreicht: Nächste Zeile
if sy-subrc ne 0.
exit.
endif.

*** Hier kannst du mit dem Feldinhalt machen was du willst:
var = <field>. "auf Typisierung achten, die Zuweisung geht nicht immer
enddo.
ENDLOOP.
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Spalten Interner Tabellen nacheinander auslesen.

Beitrag von JulDen (ForumUser / 2 / 0 / 0 ) »
Vielen Dank schonmal für die Hilfe!

In deinem Beispiel kann ich nun Zeile für Zeile alle Spalten durchgehen.
Mein Ziel war es allerdings erst alle Werte der Spalte1 dann der Spalte2 und so weiter auszugeben.
Wenn möglich auch mitten drin einsteigen.

Ich kann nur aus Java berichten und stelle mit es so vor als würde ich zum Beispiel mit Index [0][3] anfangen.
([0] = Zeile, [3] = Spalte)
Dann durch den ersten Index durchloopen [1][3], [2][3], [3][3], [4][3]
und im zweiten durchlauf den zweiten Index erhöhen [0][4], [1][4], [2][4], ...

Ist das Überhaupt möglich?

Sorry für die blöde Fragestellung :(.

Re: Spalten Interner Tabellen nacheinander auslesen.

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Du solltest dich fragen, ob du das wirklich willst, weil das die wahrscheinlich unperformanteste Möglichkeit ist, die Daten einer internen Tabelle auszulesen.

Code: Alles auswählen.

do. " setzt sy-index als Zähler
LOOP AT it_test ASSIGNING FIELD-SYMBOL(<fs_line>).

" Greife dir Feld 1 im 1. LOOP, Feld 2 im 2. LOOP, etc.
assign component sy-index 
of structure <fs_line> 
to <field>. "type any

" letztes Feld erreicht: Komplett raus
if sy-subrc ne 0.
end_of_do = abap_true.
endif.

*** Hier kannst du mit dem Feldinhalt machen was du willst:
var = <field>. "auf Typisierung achten, die Zuweisung geht nicht immer

exit." Wir laufen nur 1x durch den LOOP, springen dann raus und laufen dann wieder nur 1x durch den LOOP
ENDLOOP.

if end_of_do eq ABAP_true.
exit.  
endif.
enddo.
Nicht getestet, sollte aber gehen. Elegant ist aber anders ;) Wenn du ein 7.40-System oder höher hast, kriegt man das auf jeden Fall kürzer und chicer hin.

Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Spalten Interner Tabellen nacheinander auslesen.

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Er hat (minimal) ein 7.40-System. Das hättest Du eigentlich erkennen müssen :-P, schließlich hat er geschrieben:

Code: Alles auswählen.

LOOP AT it_test ASSIGNING FIELD-SYMBOL(<fs_line>).
Das ist eine Inline-Deklaration eines Feldsymbols, die meines Wissens vor 7.40 nicht geht.

Im übrigen funktioniert Dein Code nicht, da Du den LOOP direkt per EXIT verlässt und damit nur die erste Tabellenzeile spaltenweise einliest. Auch der DO gefält mir nicht; IMHO schreit das nach einem WHILE. Sonst brauchst Du diesen klobigen IF für die EXIT-Bedingung und verlässt Dich im übrigen darauf, dass sein Code innerhalb des LOOPs Dir Deinen SY-INDEX nicht versaut.

Ich würde Deinen Code so abwandeln:

Code: Alles auswählen.

DATA: END_OF_DO TYPE BOOLEAN_FLG,
      COMPONENT_COUNTER TYPE I.

WHILE END_OF_DO = ABAP_FALSE. 
  ADD 1 TO COMPONENT_COUNTER.

  LOOP AT IT_TEST ASSIGNING FIELD-SYMBOL(<FS_LINE>).

    " Greife dir Feld 1 im 1. LOOP, Feld 2 im 2. LOOP, etc.
    ASSIGN COMPONENT COMPONENT_COUNTER OF STRUCTURE <FS_LINE> TO <FIELD>. "type any
    " letztes Feld erreicht: Komplett raus
    END_OF_DO = SWITCH #( SY-SUBRC WHEN 0 THEN ABAP_FALSE
                                          ELSE ABAP_TRUE ).

*    ** Hier kannst du mit dem Feldinhalt machen was du willst:
    VAR = <FIELD>. "auf Typisierung achten, die Zuweisung geht nicht immer

  ENDLOOP.

ENDWHILE.
Das geht auch garantiert noch schöner. Die Prüfung von END_OF_DO gehört eigentlich außerhalb die LOOP-Schleife, weil er das pro WHILE-Durchlauf nur einmal machen muss. Gibt garantiert eine Funktion (wahrscheinlich irgendwo in dieser komischen ABAP_TYPEDESCR-Klasse), mit der man die Anzahl der Komponenten der Struktur ermitteln kann. Bin aber zu faul, das jetzt genau nachzusehen. Diese Methode sollte man einmal aufrufen, die Zahl der Komponenten ermitteln und dann in der äußeren Schleife damit vergleichen. Wahrscheinlich ist dann sogar wieder ein DO am besten, allerdings in der Form DO number_of_components TIMES. Dann brauchst Du den hässlichen IF für die Exit-Bedingung nicht und musst auch nicht (wie ich oben) in einer WHILE-Schleife händisch einen Counter hochzählen.

Re: Spalten Interner Tabellen nacheinander auslesen.

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Du hast Recht mit dem EXIT im LOOP, der muss raus. Zur Schleife: Ich nehme immer DO - das hat sowas Befehlsgewohntes. WHILE klingt mir zu submissiv :D


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Spalten Interner Tabellen nacheinander auslesen.

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
Alternativ auch eine Variante mittels RTTI und dann Assign mit Feldnamen:

Code: Alles auswählen.

  LOOP AT CAST cl_abap_structdescr( CAST cl_abap_tabledescr( cl_abap_tabledescr=>describe_by_data( it_test ) )->get_table_line_type( ) )->get_components( ) ASSIGNING FIELD-SYMBOL(<ls_component>).
    LOOP AT it_test ASSIGNING FIELD-SYMBOL(<fs_line>).

      ASSIGN COMPONENT <ls_component>-name OF STRUCTURE <fs_line> TO FIELD-SYMBOL(<lv_field>).
      
*    ** Hier kannst du mit dem Feldinhalt machen was du willst:
      WRITE:/ sy-tabix, <ls_component>-name.
      WRITE <lv_field>.

    ENDLOOP.
    ULINE.
  ENDLOOP.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Spalten Interner Tabellen nacheinander auslesen.

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
So geil ich die Variante finde (sie ist allerdings kommentierungswürdig), würdest du sie dem OP wirklich empfehlen? ;)


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Spalten Interner Tabellen nacheinander auslesen.

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
Mal nachrechnen.
- Da es sich um ein Übungsprogramm handelt - Punkt dafür
- Die relative Unkenntnis des OP - Punkt dagegen
- Die Verwendung "neuer" Sprachelemente zur Übung - Punkt dafür
- Die Lesbarkeit ( vor allem durch die Verwendung des CAST-Operators ) - Punkt dagegen
- Die Notwendigkeit das /eigentlich/ kommentieren zu müssen - Punkt dagegen
_______
-1 PUnkt

Antwort: Nein

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
Daniel

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Spalten Interner Tabellen nacheinander auslesen.

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Aber trotzdem vielen Dank für das gute Argument gegen ABAP OO. :P :) :P :)

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
Daniel


Re: Spalten Interner Tabellen nacheinander auslesen.

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Hä? Was hat ein cast mit OO zu tun?


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Spalten Interner Tabellen nacheinander auslesen.

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Ich rede nicht von einem CAST, sondern von einer kryptischen Schachtelung geCASTeter Methodenaufrufe, bei der man nur schwer verstehen kann, was da passiert und die (außerhalb einer Übungsaufgabe) eine Zumutung für jeden ist, der das Lesen und Verstehen soll. Implizit hast Du das ja sogar selber eingeräumt, als Du die Frage aufgeworfen hast, ob das so wirklich zu empfehlen sei.

Wenn Du meinen Code dagegenhältst, dann behaupte ich, dass man da auf einen Blick sieht, was abgeht (wobei die Fassung mit dem Vorab-Bestimmen der Anzahl der Komponenten, wie gesagt, noch besser gewesen wäre).

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
Daniel


Re: Spalten Interner Tabellen nacheinander auslesen.

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Trotzdem ist das kein Argument gg OO. Man kann die Methodenaufrufe auch entflechten, das ist lediglich eine Frage der Schreibweise. Da hat jeder seine Vorlieben: Mir ist sowas lieber als lauter Datenobjekte, die man nur einmalig / „on the fly“ braucht (weshalb ich Inline-Deklarationen für solche Fälle bevorzuge, um mal ein OO-freies Beispiel zu bringen). Aber eben in diesem Falle mit einer Kommentarzeile dazu, die das Überlegen erspart.

Empfehlenswert für den Anfänger ist es deshalb nicht, weil der sich um das eigentliche Problem kümmern soll statt sich mit den Deskriptoren der SAP zu beschäftigen. Als Elektriker-Lehrling habe ich auch mit einfachen Schaltungen angefangen, um konkret zu Lernen, wie ein Selbsthaltemechanismus bei einem Schütz funktioniert — ohne dass ich (später vermitteltes) „Beiwissen“ brauchte, das vom eigentlich zu lernenden Thema ablenkt. Die Nicht-Empfehlung für einen Anfänger ist also kein Argument gegen OO, sondern der Didaktik geschuldet. Als weiterführender Hinweis ist das aber eine sehr gute Variante, das möchte ich ausdrücklich dazusagen.

Raus kommt, was immer rauskommt: Abstraktes Coding ist vielseitiger, aber eben auch abstrakter. Gerade gestern habe ich eine verallgemeinerte Werthilfe programmiert, von denen wir ähnliche für andere Felder auf anderen Dynpros häufiger brauchen. Das rufen die anderen dann einfach parametrisiert auf und sparen einen Haufen Arbeit. Verstehen müssen die Aufrufer das nicht zwingend, die müssen nur wissen, was sie reinwerfen müssen und was rauskommt. Ich möchte wetten, das machst du mit den meisten SAP-Funktionsbausteinen auch so. Du weißt grob (in einem Satz zusammengefasst) was sie tun und was sie dafür brauchen.

Der Vorteil abstrakten Codings ist oft der, dass die Lösungen an mehreren Stellen (per Aufruf, nicht per Kopie!) einsetzbar, aber zentral wartbar sind. Und nochmal: Mit der Schreibweise an sich hat das aber trotzdem nichts zu tun ;)

Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Spalten Interner Tabellen nacheinander auslesen.

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Verstehen müssen die Aufrufer das nicht zwingend, die müssen nur wissen, was sie reinwerfen müssen und was rauskommt. Ich möchte wetten, das machst du mit den meisten SAP-Funktionsbausteinen auch so. Du weißt grob (in einem Satz zusammengefasst) was sie tun und was sie dafür brauchen.
Ja, beim FB habe ich ein zentrales, übersichtliches Interface. Im günstigsten Fall hat der FB dann auch noch eine vernünftige Online-Doku (die sogar Einzeldokus für die einzelnen Parameter enthalten kann; das geht bei Methoden meines Wissens noch nicht mal mehr, und ABAP Doc in einer zusätzlichen Zeile über dem zu kommentierenden Code statt dahinter ist ja wohl eine Frechheit, damit zerbröselt man sich ja den ganzen Quellcode). Wenn ich einen FB aufrufe, ist das kein mehrfach in sich geschachteltes Pamphlet, bei dem kein Mensch ohne Einarbeitung versteht, was da passiert.

Den möglichen Vorteil von Abstraktion bei großen Projekten sehe ich aber durchaus. Nicht ohne Grund habe ich die Smileys an meine Anmerkung gesetzt. ;-)

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
Daniel


Re: Spalten Interner Tabellen nacheinander auslesen.

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Das Interface einer Methode unterscheidet sich kaum von dem eines Funktionsbausteines. Und natürlich kannst du jedes Attribut und jede Methode mit einer SAPscript-Doku versehen. Nicht alles, was du nicht kennst, existiert nicht. Und die kompakte Schreibweise ist einer der größten Vorteile einer Methode ggü. einem Fb, dessen Aufruf das Coding zerschneidet. Man setzt den Aufruf einer Methode an die Stelle, an der man eine Variable mit dem Ergebnis der Methode setzen würde. In der Mathematik wird Substitution genau andersrum verwendet, darum finde ich das so eingängig.


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Vergleichbare Themen

5
Antw.
1350
Views
SPALTEN INTERNER TABELLEN NACHEINANDER AUSLESEN mit einer lOOP.
von Geny » 15.06.2020 15:47 • Verfasst in ABAP® für Anfänger
1
Antw.
7887
Views
dynamische Spalten von interner Tabelle auslesen?
von Jinn » 14.05.2004 17:54 • Verfasst in ABAP® Core
1
Antw.
1640
Views
Tabellen-Spalten auslesen/anzeigen lassen
von Lamerman » 06.04.2006 14:10 • Verfasst in Web-Dynpro, BSP + BHTML
5
Antw.
907
Views
Teilergebnis für mehrere Spalten in interner Tabelle
von GL1234 » 29.12.2020 15:39 • Verfasst in ABAP® für Anfänger
2
Antw.
1955
Views
Wert aus interner Tabelle auslesen
von dominoblau » 26.02.2021 15:27 • Verfasst in ABAP® für Anfänger

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.

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 71
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 111
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 141