JOIN

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

JOIN

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) »
Hallo Zusammen!

Habe ein Problem und hoffe Ihr könnt mir weiterhelfen!

Ich möchte mehrere Tabellen miteinander verknüpfen, nur leider bekomme ich immer wieder Syntaxfehler.

Ehrlich gesagt, weis ich im Moment gar nicht ob das überhaupt so funktionieren kann.

Ich greife zuerst mittels zwei Joins auf die BSIK und BSAK zu um mir Daten auszulesen. Diese beiden Joins funktionieren auch.

Aus der LFA1 lese ich mir das die Spalte land1 aus.

Nun mein Problem.

Ich möchte meine letzten beiden Select´s mit den oberen Joins verbinden. Und zwar geht es mir darum, diese Select´s mit der Spalte land1 zu verbinden.

Weder in BSIS noch BSAS gibt es die Spalten lifnr, land1.

Am Ende sollten nur Daten von hkont zu sehen sein, sprich von den unten stehenden Selects.

Habe es jetzt mittels mehrerer Joins versucht, bekomme aber immer wieder Syntaxfehler. Habe hier jetzt nur mal zwei Selects, um zusehen ob der Zugriff überhaupt funktioniert.

Hoffe Ihr könnt mir weiterhelfen und mir sagen ob das überhaupt geht.

Vielen vielen Dank!!!

Robin


Code: Alles auswählen.

START-OF-SELECTION.
*##################

* GUI-Titel anlegen

  SET TITLEBAR 'T_SOHA'.

  SELECT zdlkz bezeichnung
  FROM zdlkz_t INTO CORRESPONDING FIELDS OF TABLE itab_zdlkz_t
  WHERE zdlkz IN so_dlkz.

  IF sy-subrc <> 0.
    MESSAGE i003(/sapdmc/lsmw_glo_030).
*   Bitte tragen Sie einen gültigen Wert ein.
    EXIT.
  ENDIF.


 SELECT a~lifnr a~land1 b~diekz b~belnr b~zuonr b~blart b~bukrs b~monat
               b~gjahr b~shkzg b~bschl b~dmbtr b~wrbtr b~hkont
                       INTO CORRESPONDING FIELDS OF TABLE itab_sumla
                             FROM ( lfa1 AS a
                                      INNER JOIN bsak AS b
                                      ON a~lifnr = b~lifnr )
                                      WHERE bukrs IN ('1001')
                                      AND blart IN ('A1', 'A2', 'A3')
                                      AND land1 IN so_land
                                      AND gjahr IN range
                                      AND zuonr IN so_dlkz
                                      AND monat IN so_perio.

 SELECT a~lifnr a~land1 b~diekz b~belnr b~zuonr b~blart b~bukrs b~monat
               b~gjahr b~shkzg b~bschl b~dmbtr b~wrbtr b~hkont
                     APPENDING CORRESPONDING FIELDS OF TABLE itab_sumla
                            FROM ( lfa1 AS a
                                     INNER JOIN bsik AS b
                                     ON a~lifnr = b~lifnr )
                                     WHERE bukrs IN ('1001')
                                     AND blart IN ('A1', 'A2', 'A3')
                                     AND land1 IN so_land
                                     AND gjahr IN range
                                     AND zuonr IN so_dlkz
                                     AND monat IN so_perio.

 SELECT bukrs hkont zuonr gjahr belnr blart monat bschl shkzg wrbtr
 APPENDING CORRESPONDING FIELDS OF TABLE itab_sumla
 FROM bsas
 WHERE bukrs IN ('1001')
 AND blart IN ('A1', 'A2', 'A3')
 AND gjahr IN range
 AND zuonr IN so_dlkz
 AND monat IN so_perio.

 SELECT bukrs hkont zuonr gjahr belnr blart monat bschl shkzg wrbtr
 APPENDING CORRESPONDING FIELDS OF TABLE itab_sumla
 FROM bsis
 WHERE bukrs IN ('1001')
 AND blart IN ('A1', 'A2', 'A3')
 AND gjahr IN range
 AND zuonr IN so_dlkz
 AND monat IN so_perio.

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


