Interne Tabelle in einer anderen interne Tabelle übertragen(spliten)

Getting started ... Alles für einen gelungenen Start.
5 Beiträge • Seite 1 von 1
5 Beiträge Seite 1 von 1

Interne Tabelle in einer anderen interne Tabelle übertragen(spliten)

Beitrag von HH_ABAP (Specialist / 262 / 144 / 1 ) »
Hallo,

ich habe eine Textdatei in einer interne Tabelle (lt_ergebnis) eingelesen.
Die Felder der Textdatei sind:
Customer;Material;PurchaseOrder;Wunschlieferdatum;Menge;Werk
3251;PO1234;;IAD-3000;2;3600

Wie kann ich die in einer anderen interne Tabelle (lt_split) in richtige Felder einfügen?

Siehe bitte die Screenshots.

types: BEGIN OF t_ergebnis,
line type string,
END OF t_ergebnis.

DATA: lt_ergebnis type TABLE OF t_ergebnis,
ls_ergebnis LIKE LINE OF lt_ergebnis.

types: BEGIN OF t_split,
customer(10) TYPE c,
material(10) TYPE c,
purchaseorder(10) type c,
wunschlieferdatum(10) type c,
menge(5) type c,
werk(5) type c,
END OF t_split.

DATA: lt_split type TABLE OF t_split,
ls_split LIKE LINE OF lt_split.

Danke im Voraus!
Vg

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


Re: Interne Tabelle in einer anderen interne Tabelle übertragen(spliten)

Beitrag von DeathAndPain (Top Expert / 1961 / 261 / 415 ) »
Na, das Stichwort hast Du doch schon genannt: "Split". 😁 Es existiert ein gleichnamiger Befehl, und der ist hier genau die richtige Wahl.

Code: Alles auswählen.

types: BEGIN OF t_ergebnis,
line type string,
END OF t_ergebnis.

DATA: lt_ergebnis type TABLE OF t_ergebnis,
ls_ergebnis LIKE LINE OF lt_ergebnis.

types: BEGIN OF t_split,
customer(10) TYPE c,
material(10) TYPE c,
purchaseorder(10) type c,
wunschlieferdatum(10) type c,
menge(5) type c,
werk(5) type c,
END OF t_split.

DATA: lt_split type TABLE OF t_split,
ls_split LIKE LINE OF lt_split.

* Hier Deine Tabelle lt_ergebnis befüllen und dann:

LOOP AT lt_ergebnis ASSIGNING FIELD-SYMBOL(<ergebniszeile>).
  APPEND INITIAL LINE TO lt_split ASSIGNING FIELD-SYMBOL(<neue_zeile>).
  SPLIT <ergebniszeile> AT ';' INTO TABLE DATA(lt_hilfstabelle_spalten).
  
  LOOP AT lt_hilfstabelle_spalten ASSIGNING FIELD-SYMBOL(<spaltenwert>).
    ASSIGN COMPONENT sy-tabix OF STRUCTURE <neue_zeile> to FIELD-SYMBOL(<spalte_der_zieltabelle>).
    <spalte_der_zieltabelle> = <spaltenwert>.
  ENDLOOP.
ENDLOOP.
Ich hoffe, Du hast keine Angst vor Feldsymbolen, denn das ist moderne und performante Programmierung. 😊 Wenn doch, würde ich Dir raten, daran zu arbeiten. Wenn man sich daran gewöhnt hat, programmiert es sich damit viel flüssiger, und Felder wie Dein ls_ergebnis brauchst Du dann nicht mehr (hast also weniger Ballast im DATA-Block). Ein wenig schneller (performanter) ist es obendrein.

Kurz zur Erklärung, was in obenstehendem Codeblock passiert: Für jede Zeile in lt_ergebnis willst Du eine Zeile in t_split haben. Also LOOPe ich durch lt_ergebnis und lege zunächst eine leere Zeile in t_split an, für die ich mir aber gleich ein Feldsymbol geben lasse, so dass ich sie im Anschluss befüllen kann. (Damit spare ich mir ein Workarea-Feld (Stichwort Ballast), da ich die Zielzeile gewissermaßen selbst als Workarea verwende oder, genauer gesagt, die Werte direkt dorthin (in die Zieltabelle lt_split) verfrachte, anstatt mit ihnen erst eine Workarea-Struktur aufzubauen, die ich anschließend der Tabelle hinzufüge.)

