Mit SELECT rückwärts durch 3 Tabellen hochhangeln

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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

Mit SELECT rückwärts durch 3 Tabellen hochhangeln

Beitrag von bliss (ForumUser / 66 / 2 / 6 ) »
Hallo!

Ich habe drei Tabellen: Tätigkeit-Kopf, Tätigkeit-Position und Auftrag. Die Auftragsnummer steht als Fremdschlüssel in der Tabelle Tätigkeit-Position, also eine 1:CN-Kardinalität.

Ich möchte jetzt für mein Programm erst aus der Tabelle Auftrag mit SELECT bestimmte Aufträge raussuchen, dann anhand der Auftragsnummern in der Tätigkeit-Position die Tätigkeitsnummer nachschlagen, und mich dann anhand der Tätigkeitsnummer weiter zu Tätigkeit-Kopf hochhangeln. Grund dafür ist, dass es viel mehr Tätigkeiten als Aufträge gibt, so dass ich ne schlechtere Performance hätte, wenn ich erst mal alle Tätigkeiten durchsuchen würde.

Ich habe noch keine Lösung, bin eben noch mittendrin, ich versuche halt Schritt für Schritt meine Selects und Loops aufzubauen. Z. B. habe ich in der Dokumentation SELECT ... FOR ALL ENTRIES IN gefunden. Versuche gleich mal die Auftragsnummer als itab an das SELECT weiterzureichen.

Aber bevor noch ein Tag ins Land zieht, wollte ich mal fragen, was ihr von meinem Ansatz haltet. Kann das so funktionieren, wie ich mir das vorstelle? Ich bin mir sicher, ich bin nicht der erste, der sich "rückwärts" mit SELECT die Daten beschaffen möchte. Ich bin auch die ganze Zeit am rumtesten und grübeln. Ach, ich weiß gar nicht, ob meine Arbeitsweise die richtige ist :|

Viele Grüße
Zuletzt geändert von bliss am 12.03.2013 13:20, insgesamt 5-mal geändert.
Gruß
bliss
.|.. .. ...| . .|.. ||| |. ||. .| |. |.. .||. .|. ||| ... .||. . .|.

Ich bin Anfänger und meine Tipps sind mit Vorsicht zu genießen.

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


Re: Mit SELECT rückwärts durch 3 Tabellen hochhangeln

Beitrag von c oco (Specialist / 326 / 12 / 16 ) »
Hi,

welche Tabellen und welche Felder brauchst du?

Mit All entries bist du schon mal richtig, ist wie ein inner join.
Und du solltest nicht select * machen, aus Performancegründen. Besser, wenn du die Felder die du für deine Ausgabe brauchst, angibst.

Grundsätzlich hört sich dein Ansatz richtig an. Um genaueres sagen zu können, müsste ich mehr wissen.

Viele Grüße
coco

Re: Mit SELECT rückwärts durch 3 Tabellen hochhangeln

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
hallo bliss,

von verschachtelten SELECTS halte ich nicht viel und würde hier den SELECT ... FOR ALL ENTRIES IN Ansatz verfolgen. Definiere drei interne Tabellen: eine für den Auftrag (gt_auftr), eine für den Kopf (gt_kopf) und eine für Positionen (gt_pos).

Als erstes selektierst Du dann alle Aufträge mit SELECT...APPENDING TABLE gt_auftr passend zu Deinen Selektionskriterien. Anschliessend liest Du mit SELECT...APPENDING TABLE gt_pos FOR ALL ENTRIES IN gt_auftr die Positionen. Und zum Schluss liest Du mit SELECT...APPENDING TABLE gt_kopf FOR ALL ENTRIES IN gt_pos. Nach drei DB-Zugriffen müsstest Du dann alle Daten beisammen haben die Dich interessieren.

Die anschliessenden LOOPs kannst Du ja dann so gestalten, wie es die Aufgabestellung vorsieht. Also entweder zuerst über alle Aufträge LOOPen und den Rest dazu lesen, oder eben über alle Köpfe...

Gruss
Alexander
schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: Mit SELECT rückwärts durch 3 Tabellen hochhangeln

Beitrag von bliss (ForumUser / 66 / 2 / 6 ) »
Oh, schön, ihr kommt gleich mit Codebeispielen :) Ich wollte erst mal nur wissen ob mein Ansatz stimmt und ihr scheint meinen Weg zu bestätigen. Kam mir eben komisch vor, das Ganze rückwärts anzugehen. Danke! :D

Nun gut, ich war den ganzen Tag auch nicht faul und hab das soweit fertig:

