Code: Alles auswählen.
SELECT *
FROM vbak
INTO TABLE lt_vbak.
LOOP AT lt_vbak INTO ls_vbak.
SELECT FROM vbap INTO TABLE lt_vbap WHERE vbeln EQ ls_vbak-vbeln.
...
CALL FUNCTION 'X'
EXPORTING
TABLES
position = lt_vbap
EXCEPTIONS.
...
ENDLOOP.
Code: Alles auswählen.
SELECT *
FROM vbak
INTO TABLE lt_vbak.
SELECT *
FROM vbap
INTO TABLE lt_vbap
FOR ALL ENTRIES IN lt_vbak.
LOOP AT lt_vbak INTO ls_vbak.
...
CALL FUNCTION 'X'
EXPORTING
TABLES
position = lt_vbap
EXCEPTIONS.
...
ENDLOOP.
Code: Alles auswählen.
SELECT *
FROM vbak
INTO TABLE lt_vbak.
SELECT *
FROM vbap
INTO TABLE lt_vbap
FOR ALL ENTRIES IN lt_vbak.
LOOP AT lt_vbak INTO ls_vbak.
lt_vbap_neu = lt_vbap.
DELETE lt_vbap_neu WHERE vbeln NE lt_vbak-vbeln.
...
CALL FUNCTION 'X'
EXPORTING
TABLES
position = lt_vbap_neu
EXCEPTIONS.
...
ENDLOOP.
Hi Lausek,lausek hat geschrieben:Also ich weiß nicht, wie viele Einträge insgesamt rausgelesen werden, aber deine Variante im Loop sieht wirklich nicht ganz so gut aus. Das liegt aber hauptsächlich daran, dass du in jedem Durchlauf eine Tabelle kopierst und dann mit DELETE nochmal über die (wahrscheinlich) unsortierte Kopie drüber musst.
Das vereinfachte Problem, das du schilderst, sieht für mich sehr nach JOIN aus. Geht es denn damit nicht in einem Select? Man sollte hier beachten, dass der Transport überflüssiger Daten von DB nach Applikationsserver die Performance auch nach oben treiben kann.
Außerdem könntest du dir mal LOOP AT ... GROUP BY anschauen. Das ist auch eine neuere Funktion für Schleifen und gibt dir die Möglichkeit, die große, äußere Tabelle in kleinen Gruppen zu durchlaufen.
Kleine Anmerkung noch: es ist immer ratsam eine IF ... IS NOT INITIAL-Abfrage um Selects mit FOR ALL ENTRIES zu machen, da bei leerer Tabelle einfach alles geladen wird. Nicht gut ^^
schick hat geschrieben:
Spontan kommt mir sowas als Option in den Sinn, ich bin mir aber nicht sicher, ob das wirklich performanter ist... (sonderlich "elegant" ist es ohnehin nicht):
Ich freue mich über Anregungen!Code: Alles auswählen.
SELECT * FROM vbak INTO TABLE lt_vbak. SELECT * FROM vbap INTO TABLE lt_vbap FOR ALL ENTRIES IN lt_vbak. LOOP AT lt_vbak INTO ls_vbak. lt_vbap_neu = lt_vbap. DELETE lt_vbap_neu WHERE vbeln NE lt_vbak-vbeln. ... CALL FUNCTION 'X' EXPORTING TABLES position = lt_vbap_neu EXCEPTIONS. ... ENDLOOP.
Randbemerkung:
Sowohl "SELECT *" als auch die "tollen" Bezeichner ala "lt_vbak" sind nur hier als Platzhalter, im richtigen Programm ist das anders gelöst...
Edit:
Releasestand ist übrigens 7.4