Felder einer internen Tabelle hinzufügen + Join

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

Felder einer internen Tabelle hinzufügen + Join

Beitrag von LukasHD (ForumUser / 8 / 3 / 0 ) »
Hallo,

Im Zusammenhang mit einer Übungsufgabe, die ich zur Zeit bearbeite, habe ich folgendes Problem.

Ich habe eine Tabelle deklariert in die ich über einen Array-fetch alle relevanten Datensätze lese. Nun muss ich das ganze erweitern und dafür über einen JOIN noch zwei weitere Felder aus jeweils einer anderen Tabelle in meine interne Tabelle einfügen.

Meine interne Tabelle ohne die beiden neuen Felder:

Code: Alles auswählen.

DATA: lt_fetchTabelle TYPE TABLE OF /scwm/lagp,        " Deklaration einer IT mit Struktur von Lagerplatztabelle     
      ls_fetchTabelle LIKE LINE OF lt_fetchTabelle.    " Deklaration einer WorkArea vom Typ einer Zeile der IT
Wie kann ich jetzt in die oben deklarierte interne Tabelle die zwei neuen Felder (jewiels eins aus einer anderen Tabelle) einfügen?
(Oder diese Tabelle einer neuen internen temporäre zusweisen und diese dann um die zwei neuen Felder erweiter)

Meine zweites Problem ist folgendes. Ich hatte zuvor den oben beschriebenen Fetch ausgeführt und danach über die interne Tabelle geloopt und dort über SELECT SINGLE die zwei Felder in meine zuvor im DDIC definierte Struktur/Tabelle geschrieben, die eben alle relevanten Felder aus der ersten Tabelle besitzt plus die zwei weiteren.

Code: Alles auswählen.

SELECT * FROM /scwm/lagp INTO TABLE lt_fetchTabelle
      WHERE LGNUM = iv_lgnum
        AND LGTYP IN it_lgtyp
        AND LGBER IN it_lgber.
Dieser Anweisungsblock liefert mir 14 Einträge.

Nachdem ich das ganze aber in den JOIN-Anweisungsblock geschrieben habe, der wie folgt aussieht (die zwei neuen Felder sind hier zunächst noch auskommentiert, da ich ja noch nicht die entsprechende Struktur dafür habe [Problem 1])...

Code: Alles auswählen.

SELECT a~LGNUM a~LGPLA a~LGTYP a~LGBER a~SKZUA "b~LTYPT "c~LBERT
  INTO CORRESPONDING FIELDS OF TABLE lt_fetchTabelle
  FROM ( ( /scwm/lagp AS a INNER JOIN /scwm/t301t AS b ON b~LGNUM = a~LGNUM
                                                      AND b~LGTYP = a~LGTYP )
                           INNER JOIN /scwm/t302t AS c ON c~LGNUM = a~LGNUM
                                                      AND c~LGBER = a~LGBER )
                         WHERE a~LGNUM = iv_lgnum
                           AND b~LGNUM = iv_lgnum
                           AND c~LGNUM = iv_lgnum
                           AND a~LGTYP IN IT_LGTYP
                           AND b~LGTYP in IT_LGTYP
                           AND a~LGBER IN IT_LGBER
                           AND c~LGBER IN IT_LGBER
                          .
... dann bekomme ich eine Liste mit über 800 Einträgen. Habe mir das im debugger angeschaut, und die über 800 Einträge sind genau die gleichen, wie die aus meiner vorigen Select-Anweisung (14 Einträge), nur dass sie sich ganz häufig wiederholen (aber auch nicht alle gleichmäßig, also manche Einträge wiederholen sich oft, und manche "sehr" oft).

Kann mir jemand sagen, woran das liegen könnte? Ich selber habe bisher Java gelernt und da konnte ich solche Probleme immer im Debugger Schritt für Schritt durch gehen. Hier allerdings wird Anweisung einmal ausgeführt und die Liste ist gefühlt. Ich weiß nicht wie ich da vor gehen soll bzw. habe schon einiges ausprobiert in dem JOIN und bin zu keiner Lösung gekommen