Code: Alles auswählen.

  " Erst ein gewöhnlicher SELECT für die Auftragsnummern, dann:

  SELECT tnum
    INTO CORRESPONDING FIELDS OF TABLE gt_pos
    FROM zztpos
    FOR ALL ENTRIES IN gt_auftr
    WHERE aufnr = gt_auftr-aufnr.

  IF sy-subrc <> 0.
    " Fehlermeldung
    RETURN.
  ENDIF.

  DELETE ADJACENT DUPLICATES FROM gt_pos COMPARING tnum.
  SORT gt_pos BY tnum.

  " und jetzt nochmal einen Schritt hoch zu den Kopfdaten:

  SELECT tnum " und 10 weitere Felder
    INTO CORRESPONDING FIELDS OF TABLE gt_kopf
    FROM zztkopf
    FOR ALL ENTRIES IN gt_pos
    WHERE tnum = gt_pos-tnum.

  IF sy-subrc <> 0.
    " Fehlermeldung
    RETURN.
  ENDIF.

  DELETE ADJACENT DUPLICATES FROM gt_kopf COMPARING tnum.
  SORT gt_kopf BY tnum.

  " Und hier ein gewöhnlicher LOOP mit WRITE für die 11 Felder in gt_kopf

Von SELECT * war keine Rede. Die 3 internen Tabellen inkl. 3 dazu passende Arbeitstabellen (work area) habe ich auch schon angelegt. APPENDING TABLE benutze ich nicht, weil ich einen Array Fetch benutze, wie man sieht (INTO CORRESPONDING FIELDS OF TABLE).

