hi!
Alternativ, wenn du alle Vergleiche aus deiner internen Tabelle mit der Datenbank und "ist gleich" stattfinden sollen, gibt es eine performantere Lösung als IN:
FOR ALL ENTRIES.
Code: Alles auswählen.
SELECT *
FROM ...
FOR ALL ENTRIES IN lt_ag
WHERE ... EQ lt_ag-table_line.
Wichtig hierbei ist, dass keine Zeile in "lt_ag" doppelt vorkommen sollte.
"table_line" ist bietet den Zugriff auf die gesamte Zeile einer internen Tabelle z.B. wenn man die Struktur nicht kennt bzw. wenn es keine Strukturfelder gibt.
Wenn du wirklich lieber eine Range (IN-Operator) verwenden möchstest:
Code: Alles auswählen.
LOOP AT lt_ag ASSIGNING <ls_ag>.
APPEND INITIAL LINE TO lt_range ASSIGNING <ls_range>.
<ls_range>-sign = 'I'. "Include oder Exclude
<ls_range>-operator = 'EQ'.
<ls_range>-low = <ls_ag>.
ENDLOOP.
Wobei ich aber bei großen internen Tabellen davon abraten würde ein IN zu verwenden, weil damit uU die Größenbeschränkung (ca. 1 - 2 MB) für eine Datenbankquery überschritten werden könnte, da aus jeder Zeile im Range eine entsprechende WHERE Bedingung auf der DB-Schnittstelle generiert wird.
Im Vergleich dazu wird bei FOR ALL ENTRIES die Verarbeitung in mehrere Blöcke zu ca. 5 - 10 Zeilen der internen Tabelle aufgeteilt. Deswegen ist es auch wichtig, dass keine Zeile doppelt vorkommt, weil damit auch das Ergebnis verdoppelt wird. Es werden zwar die Zeilen nach der Durchführung der DB-Abfrage am Appl.Server vor der Weiterverarbeitung wieder zusammengeführt und verdichtet, aber in der Zwischenzeit wird trotzdem der Speicher unnötig belegt und auch die DB unnötig belastet.
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