Beitrag von robin1at (Specialist / 190 / 0 / 0 ) »
Habe jetzt meine zwei Joins erweitert.

Zum Verständnis, brauche BSIK und BSAK, da ich nur diese mit LFA1 verknüpfen kann.

Nun möchte ich aber die Daten aus BSIS und BSAS ausgeben.

Im moment bekomme ich nur die Daten aus BSIK und BSAK.

Sieht von Euch wer meinen Fehler???

Danke

Robin

Code: Alles auswählen.

SELECT a~lifnr a~land1 b~diekz b~belnr b~zuonr b~blart b~bukrs b~monat
b~gjahr b~shkzg b~bschl b~dmbtr b~wrbtr c~hkont c~belnr c~zuonr c~blart
  c~bukrs c~monat c~gjahr c~shkzg c~bschl c~wrbtr
                         INTO CORRESPONDING FIELDS OF TABLE itab_sumla
                                FROM ( ( lfa1 AS a
                                       INNER JOIN bsak AS b
                                       ON a~lifnr = b~lifnr )
                                       INNER JOIN bsas AS c
                                       ON b~hkont = c~hkont AND
                                       b~belnr = c~belnr AND
                                       b~zuonr = c~zuonr AND
                                       b~blart = c~blart AND
                                       b~bukrs = c~bukrs AND
                                       b~monat = c~monat AND
                                       b~gjahr = c~gjahr AND
                                       b~shkzg = c~shkzg AND
                                       b~wrbtr = c~wrbtr )
                                       WHERE c~bukrs IN ('1001')
                                       AND c~blart IN ('A1', 'A2', 'A3')
                                       AND land1 IN so_land
                                       AND c~gjahr IN range
                                       AND c~zuonr IN so_dlkz
                                       AND c~monat IN so_perio.

 SELECT a~lifnr a~land1 b~diekz b~belnr b~zuonr b~blart b~bukrs b~monat
b~gjahr b~shkzg b~bschl b~dmbtr b~wrbtr c~hkont c~belnr c~zuonr c~blart
  c~bukrs c~monat c~gjahr c~shkzg c~wrbtr
                     APPENDING CORRESPONDING FIELDS OF TABLE itab_sumla
                               FROM ( ( lfa1 AS a
                                      INNER JOIN bsik AS b
                                      ON a~lifnr = b~lifnr )
                                      INNER JOIN bsis AS c
                                      ON b~hkont = c~hkont AND
                                      b~belnr = c~belnr AND
                                      b~zuonr = c~zuonr AND
                                      b~blart = c~blart AND
                                      b~bukrs = c~bukrs AND
                                      b~monat = c~monat AND
                                      b~gjahr = c~gjahr AND
                                      b~shkzg = c~shkzg AND
                                      b~wrbtr = c~wrbtr )
                                      WHERE c~bukrs IN ('1001')
                                      AND c~blart IN ('A1', 'A2', 'A3')
                                      AND land1 IN so_land
                                      AND c~gjahr IN range
                                      AND c~zuonr IN so_dlkz
                                      AND c~monat IN so_perio.

Beitrag von cosmo (Specialist / 175 / 0 / 0 ) »
Einen direkten Fehler sehe ich nicht, aber ich glaube, da gibt es ein Missverständnis, was einen Join betrifft:

- du verknüpfst z.b. die bsik mit der bsis über alle felder, die Deiner Meinung nach identisch sein müssten in beiden Sätzen. Das kann den DB-Optimizier durcheinanderbringen. Da die Belegnummer schon eindeutig ist, reicht es, über diese zu joinen.