Danke schon mal,

und viele Grüße,

Lukas

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


Re: Felder einer internen Tabelle hinzufügen + Join

Beitrag von Tobias85 (ForumUser / 34 / 3 / 1 ) »
Hallo Lukas,
wie viele Einträge sind denn in deinen Tabellen, die du mit Inner-Join einbindest?
Weil da deine 14 Einträge mit diesen jeweils verknüpft werden und teilweise (1-N-Beziehung?) mehrfach ausgegeben werden,
du erkennst da keinen Unterschied, weil du die Zellen der anderen Tabellen ja nicht anzeigst.

Re: Felder einer internen Tabelle hinzufügen + Join

Beitrag von Unit605 (Expert / 975 / 37 / 93 ) »
Erstelle fuer Deine interne Tabelle einen eigenen TYPE der die bisherigen Felder plus Deine weiteren benoetigten Felder enthaelt.

Wenn Du es mit einem JOIN nicht hinbekommst, versuche andere Wege.


Dein Join selektiert alle Lagerplaetze zu den Lagerbereichen und dann noch einmal zu den Lagertype. Da es Lagerplaetze gibt, die sowohl in den Lagerbereichen sind und in den Lagertypen, ist das Ergebnis Doppelgemoppelt.

Da wir nicht das Ziel Deiner Uebungsaufgabe kennen....... ?????

Folgende Benutzer bedankten sich beim Autor Unit605 für den Beitrag:
LukasHD


Re: Felder einer internen Tabelle hinzufügen + Join

Beitrag von LukasHD (ForumUser / 8 / 3 / 0 ) »
Hi,

zunächst danke für deine Antwort.

Also wenn ich mir den Tabelleninhalt anzeigen lasse, dann würde ich sagen um die ca 60 (Weiß gerade nicht wo ich das genau sehen kann).

Mir ist grade ausgefallen, dass ich mich eventuell etwas missverständlich ausgedrückt hatte. Meine Haupttabelle hat nicht nur 14 Einträge, die ist relativ groß, größer als die zwei Nebentabellen. Ich hatte vergessen zu erwähnen, dass ich nach der Eingabe des Selektionsparameters (Lagernummer = 0100) dann im Debugger in meinem Array-Fetch 14 Einträge habe.

Ich habe mittlerweile eine Lösung gefunden. Allerdings glaube ich nicht dass die besonders performant ist. Ich habe nach dem Join folgende Anweisung hinzugefügt:

Code: Alles auswählen.

DELETE ADJACENT DUPLICATES FROM lt_fetchTabelle.
Danach habe ich in meiner Tabelle genau die gewünschten 14 Einträge.

Nur denke ich mir, dass es von der Performance her nicht wirklich sinnvoll ist, über 800 Einträge in die Tabelle zu lesen, um dann alle bis auf 14 wieder zu löschen. Ich habe zwar bisher noch nicht wirklich viele Erfahrungen sammeln können, aber ich denke mir, dass es bei weitaus größeren Tabellen dann sehr langsam wird und viel Arbeitsspeicher erfordert?

Deshalb würde ich mich trotz meiner bisherigen Lösung über einen Hinweis auf ein alternatives, besseres Vorgehen freuen :)

Und die Frage zum ersten Punkt besteht auch immer noch (Neue Felder in interne Tabelle hinzufügen, damit ich eine IT hab, mit einer Struktur, die alle benötigten Felder hat [also die aus dem fetch und die zwei aus den beiden anderen Tabellen], sodass ich bei meiner JOIN-Anweisung alles da rein schreiben kann.

Danke und Viele Grüße,

Lukas

Re: Felder einer internen Tabelle hinzufügen + Join

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
LukasHD hat geschrieben:Deshalb würde ich mich trotz meiner bisherigen Lösung über einen Hinweis auf ein alternatives, besseres Vorgehen freuen :)
Wenn du zuviele Einträge bekommst, dann stimmen die JOIN-Bedingungen nicht. Wenn die /SCWM/ Tabellen Kopien der SAP-Tabellen sind (Namensraum /SCWM/ ist kein Standard-SAP), dann hast du nicht alle Schlüssel versorgt.