Dann teile ich die gelesene Zeile von lt_ergebnis an den Semikola in eine Hilftabelle lt_hilfstabelle_spalten auf, so dass jede Zeile von lt_hilfstabelle_spalten einen Spaltenwert enthält. Dann LOOPe ich über diese Hilfstabelle. Zu jeder Zeile beschaffe ich mir ein Feldsymbol auf die entsprechende Spalte der angelegten Leerzeile und fülle den Wert rein.

Im Prinzip kann man sagen, dass der SPLIT-Befehl die Spalte transponiert, wie man das von Excel oder anderen Tabellenkalkulationen kennt, also aus den Spalten Zeilen macht. In meinem inneren LOOP transponiere ich sie dann wieder zurück, mache also aus den Zeilen der Hilfstabelle wieder Spalten von lt_split.

Das setzt natürlich voraus, dass die Spalten in lt_ergebnis in genau der Reihenfolge stehen wie in lt_split. In Deinem Beispiel habe ich das unterstellt.

Gerade kürzlich habe ich eine Variante programmiert, bei der das nicht (notwendigerweise) so ist, sondern bei der meine csv-Datei eine Überschriftenzeile enthält. Die werte ich aus und suche mir dazu die passende Spalte in meiner Zieltabelle. Das kriegt man auch mit dem ASSIGN COMPONENT-Befehl hin, dann freilich nicht wie in obigen Codeschnipsel mit Komponentennummer, sondern mit Komponentenwert (der Befehl kann beides, siehe seine Online-Hilfe).

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


Re: Interne Tabelle in einer anderen interne Tabelle übertragen(spliten)

Beitrag von HH_ABAP (Specialist / 262 / 144 / 1 ) »
Hi,

vielen Dank für die ausführliche Erklärung.

Ich bekomme 3 Fehler. Wie soll ich die 3 Field-Symbol/Tabelle (<ergebniszeile>, lt_hilfstabelle_spalten, <spaltenwert>) definieren? Bitte siehe den Screenshot.

Re: Interne Tabelle in einer anderen interne Tabelle übertragen(spliten)

Beitrag von DeathAndPain (Top Expert / 1961 / 261 / 415 ) »
Das hatte ich übersehen; das hängt damit zusammen, dass Du Deine lt_ergebnis als einspaltige Struktur definiert hast statt einfach als Tabelle von Strings, was sie tatsächlich ja ist. Lösch einfach den Typ t_ergebnis raus; den brauchst Du nicht. Und lt_ergebnis definierst Du dann (schön durchdacht und ausführlich) als:

Code: Alles auswählen.

DATA lt_ergebnis TYPE STANDARD TABLE OF STRING WITH EMPTY KEY.
Dann ist jede Zeile der Tabelle einfach ein Stringfeld und keine Struktur mit einer einzelnen Komponente, und dann wird auch der SPLIT-Befehl nicht mehr meckern, wenn er solch Zeile zerlegen soll.

Die anderen Fehler sind nur Folgefehler. Da der SPLIT-Befehl fehlerhaft war, hat die Inline-Deklaration von lt_hilfstabelle_spalten nicht funktioniert. Also war die nicht bekannt, wodurch er dann im weiteren Verlauf über den Befehl gemeckert hat, wo sie benutzt und zugleich das Feldsymbol <spaltenwert> inline deklariert wurde usw.

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


Re: Interne Tabelle in einer anderen interne Tabelle übertragen(spliten)

Beitrag von DeathAndPain (Top Expert / 1961 / 261 / 415 ) »
Oder, wenn Du ums Verrecken Deine Definition von lt_ergebnis behalten möchtest, könntest Du auch einfach den SPLIT-Befehl ändern:

Code: Alles auswählen.

SPLIT <ergebniszeile>-line AT ';' INTO TABLE DATA(lt_hilfstabelle_spalten).
Damit greifst Du auf die Komponente line zu, und der SPLIT-Befehl bekommt den Stringtyp, den er haben möchte. Aber ganz ehrlich: den Sinn einer einspaltigen Struktur sehe ich nicht. Das ist ja nur scheinbar eine Struktur, und die Strukturdefinition bläht nur den Code auf.

Freilich gibt es auch Fubas etc. von der SAP, die einspaltige Strukturen als Parameter erwarten.

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


Seite 1 von 1

Vergleichbare Themen

5
Antw.
2252
Views
Inhalt interne Tabelle an andere interne Tabelle übergeben
von L0w-RiDer » 30.01.2020 16:28 • Verfasst in ABAP® für Anfänger
5
Antw.
1075
Views
1
Antw.
699
Views
10
Antw.
7670
Views
alv grid interne tabelle mit transparenter tabelle abgleiche
von hadde85 » 30.04.2008 12:18 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag



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

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.