Interne Tabelle - Mehrere Treffer einfügen

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

Interne Tabelle - Mehrere Treffer einfügen

Beitrag von Riga00 (ForumUser / 1 / 0 / 0 ) »
Hallo, ich bin sehr neu, was die ABAP-Programmierung angeht und es scheint, als fehlten mir leider noch diverse Grundlagen...

Ich möchte aus Tabelle DRAW Dokumenteninfosätze nach bestimmten Kriterien auslesen. Anschließend will ich aus Tabelle DRAD die verknüpften Materialnummern (=OBJKY) holen.

Code: Alles auswählen.

  SELECT dokar doknr dokvr dwnam dokst doktl FROM draw INTO (wa_tab-dokar, wa_tab-doknr, wa_tab-dokvr, wa_tab-dwnam, wa_tab-dokst, wa_tab-doktl) WHERE doknr IN s_doknr AND dokar IN s_dokar AND dokst IN s_dokst.
    SELECT objky FROM drad INTO wa_tab-objky WHERE doknr EQ wa_tab-doknr AND dokvr EQ wa_tab-dokvr AND doktl EQ wa_tab-doktl.
Das Feld wa_tab-objky wird bei meiner Programmierung (logischerweise) nur mit einem Eintrag aus der DRAD befüllt. Wie muss ich aber vorgehen, wenn ich in der DRAD mehrere verknüpfte Materialnummern habe?

Bin wie gesagt kompletter Anfänger und weiß nicht mal nach welchen Schlagworten ich diesbezüglich suchen müsste. Macht man sowas mit einem loop oder vielleicht über insert line?! Wäre für Rückmeldungen dankbar.

Vielen Dank im Voraus!

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


Re: Interne Tabelle - Mehrere Treffer einfügen

Beitrag von wolli (ForumUser / 80 / 3 / 1 ) »
Anhand deines Code-Schnipsels würde ich das so machen:
SELECT [...] FROM DRAW INTO WA_...
SELECT [...] FROM DRAD INTO WA_...
APPEND WA TO ITAB.
ENDSELECT.
ENDSELECT.

Re: Interne Tabelle - Mehrere Treffer einfügen

Beitrag von wolli (ForumUser / 80 / 3 / 1 ) »
SELECT dokar doknr dokvr dwnam dokst doktl FROM draw INTO (wa_tab-dokar, wa_tab-doknr, wa_tab-dokvr, wa_tab-dwnam, wa_tab-dokst, wa_tab-doktl) WHERE doknr IN s_doknr AND dokar IN s_dokar AND dokst IN s_dokst.
SELECT objky FROM drad INTO wa_tab-objky WHERE doknr EQ wa_tab-doknr AND dokvr EQ wa_tab-dokvr AND doktl EQ wa_tab-doktl.
APPEND WA_TAB INTO ITAB...
ENDSELECT.
ENDSELECT.

Re: Interne Tabelle - Mehrere Treffer einfügen

Beitrag von DeathAndPain (Top Expert / 1961 / 261 / 415 ) »
Nur ist das performancetechnisch scheußlich (d.h. sehr langsam). SELECT...ENDSELECT ist eh schon langsam, und dann noch geschachtelt ist noch viel schlimmer. Besser wäre, den äußeren SELECT in eine interne Tabelle (INTO TABLE) zu machen und den inneren dann mit FOR ALL ENTRIES IN zu bauen. Das sollte um Größenordnungen schneller laufen.

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


Re: Interne Tabelle - Mehrere Treffer einfügen

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
DeathAndPain hat geschrieben:
28.08.2023 12:45
Nur ist das performancetechnisch scheußlich (d.h. sehr langsam). SELECT...ENDSELECT ist eh schon langsam, und dann noch geschachtelt ist noch viel schlimmer. Besser wäre, den äußeren SELECT in eine interne Tabelle (INTO TABLE) zu machen und den inneren dann mit FOR ALL ENTRIES IN zu bauen. Das sollte um Größenordnungen schneller laufen.
Hmm, aber die Treffer sollen doch am Ende alle in einer Tabelle landen, wenn ich das richtig verstehe. Dann wäre es doch am einfachsten und schnellsten einen einzigen SELECT mit JOIN zu bauen, oder?

Code: Alles auswählen.

SELECT draw~dokar, draw~doknr, draw~doktl, draw~dokvr, drad~objky, draw~dwnam, draw~dokst
  FROM draw
      JOIN  drad 
        ON  drad~dokar = draw~dokar
        AND drad~doknr = draw~doknr
        AND drad~doktl = draw~doktl
        AND drad~dokvr = draw~dokvr
  INTO CORRESPONDING FIELDS OF TABLE doc_info_records
  WHERE draw~dokar IN s_dokar
    AND draw~doknr IN s_doknr
    AND draw~dokst IN s_dokst.
Sieht dann auch viel übersichtlicher aus... ;-)

Grüße,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

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

Re: Interne Tabelle - Mehrere Treffer einfügen

Beitrag von DeathAndPain (Top Expert / 1961 / 261 / 415 ) »
Ja, das ist richtig. Das ist die beste Herangehensweise. Noch ein Quentchen mehr Performance kannst Du mit INTO TABLE anstelle von INTO CORRESPONDING FIELDS OF TABLE herauskitzeln. Natürlich nur, sofern die interne Tabelle doc_info_records entsprechend definiert ist (die gleichen Spalten in der gleichen Reihenfolge).