Jetzt wo ich damit fertig bin, erscheint alles ganz einfach. Heute morgen hatte ich noch echt damit zu kämpfen. Und das ist glaub ich auch mein eigentliches Problem: Ich brauche viel zu lange :( Aber dabei kann mir wohl keiner helfen.

Noch eine Anschlussfrage hätte ich an euch: Ich habe die SELECTS selbst geschrieben, damit ich die Zusammenhänge verstehe. Ich soll die Select-Abfragen aber eigentlich nicht selbst schreiben, sondern muss Funktionsbausteine benutzen. Diese Funktionen sehen aber ganz komisch aus:

Code: Alles auswählen.

FUNCTION ZZTK.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     VALUE(ITNUM) LIKE  ZZTK-TNUM
*"  EXPORTING
*"     VALUE(WZTK) LIKE  ZZTK STRUCTURE  ZZTK
*"  EXCEPTIONS
*"      NOT_FOUND
*"----------------------------------------------------------------------
  SELECT SINGLE * FROM ZZTK WHERE TNUM = ITNUM.
  IF SY-SUBRC NE 0.
    CLEAR WZTK.
    RAISE NOT_FOUND.
  ELSE.
    MOVE ZZTK TO WZTK.
  ENDIF.
Das heißt der Aufruf müsste so aussehen:

Code: Alles auswählen.

  CALL FUNCTION 'ZZTK'
  EXPORTING
    ITNUM  =  " hier muss ich wohl tnum übergeben
  IMPORTING
    WZTK  =  " hier bekomme ich nur einen Datensatz zurück
  EXCEPTIONS
    NOT_FOUND = 1
    OTHERS    = 2.
Warum steht da SINGLE? Das gibt mir doch nur einen Datensatz zurück. Habe ich getestet. Muss ich jetzt das Ergebnis über ne Arbeitstabelle in eine interne Tabelle einlesen, oder was sonst? Ich habe keine Ahnung! Wie ist der Ansatz hier? Wenn ihr mir diesen einen Funktionsbaustein erklären könnt, kann ich die anderen Bausteine selbst nachvollzeihen, weil ich (wenn möglich) alle SELECTs darüber programmieren soll.

Gruß
Gruß
bliss
.|.. .. ...| . .|.. ||| |. ||. .| |. |.. .||. .|. ||| ... .||. . .|.

Ich bin Anfänger und meine Tipps sind mit Vorsicht zu genießen.

Re: Mit SELECT rückwärts durch 3 Tabellen hochhangeln

Beitrag von a-dead-trousers (Top Expert / 4286 / 214 / 1142 ) »
hi!

Die Idee solche Datenbankabfragen in Funktionsbausteinen zu kapseln ist auf den ersten Blick nicht schlecht, aber mit dem SINGLE hat sich der ZZTK-Baustein meines Erachtens ganz klar wieder disqualifiziert.
Wenn du jeden Satz einzeln liest wirst du nicht nur um einiges mehr Code schreiben müssen, sondern auch die DB unnötig belasten.

Such mal über Verwendungsnachweise ob nicht irgendwer auf eurem System schon einen besseren Zugriff auf die Tabelle ZZTK implementiert hat.
Oder füg einen neuen Funktionsbaustein in dieselbe Funktionsgruppe wie ZZTK ein, den du z.B. ZZTK_SELECT_MULTIPLE oder so ähnlich nennst.
Ich glaub bei dem SELECT SINGLE lässt sich schon sehr gut argumentieren, warum du das nicht verwendet hast.

lg ADT
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: Mit SELECT rückwärts durch 3 Tabellen hochhangeln

Beitrag von bliss (ForumUser / 66 / 2 / 6 ) »
Ok, wenn wir über die Daseinsberechtingung der Funktionsbausteine diskutieren, dann muss ich noch dazu sagen, dass ich eine Abfrage der Übersichtlichkeit halber weggelassen habe, und zwar wird mit

Code: Alles auswählen.

  IF ITNUM = ZZTK-TNUM AND ITNUM NE 0.
    MOVE ZZTK TO WZTK.
    EXIT.
  ENDIF.
abgefragt, ob - äh, ja was genau? - ob der aktuelle Datensatz schon dem gewünschten Datensatz entspricht! Schätze ich. Damit wird wohl eine Art Puffer realisiert.

Ich werd meinem Chef ganz sicher nicht sagen, dass er hier schlecht programmiert hat! Nicht als Anfänger, da ist bestimmt was, was ich noch nicht erkennen kann, oder ich dir nicht zeigen kann, was deine Meinung ändern könnte. Ich weiß es nicht, du kannst natürlich auch absolut im Recht sein! Nein, ich sehe hier leider keine anderen / ähnlichen Funktionen, auch nicht über den Verwendungsnachweis.

Würdest du mir trotzdem erklären, wie ich diesen Funktionsbaustein nutzen kann? Ich kenne schon genug Theorie dazu, aber es ist in der Praxis doch wieder was anderes, neues. Danke dir für deine Anwort!

Und dann zeig ich dir mal eine Laufzeitanalyse im Vergleich mit und ohne Funktionsbaustein! Ich denke auch, dass du Recht hast, aber ich muss das jetzt mal so machen. Deinen Einwand werde ich mir aber merken!

Gruß
bliss
Gruß
bliss
.|.. .. ...| . .|.. ||| |. ||. .| |. |.. .||. .|. ||| ... .||. . .|.

Ich bin Anfänger und meine Tipps sind mit Vorsicht zu genießen.

Re: Mit SELECT rückwärts durch 3 Tabellen hochhangeln

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
das mit INTO CORRESPONDING FIELDS habe ich mir nach einigen schlechten Erfahrungen abgewöhnt. Ich könnte mir auch vorstellen, dass es auch performanter ist die Feldreihenfolge vorzugeben anstatt diese vom SAP automatisch bestimmen zu lassen, das ist aber Geschmackssache.

bei FOR ALL ENTRIES IN gt_auftr würde ich vorher noch prüfen ob gt_auftr Einträge enthält. Tut sie es nicht, so selektierst Du alle Einträge aus der FROM Tabelle.

Was den Baustein angeht, so liest er in der Tat immer nur eine Zeile, passend zu der ITNUM. Das Ergebnis davon ist eine Zeile aus der ZZTK welche Du dann in eine interne Tabelle speichern könntest bzw. müsstest
schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: Mit SELECT rückwärts durch 3 Tabellen hochhangeln

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
abgefragt, ob - äh, ja was genau? - ob der aktuelle Datensatz schon dem gewünschten Datensatz entspricht! Schätze ich. Damit wird wohl eine Art Puffer realisiert.
wie sieht der Baustein konkret aus? Stand diese Abfrage vor, oder nach dem SELECT SINGLE?

Das Ergebnis der Laufzeitanalyse könnte man seh schön als Argumentation für einen neuen Baustein mit Multi-Select verwenden. Und wie dieses Ergebnis aussieht wird man sich auch so schon denken können :-)
schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: Mit SELECT rückwärts durch 3 Tabellen hochhangeln

Beitrag von ewx (Top Expert / 4786 / 294 / 629 ) »
bliss hat geschrieben: DELETE ADJACENT DUPLICATES FROM gt_pos COMPARING tnum.
SORT gt_pos BY tnum.
Der SORT muss VOR dem DELETE erfolgen!

Der Funktionsbaustein ZZTK liegt im SAP-Namensraum!!
Funktionsbausteine müssen mit Z_ oder Y_ beginnen!