/SCWM/T301T sollte das Feld SPARS im Key haben. Dieses wird aber im JOIN nicht abgefragt, ergo ergibt sich eine Treffermenge 14 * Anzahl gepflegter Sprachen in /SCWM/T301T zu den LGNUM/LGTYP.
/SCWM/T302T hat neben der SPRAS auch noch den LGTYP mit im Key, der ebenfalls im JOIN nicht versorgt ist.

Du mußt also alle Key-Felder mit versorgen im JOIN:

Code: Alles auswählen.

 SELECT /scwm/lagp~lgnum /scwm/lagp~lgpla /scwm/lagp~lgtyp /scwm/lagp~lgber /scwm/lagp~skzua
         /scwm/t301t~ltypt
         /scwm/t302t~lbert
  INTO CORRESPONDING FIELDS OF TABLE lt_fetchtabelle
  FROM /scwm/lagp
  JOIN /scwm/t301t
    ON /scwm/t3021~spras = sy-langu           "Anmeldesprache
   AND /scwm/t3021~lgnum = /scwm/lagp~lgnum
   AND /scwm/t3021~lgtyp = /scwm/lagp~lgtyp
  JOIN /scwm/t302t
    ON /scwm/t302t~spras = sy-langu           "Anmeldesprache
   AND /scwm/t302t~lgnum = /scwm/lagp~lgnum
   AND /scwm/t302t~lgtyp = /scwm/lagp~lgtyp
   AND /scwm/t302t~lgber = /scwm/lagp~lgber
  WHERE /scwm/lagp~lgnum = iv_lgnum
    AND /scwm/lagp~lgtyp IN it_lgtyp
    AND /scwm/lagp~lgber IN it_lgber
LukasHD hat geschrieben: Und die Frage zum ersten Punkt besteht auch immer noch (Neue Felder in interne Tabelle hinzufügen, damit ich eine IT hab, mit einer Struktur, die alle benötigten Felder hat [also die aus dem fetch und die zwei aus den beiden anderen Tabellen], sodass ich bei meiner JOIN-Anweisung alles da rein schreiben kann.
wie oben bereits geschrieben wurde ist es am einfachsten, wenn man sich einen eigenen TYPE definiert:

Code: Alles auswählen.

TYPES: BEGIN OF ts_data,
         INCLUDE TYPE /scwm/lagp.
TYPES:   lgber TYPE /scwm/t301t~lgber,              "INCLUDE TYPE macht leider den Kettensatz kaputt, deshalb hier einen neuen anfangen
         ltypt TYPE /scwm/t301t~ltyp,
       END OF ts_data.

Folgende Benutzer bedankten sich beim Autor JHM für den Beitrag:
LukasHD

Gruß Hendrik

Re: Felder einer internen Tabelle hinzufügen + Join

Beitrag von LukasHD (ForumUser / 8 / 3 / 0 ) »
Hi Hendrik,

Vielen Danke für deine Antwort.

Die Anweisung mit dem JOIN hat so einwandfrei funktioniert ( und die Vorgehensweise [Alle Schlüssel referenzieren] ist nun im Langzeitgedächtnis gespeichert ;) )

Zu der Definition des eigenen types. Ich habe es so nun wie beschrieben gemacht, auch Syntax anhand von meinem Buch nachgebessert ( In deinem Code-Beispiel war ein Komma nach dem BEGIN OF, hatte Syntax fehler, muss ja ein Punkt sein :) )

Jedenfalls Syntax-Fehler habe ich jetzt keine, allerdings sind die extra-definierten Felder nicht in der Struktur enthalten, wenn ich sie mir im Debugger anschau. Und ich kann mir nicht erklären warum.