Und ich liebe es, wie Du in Deinem Join keine Aliase benutzt hast, was sonst fast alle machen, obwohl sie den SELECT nur schlechter lesbar machen.

Re: Interne Tabelle - Mehrere Treffer einfügen

Beitrag von black_adept (Top Expert / 4103 / 128 / 945 ) »
DeathAndPain hat geschrieben:
31.08.2023 13:03
Und ich liebe es, wie Du in Deinem Join keine Aliase benutzt hast, was sonst fast alle machen, obwohl sie den SELECT nur schlechter lesbar machen.
Ist das Verwenden von Alias echt so üblich? Habe das bisher nur selten in freier Wildbahn gesehen.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Interne Tabelle - Mehrere Treffer einfügen

Beitrag von a-dead-trousers (Top Expert / 4410 / 224 / 1184 ) »
Macht IMHO nur Sinn wenn man eine Tabelle mit sich selbst joined oder wenn man "lange" Tabellennamen hat. Die Viersteller der meisten SAP-Standardtabellen sind kein Grund für einen Join, finde ich.
Ich persönlich leg mir aber trotzdem lieber einen (CDS-)View dafür an. Ist wiederverwendbar und laut den aktuellen Roadmaps die "Zukunft" von SAP.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Interne Tabelle - Mehrere Treffer einfügen

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
a-dead-trousers hat geschrieben:
31.08.2023 21:59
Macht IMHO nur Sinn wenn man eine Tabelle mit sich selbst joined oder wenn man "lange" Tabellennamen hat. Die Viersteller der meisten SAP-Standardtabellen sind kein Grund für einen Join, finde ich.
Da bin ich Deiner Meinung, insbesondere wenn dann für (hier im Beispiel) für "DRAW" den Alias "a" und für "DRAD" den Alias "b" verwendet. Ist dann unübersichtlicher als ohne Alias. (Ist mir aber auch schon in freier Wildbahn über den Weg gelaufen.
Wo ich definitiv immer Aliase verwende ist, wenn Tabellen in einem Namensraum liegen, also z.B. /SCDL/DB_PROCI_I. Einerseits weil es dann eben übersichtlicher wird und ich den Alias so wählen kann, dass er etwas über den Zweck der Tabelle aussagt, andererseits mag ich keine Blasen an den Fingerkuppen... ;-)

a-dead-trousers hat geschrieben:
31.08.2023 21:59
Ich persönlich leg mir aber trotzdem lieber einen (CDS-)View dafür an. Ist wiederverwendbar und laut den aktuellen Roadmaps die "Zukunft" von SAP.
Spätestens wenn man den gleichen JOIN das zweite Mal baut sollte man darüber nachdenken, zumal man den View dann auch in der SE16(N) verwenden und ihn somit auch Nicht-Technikern zur Verfügung stellen kann. Das ist in manchen Fällen sehr hilfreich.

Grüße,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

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

Re: Interne Tabelle - Mehrere Treffer einfügen

Beitrag von DeathAndPain (Top Expert / 1961 / 261 / 415 ) »
black_adept hat geschrieben:
31.08.2023 14:34
DeathAndPain hat geschrieben:
31.08.2023 13:03
Und ich liebe es, wie Du in Deinem Join keine Aliase benutzt hast, was sonst fast alle machen, obwohl sie den SELECT nur schlechter lesbar machen.
Ist das Verwenden von Alias echt so üblich? Habe das bisher nur selten in freier Wildbahn gesehen.
Gerade hier im Forum lese ich das sonst in praktisch jedem Programmbeispiel, das einen Join enthält. Aber auch in "freier Wildbahn", soweit es bei den betreffenden Entwicklern überhaupt für einen Join reicht (ich weiß, das klingt zynisch, ist aber so).
Haubi hat geschrieben:
01.09.2023 11:12
Wo ich definitiv immer Aliase verwende ist, wenn Tabellen in einem Namensraum liegen, also z.B. /SCDL/DB_PROCI_I. Einerseits weil es dann eben übersichtlicher wird und ich den Alias so wählen kann, dass er etwas über den Zweck der Tabelle aussagt, andererseits mag ich keine Blasen an den Fingerkuppen... ;-)
Dann kann man den Alias aber immer noch so wählen, dass er sich gut nachvollziehbar liest, in diesem Falle also z.B. PROCI_I anstelle der gängigen einbuchstabigen Aliasnamen, bei denen dem Leser nicht sofort ersichtlich ist, worauf sie sich beziehen.
Spätestens wenn man den gleichen JOIN das zweite Mal baut sollte man darüber nachdenken, zumal man den View dann auch in der SE16(N) verwenden und ihn somit auch Nicht-Technikern zur Verfügung stellen kann. Das ist in manchen Fällen sehr hilfreich.
Wenn ich mich recht erinnere, werden Views in der SE16 aber nicht in richtige Datenbank-Joins übersetzt, sondern in Unions oder so. Damit ist der Zugriff weniger performant. Das sage ich jetzt aber nur aus der Erinnerung, ohne es gemessen zu haben oder anderweitig belegen zu können.

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


Seite 1 von 1

Vergleichbare Themen

3
Antw.
1467
Views
4
Antw.
1222
Views
5
Antw.
2243
Views
Inhalt interne Tabelle an andere interne Tabelle übergeben
von L0w-RiDer » 30.01.2020 16:28 • Verfasst in ABAP® für Anfänger
8
Antw.
8028
Views
Werte in Tabelle einfügen
von thomasxy » 15.01.2008 11:09 • 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.