Verwendung von FOR ALL ENTRIES (2)

Die Verwendung von “FOR ALL ENTRIES” ist wesentlich schneller, als ein entsprechend programmierter LOOP!

Benutzen Sie in Ihren Anwendungen bei einem Select den Zusatz “FOR ALL ENTRIES”! Er ist etwa drei bis fünfmal schneller als ein LOOP!

Das Prinzip von FOR ALL ENTRIES ist das folgende: Anstatt für jeden Eintrag einer Tabelle einen Select auf eine andere Tabelle zu machen, machen Sie einfach einen Select auf die Datenbank-Tabelle und geben die Werte, für die selektiert werden soll, mit.

[notice type=’alert’]Wenn die Tabelle, zu der andere Einträge gelesen werden sollen, leer ist, dann werden alle Einträge der anderen Tabelle gelesen!!![/notice]

[notice type=’info’]Diese Methode versagt bei mehr als 1000 Einträgen! Hier müssen Sie dann doch eine LOOP-Schleife programmieren.[/notice]

Beispiel

TYPES: 
  BEGIN OF ty_struc,
    feld1 type feld1,
  END OF ty_struc.
DATA t_tab TYPE STANDARD TABLE OF ty_struc.
DATA l_tab LIKE LINE OF t_tab.

*** Tabelle füllen ***
  t_tab füllen...

*** Langsame Variante ***
LOOP AT t_tab INTO l_tab.
  SELECT * FROM <db> WHERE feld1 = l_tab-feld1.
ENDLOOP.

*** Schnelle Variante ***
CHECK NOT t_tab is initial.
SELECT * FROM <db> FOR ALL ENTRIES IN t_tab
 WHERE feld1 = t_tab-feld1.

Alternative zu FOR ALL ENTRIES

FOR ALL ENTRIES wird häufig dann angewendet, wenn zu einer vorhandenen internen Tabelle abhängige Einträge gelesen werden müssen. Dieses Vorgehen erspart es einem, die notwendigen Felder in eine RANGES-Tabelle übertragen zu müssen. In folgenden Fällen kommt man an FOR ALL ENTRIES nicht vorbei:

  1. Die Anzahl der Einträge in der RANGES-Tabelle ist so groß, dass die RANGES-Tabelle die von der Datenbank zulässige Größe (häufig 64KB) übersteigt
  2. Du willst eine Abhängigkeit zwischen zwei oder mehr Feldern berücksichtigen, was mit RANGES nicht funktioniert.

Erklärung zu 2.:

Du hast in einer Tabelle bereits alle Belegnummern mit EINER entsprechenden Positionsnummer ermittelt und möchtest nun nur diese Belegpositionen lesen. Mit zwei RANGES-Tabellen hättest du die Belegnummern in einer und die Positionsnummern in einer anderen RANGES-Tabelle. Diese beiden Tabellen können in der WHERE-Bedingung nur mit AND oder OR verknüpft werden. Beides führt nicht zum Ziel. Richtig ist es hier, FOR ALL ENTRIES zu verwenden, denn nun kann genau je BELEGNUMMER UND BELEGPOSITION selektiert werden.

SELECT * FROM vbap FOR ALL ENTRIES IN t_tab
 WHERE vbeln = t_tab-vbeln
   AND posnr = t_tab-posnr.
Enno Wulff