Fällt dir/irgendjemandem etwas auf, woran das liegt?

Code: Alles auswählen.

TYPES BEGIN OF ts_data.
  INCLUDE TYPE /scwm/lagp.
  TYPES: LBERT TYPE /scwm/t302t-LBERT,
         LTYPT TYPE /scwm/t301t-LTYPT,
      END OF ts_data.

TYPES tt_fetchTabelle TYPE TABLE OF ts_data.

DATA: lt_fetchTabelle TYPE tt_fetchTabelle,        " Deklaration einer IT mit Struktur von Lagerplatztabelle für Array-Fetch
      wa_fetchTabelle LIKE LINE OF lt_fetchTabelle.   " Deklaration einer WorkArea vom Typ einer Zeile der IT

Re: Felder einer internen Tabelle hinzufügen + Join

Beitrag von LukasHD (ForumUser / 8 / 3 / 0 ) »
Ok, dieses Problem ist jetzt auch gelöst.

Am Code war nichts falsch, es lag einfach nur an der Einschränkung des Debuggers, dass er mir nur die ersten 50 Spalten angezeigt hat und alles dahinter einfach abgeschnitten.

Somit sind alle meine Probleme gelöst.

Danke nochmal an alle Antworter

Re: Felder einer internen Tabelle hinzufügen + Join

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
LukasHD hat geschrieben:Am Code war nichts falsch, es lag einfach nur an der Einschränkung des Debuggers, dass er mir nur die ersten 50 Spalten angezeigt hat und alles dahinter einfach abgeschnitten.
Benutzt du noch den alten Classic Debugger oder schon den neuen?
In der SE38 -> Hilfsmittel -> Einstellungen -> Reiter ABAP Editor -> Subreiter Debugging -> Neuer Debugger aktivieren oder wenns zum ausprobieren im Classic Debugger -> Debugging -> Wechseln zum neuen ABAP Debugger

Folgende Benutzer bedankten sich beim Autor JHM für den Beitrag:
LukasHD

Gruß Hendrik

Seite 1 von 1

Vergleichbare Themen

8
Antw.
5673
Views
Felder einer dyn.internen Tabelle zuweisen
von Thorsten » 09.03.2005 14:40 • Verfasst in Tips + Tricks & FAQs
2
Antw.
11834
Views
Mit Loop die Felder einer internen Tabelle ansprechen
von jharris » 22.10.2009 08:43 • Verfasst in ABAP® für Anfänger
1
Antw.
2353
Views
Einen neuen Feld in einen Internen Tabelle Hinzufügen
von 721227 » 17.07.2017 10:15 • Verfasst in ABAP® für Anfänger
9
Antw.
5414
Views
Problem mit Join von internen & DB-Tabellen
von debianfan » 10.11.2017 09:10 • Verfasst in ABAP® für Anfänger
0
Antw.
1072
Views
Geschäftspartner weitere Felder hinzufügen
von HUMA » 18.04.2006 08:24 • Verfasst in Dialogprogrammierung

Über diesen Beitrag


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

Aktuelle Forenbeiträge

Eclipse - warum/wann verwendet ihr es [nicht]
vor 49 Minuten von tar 21 / 1380
Dialog-Container mit Toolbar/Status
vor 3 Stunden von DeathAndPain gelöst 22 / 2789
Daten an Tabelle binden
vor 8 Stunden von Lukas Sanders 2 / 867
Zeilenumbrüche ersetzen
vor 2 Tagen von ralf.wenzel 6 / 423

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

Eclipse - warum/wann verwendet ihr es [nicht]
vor 49 Minuten von tar 21 / 1380
Dialog-Container mit Toolbar/Status
vor 3 Stunden von DeathAndPain gelöst 22 / 2789
Daten an Tabelle binden
vor 8 Stunden von Lukas Sanders 2 / 867
Zeilenumbrüche ersetzen
vor 2 Tagen von ralf.wenzel 6 / 423

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2459
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9044