Bekommst Du denn eine Fehlermeldung beim Syntax-check?
Jörg Krause, Anwendungsentwickler und SAP-Betreuer MM/PP

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) »
Hallo Cosmo!

Vielen Dank für den Hinweis!

Fehlermeldung bekomme ich keine.

Habe jetzt nur die belnr drinnen, und jetzt bekomme ich sie zumindest mal angezeigt.

Das Problem das ich jetzt noch habe ist, daß ich die Daten aus BSAK und BSIK auch noch sehe.

Wie muß ich nun vorgehen, daß ich nur die Daten von BSIS und BSAS sehe?

Vielen vielen Dank für Deine tolle Hilfe!!!!

Robin

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) »
Nochmals Hallo liebe Helfer!

Komme hier einfach nicht weiter, jetzt meine Frage:

Kann ich diese Zeilen denn überhaupt ausblenden?

Danke

Robin

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
Tach.

Du machst 4 SELECTs:
1. INTO...TABLE
--> Interne Tabelle wird initial befuellt mit Daten aus BSAK

2. APPENDING...TABLE
--> Interne Tabelle wird erweitert um Daten aus BSIK

3. APPENDING...TABLE
--> Interne Tabelle wird erweitert um Daten aus BSIS

4. APPENDING...TABLE
--> Interne Tabelle wird erweitert um Daten aus BSAS

Du hast in Deiner Ergebnis-ITab also Daten aus allen 4 Tabellen. Wenn Du einen Teil der Daten (im ALV?) ausblenden willst musst Du Dir eine Markierung schaffen. Du hängst z.B. eine weitere Spalte an und befüllst diese mit der Herkunft der Daten (also z.B. dem Namen der Tabelle, aus der Du selektiert hast). Im ALV kannst Du darauf dann einen Filter setzen.

Gruss,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) »
Hallo Haubi!

Danke für Deine Antwort!

Verstehe, dann habe ich z.B.: zusätzlich die Spalten
LFA1, BSAK, BSIK, BSAS, BSIS.

Aber was finde ich dann in diesen Spalten für Daten?

Sorry, daß ich so dumm frage.

Aber wie meinst Du das genau?

Danke

Robin

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
Tach.

Falsch, Du hast nicht 5 weitere Spalten, sondern eine. In dieser steht dann bei den Daten aus der ersten Selektion "BSAK", bei denen aus der zweiten Selektion "BSIK" und so weiter.

Gruss,
Haubi

P.S.: wenn Du die Daten aus BSAK und BSIK nicht sehen willst: warum selektierst Du sie dann erst? Oder soll der User entscheiden, welche er sich ansieht?
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) »
Hallo Haubi!

Ich brauche diese Daten, damit ich auf die LFA1 zugreifen kann und mir das Land dazuverknüpfen kann.

Danke

Robin

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo.

Ich werde jetzt die Diskusion um Selektionen mal an dieser Stelle abbrechen.

@Robin.
Ich verlange jetzt von Dir eine sinnvolle und vollständige Beschreibung Deiner Aufgabe.

Welche Eingaben soll der Anwender machen dürfen und welche Daten sollen nach erfolgter Selektion angezeigt werden.

Auf Basis der bisherigen Threads könnte sie in etwa so lauten:
Selektiere alle Belege zu Lieferanten ausgewählter Länder, zu denen es eine Hauptbuchkontierung gibt.
(Welche sonstigen Bedingungen gibt es noch?)

PS:
nimm es mir nicht übel, aber die bisherigen Threads haben nicht zu unserem Verständnis beigetragen. Und zu Deinem scheinbar auch nicht.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) »
Hallo Ereglam!

Ich habe das Problem, daß ich zuviele Daten im ALV angezeigt bekomme.

Und zwar sehe ich die Daten aus BSAK, BSIK, BSAS und BSIS.

Ich brauche BSAK und BSIK für die Verknüpfung zur Tabelle LFA1 in der das Land steht.