Re: Mit SELECT rückwärts durch 3 Tabellen hochhangeln

Beitrag von black_adept (Top Expert / 3947 / 105 / 886 ) »
ewx hat geschrieben:Der Funktionsbaustein ZZTK liegt im SAP-Namensraum!!
Funktionsbausteine müssen mit Z_ oder Y_ beginnen!
*Klugscheißermodus an* Bloß weil etwas nicht im (vorgesehenen) Kundennamensraum liegt heißt noch lange nicht, dass es dadurch automatisch im SAP-Namensraum liegt. So eine Aussage würde nur dann gelten,wenn SAP- und Kundennamensraum die Gesamtheit der Namensräume vollständig überdecken *Klugscheißermodus aus*

Ansonsten hat ewx natürlich recht- man sollte nicht ohne Grund die Warnung die SAP extra aufblendet ignorieren.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Mit SELECT rückwärts durch 3 Tabellen hochhangeln

Beitrag von bliss (ForumUser / 66 / 2 / 6 ) »
Ok, was soll das, warum bin ich in meiner Freizeit hier? :D

Die IF-Abfrage steht natürlich vor dem SELECT. Sonst habe ich nichts von der Funktion weggelassen.

Ok, ich will das mit dem Multi-Select machen, aber dazu müsste ich wissen, wie ich mit der Funktion genau umgehen muss.
a-dead-trousers hat geschrieben:Wenn du jeden Satz einzeln liest wirst du nicht nur um einiges mehr Code schreiben müssen, sondern auch die DB unnötig belasten.
Viel mehr Code? Das Problem ist, dass ich mit der Aufgabenstellung am Freitag schon fertig sein muss und dabei war die Datenbeschaffung erst die Hälfte der Arbeit. Ich muss dringend meine Arbeitsweise ändern!

Ich werde also in einem LOOP den Funktionsbaustein aufrufen und den Rückgabewert in die wa_kopf auslesen und sofort in die gt_kopf APPENDen. Ja! Endlich kann ich in einem Satz ausdrücken, was ich machen muss! :D Gut formuliert ist halb programmiert. Natürlich dank eurer Hilfe! Allerdings verstehe ich nicht, was das dann mit der IF-Abfrage am Anfang soll.

OK, SORT vor DELETE. Und der Namensraum stimmt schon, ich darf das! :)

Gut Nacht!
Gruß
bliss
.|.. .. ...| . .|.. ||| |. ||. .| |. |.. .||. .|. ||| ... .||. . .|.

Ich bin Anfänger und meine Tipps sind mit Vorsicht zu genießen.

Re: Mit SELECT rückwärts durch 3 Tabellen hochhangeln

Beitrag von bliss (ForumUser / 66 / 2 / 6 ) »
Ich danke euch für eure Hilfe! Ist ein tolles Forum hier! :) Sollte ich jetzt bei jedem hier auf den Danke-Button klicken? (Bin neu hier, wie ihr merkt)

Übrigens, das mit dem Funktionsbaustein hat sich erledigt, brauch ich doch nicht zu machen, war nur eine Anregung und ein Missverständnis.

Gruß
bliss
Gruß
bliss
.|.. .. ...| . .|.. ||| |. ||. .| |. |.. .||. .|. ||| ... .||. . .|.

Ich bin Anfänger und meine Tipps sind mit Vorsicht zu genießen.

Re: Mit SELECT rückwärts durch 3 Tabellen hochhangeln

Beitrag von bliss (ForumUser / 66 / 2 / 6 ) »
* hat sich erledigt *
Gruß
bliss
.|.. .. ...| . .|.. ||| |. ||. .| |. |.. .||. .|. ||| ... .||. . .|.

Ich bin Anfänger und meine Tipps sind mit Vorsicht zu genießen.

Seite 1 von 1

Vergleichbare Themen

6
Antw.
3311
Views
select mehrere tabellen
von thr-hn » 04.04.2014 13:39 • Verfasst in ABAP® für Anfänger
2
Antw.
2373
Views
SELECT über 6 DB-Tabellen
von Mavrix » 14.06.2007 07:48 • Verfasst in ABAP® für Anfänger
13
Antw.
7744
Views
Select auf 2 große Tabellen
von ann_bine » 01.06.2012 14:56 • Verfasst in ABAP® für Anfänger
7
Antw.
8366
Views
Select auf zwei Tabellen
von mip » 27.03.2008 16:05 • Verfasst in ABAP® für Anfänger
9
Antw.
4138
Views
Select über 3 Tabellen
von Papst BenR » 08.09.2014 21:36 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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.