Habe im Anhang meinen ALV. Hier möchte ich nurmehr die Daten sehen, die jetzt in der Spalte ZUONR einen Wert haben. (kommen aus BSAS und BSIS)

Mein Problem ist. Kann ich die Daten von BSAK und BSIK ausblenden?

Ich brauchte diese Tabellen nur um eine Verknüpfung zum Land zu bekommen, will aber deren Daten nicht anzeigen.

Es könnte ungefähr so lauten:

Selektiere alle Belege mit der Belegart A1, A2, A3, welche im genannten Zeitraum zum bestimmten Land angefallen sind.

Danke

Robin

Beitrag von Flo (Specialist / 161 / 0 / 0 ) »
Warum selektierst du dann Daten die du nicht brauchst in deine Tabelle?

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
robin1at hat geschrieben:...
Ich habe das Problem, daß ich zuviele Daten im ALV angezeigt bekomme.
dann ist die Selektion falsch!
robin1at hat geschrieben: Und zwar sehe ich die Daten aus BSAK, BSIK, BSAS und BSIS.

Ich brauche BSAK und BSIK für die Verknüpfung zur Tabelle LFA1 in der das Land steht.
vielleicht solltest Du erst einmal alle Daten, die Du brauchst sammeln und daraus dann den Datenbestand erzeugen, der für die Anzeige im ALV gedacht ist.
robin1at hat geschrieben: Habe im Anhang meinen ALV. Hier möchte ich nurmehr die Daten sehen, die jetzt in der Spalte ZUONR einen Wert haben. (kommen aus BSAS und BSIS)
Ist das eine Bedingung (ZUORD ist gefüllt)?
robin1at hat geschrieben:...
Es könnte ungefähr so lauten:

Selektiere alle Belege mit der Belegart A1, A2, A3, welche im genannten Zeitraum zum bestimmten Land angefallen sind.
Was heißt hier 'könnte'? Ist das Deine Aufgabe? Und was ist mit der Bedingung zu ZUORD?
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von Flo (Specialist / 161 / 0 / 0 ) »
Meine Frage bezog sich auch auf den Aufbau der internen Tabelle, und auf ein Select. Warum Selectierst du zB b~zuord wenn du doch gar nicht zuord der bsak sehen willst. Lass doch im Select alle Felder die du nicht brauchst weg dann hast du auch nicht zu viele Daten.

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) »
Hallo Ereglam!

ZUONR wird gefüllt, aber es gibt auch noch Daten wo dieses nicht gefüllt ist.

ZUONR vergleiche (READ) ich in meinem Coding mit einer anderen Tabelle, daß mir dann die Felder DlKZ und Bezeichnung füllt, wenn die Werte in ZUONR übereinstimmen.

Ja, das ist meine Aufgabe.

Habe hier noch einen Ausdruck von der TA FB03 angehängt. Ich möchte NUR die Daten aus der zweiten Spalte haben. Bekomme aber immer beide.

Wenn ich im Select nur auf die Daten BSIS und BSAS selektiere bekomme ich auch immer noch die aus der ersten Zeile.

Wie kann ich das einschränken?

Danke

Robin

Vergleichbare Themen

1
Antw.
774
Views
Join mit Left Outer Join
von Rude1986 » 17.01.2021 19:53 • Verfasst in ABAP® für Anfänger
8
Antw.
991
Views
Inner Join
von L0w-RiDer » 06.11.2019 09:47 • Verfasst in ABAP® für Anfänger
3
Antw.
3260
Views
Was ist ein Join?
von Schmarsi » 28.09.2010 11:37 • Verfasst in ABAP® für Anfänger
3
Antw.
2930
Views
inner join
von dawns » 14.05.2007 15:49 • Verfasst in ABAP® für Anfänger
1
Antw.
1335
Views
inner join
von dimes » 20.01.2006 07:57 • Verfasst in ABAP® Core

Ü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.