Interne Tabellen (ABAP): Unterschied zwischen den Versionen

Aus MattWiki
Keine Bearbeitungszusammenfassung
 
(36 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
Interne Tabellen sind Tabellen, die im Hauptspeicher gehalten werden. Im Gegensatz dazu werden Datenbanktabellen im Datenbanksystem abgelegt.
Interne Tabellen sind Tabellen, die im Hauptspeicher gehalten werden. Im Gegensatz dazu werden Datenbanktabellen im Datenbanksystem abgelegt.


== Strukturtyp definieren ==
Für die nachfolgenden Beispiele sei die folgende Struktur gegeben. Diese könnte auch im Dictionary definiert sein.<syntaxhighlight lang="abap">
" Struktur für Buch
TYPES: BEGIN OF lst_buch,
        buch_titel type string,
        autor      type string,
        verlag    type string,
        anz_seiten type int4,
      END OF lst_buch.
</syntaxhighlight>
== Aufbau von internen Tabellen ==
Interne Tabellen benötigen einen Tabellentyp. Ein Tabellentyp kann per Code oder im Dictionary definiert werden. Er definiert:
Interne Tabellen benötigen einen Tabellentyp. Ein Tabellentyp kann per Code oder im Dictionary definiert werden. Er definiert:
* '''Tabellenart:''' z. B. STANDARD
* '''Zeilentyp''', z. B. ein Strukturtyp
* '''Zeilentyp'''
* '''Tabellenart,''' z. B. STANDARD
* '''Schlüsseldefinition:''' z. B. WITH NON_UNIQUE DEFAULT KEY
* '''Schlüsseldefinition:''' z. B. WITH NON_UNIQUE DEFAULT KEY


== Tabellenarten ==
=== Tabellenarten ===
{| class="wikitable"
{| class="wikitable"
!Typ
!Typ
! colspan="3" |Any
! colspan="3" |ANY*
|-
|-
|'''Generisch'''
|'''Generisch'''
| colspan="2" |'''Index Table'''
| colspan="2" |'''INDEX TABLE*'''
|'''Hashed Table'''
|'''Hashed Table'''
|-
|-
Zeile 34: Zeile 45:
|UNIQUE oder NON-UNIQUE
|UNIQUE oder NON-UNIQUE
|UNIQUE
|UNIQUE
|-
|'''Bemerkung'''
|Schlüssel kann, aber muss nicht eindeutig sein.
|Schlüssel kann und muss eindeutig sein.
|Schlüssel muss eindeutig sein.
|}
|}
<nowiki>*</nowiki>) ANY und INDEX TABLE können als Typisierung für Schnittstellen von Methode, Funktionsbausteinen etc. verwendet werden.
<nowiki>*</nowiki>) Bei HASHED TABLE wird aus dem Schlüsselwert ein Hash-Key berechnet, der die Startadresse des Tabelleneintrags repräsentiert (und in der Hash-Tabelle gespechert wird?).
Beispiel für explizite Definition:<syntaxhighlight lang="abap">
" Tabellentyp für sortierte Tabelle
TYPES: ltt_buchregal_sortiert TYPE SORTED TABLE OF lst_buch
      WITH NON-UNIQUE DEFAULT KEY.
" Tabellentyp für hashed Tabelle
TYPES: ltt_buchregal_hashed TYPE HASHED TABLE OF lst_buch
      WITH UNIQUE DEFAULT KEY.
</syntaxhighlight>
=== Schlüsseldefinition ===
Der Standardschlüssel <code>DEFAULT KEY</code> umfasst alle nicht numerischen Felder des Strukturtyps.
Beispiel für explizite Definition:
<syntaxhighlight lang="abap">
" Tabellentyp für sortierte Tabelle mit Schlüsselfeld anz_seiten
TYPES: ltt_buchregal_sortiert TYPE SORTED TABLE OF lst_buch
      WITH NON-UNIQUE KEY anz_seiten.


== Definition einer internen Tabelle ==
" Tabellentyp für sortierte Tabelle mit zusammengesetztem Primärschlüssel
Der für die interne Tabelle benötigte Tabellentyp kann im Dictionary oder im ABAP Code definiert werden.Beispiele für Definition in ABAP:
" Keine Kommas zwischen den Schlüsselkomponenten
" (nachfolgende Definition ungetestet)
TYPES: ltt_buchregal_sortiert TYPE SORTED TABLE OF lst_buch
      WITH UNIQUE KEY buch_titel autor verlag
      WITH NON-UNIQUE KEY userkey1 COMPONENTS autor anz_seiten.
</syntaxhighlight>


Implizite Definition:<syntaxhighlight lang="abap">
Wichtig sind folgende Einschänkungen zur Schlüsseleindeutigkeit:
DATA: gt_buchregal TYPE TABLE OF gst_buch
{| class="wikitable"
</syntaxhighlight>Explizite Definition:<syntaxhighlight lang="abap">
!Tabellenart
TYPES: BEGIN OF gst_buch,
!Schlüsseleindeutigkeit
        buch_titel type string,
!Beschreibung
        anz_seiten type int4,
|-
      END OF gst_buch.
|STANDARD
|NON-UNIQUE
|Kann mehrere Einträge mit identischen Schlüsselwerten enthalten
|-
|SORTED
|UNIQUE und NON-UNIQUE
|Eindeutigkeit der Schlüsselwerte ist optional
|-
|HASHED
|UNIQUE
|Einträge müssen eindeutige Schlüsselwerte tragen
|}


TYPES: gtt_buchregal TYPE STANDARD TABLE OF gst_buch
== Erstellen von internen Tabellen ==
Beispiel für implizite Definition einer internen Tabells aus einer Struktur:<syntaxhighlight lang="abap">
DATA: lt_buchregal TYPE TABLE OF lst_buch
</syntaxhighlight>Beispiele für explizite Definition eines Tabellentyps und anschließende definition einer internen Tabelle. Der Tabellentyp könnte auch im Dictionary definiert werden:<syntaxhighlight lang="abap">
" Tabellentyp für Standard-Tabelle
TYPES: ltt_buchregal TYPE STANDARD TABLE OF lst_buch  " Definition lst_buch siehe oben
       WITH NON-UNIQUE DEFAULT KEY.
       WITH NON-UNIQUE DEFAULT KEY.


DATA: gt_buchregal TYPE gtt_buchregal
DATA: lt_buchregal TYPE ltt_buchregal.
</syntaxhighlight>Dabei könnte die Struktur <code>gst_buch</code>und der Tabellentyp <code>gtt_buchregal</code> auch im Dictionary definiert werden.
</syntaxhighlight>Für die Bearbeitung einer internen Tabelle wird eine Arbeitsstruktur, manchmal auch als Workarea bezeichnet, benötigt.
 
Eine Arbeitsstruktur kann mittels LIKE LINE OF auf Basis einer internen Tabelle erstellt werden:
 
<syntaxhighlight lang="abap">
" Definition einer internen Tabelle auf Basis eines Tabellentyps
DATA: lt_biblio TYPE ltt_biblio.
 
" Erstellung einer passenden Struktur
DATA: ls_biblio LIKE LINE OF lt_biblio. 
</syntaxhighlight>Alternativ kann eine Struktur auf Basis einer Datenbanktabelle (transparenten Tabelle) mit TYPE erstellt werden:<syntaxhighlight lang="abap">
" Erstellen einer Struktur auf Basis der Datenbanktabelle zbiblio
DATA: ls_biblio TYPE zbiblio.
 
" Allgemeine Formulierung
DATA: <wa> TYPE <dbtab>
</syntaxhighlight>Eine interne Tabelle kann mit TYPE TABLE OF auf Basis einer Datenbanktabelle erstellt werden:<syntaxhighlight lang="abap">
" Interne Tabelle auf Basis transp. Tabelle
DATA: lt_cust TYPE TABLE OF zcust.
</syntaxhighlight>Andere Möglichkeit eine interne Tabelle auf Basis einer Datenbanktabelle anzulegen ist LIKE:<syntaxhighlight lang="abap">
" Gegeben ist, dass /BIC/AZNWVKDAT00 eine transparente Tabelle eines DSOs ist
DATA: lt_data LIKE TABLE OF /BIC/AZNWVKDAT00. 
</syntaxhighlight>
 
Erstellen einer internen Tabelle, die ABAP-Objekte enthält:
<syntaxhighlight lang="abap">
" Zunächst wird eine Referenzvariable für die Klasse gebildet:
DATA: lr_vehicle TYPE REF TO zcl_vehicle_mo.
 
" Aus der Referenz wird die interne Tabelle gebildet:
DATA: lt_vehicle LIKE TABLE OF lr_vehicle.
</syntaxhighlight>
 
Weitere Beispiele siehe [[Field-Symbols (ABAP)]] und [[Dynamische Programmierung (ABAP)]]
 
== Lesen von Daten ==
 
=== Gesamte interne Tabelle lesen ===
'''Früher:''' Interne Tabellen wurden mit Kopfzeilen angelegt (Stichwort ABAP-Anweisung OCCURS).
 
Das heißt, die Kopfzeile ist die Arbeitsstruktur in die die Daten der Tabelle geschrieben werden.
 
Diese Arbeitsstruktur ist namensgleich mit dem Tabellenkorpus. Damit war eine verkürzte Notation möglich:<syntaxhighlight lang="abap">
" Verkürzte Notation
LOOP AT <itab>.
  " Code
ENDLOOP.
</syntaxhighlight>'''Empfehlung heute:''' Interne Tabellen ohne Kopfzeilen anlegen. Damit ist der Weg für optimierten Zugriff auf die Tabelleninhalte frei.<syntaxhighlight lang="abap">
" Lange Notation
LOOP AT <itab> INTO <wa>.
  " Code
ENDLOOP.
</syntaxhighlight>
 
Datensätze nach bestimmten Gruppen durchlaufen:
 
<syntaxhighlight lang="abap">
SORT itab.
 
LOOP AT itab ASSIGNING <wa>
  GROUP BY ( key1 = <wa>-field1 ).
 
  " Code
ENDLOOP.
</syntaxhighlight>
 
=== Einzelne Datensätze lesen ===
Ersten Datensatz aus interner Tabelle lesen (egal, mit welchem Schlüssel):
 
<syntaxhighlight lang="abap">
READ TABLE <itab> INDEX 1 INTO <wa>.
</syntaxhighlight>
 
Einzelne Datensätze aus interner Tabelle in eine Arbeitsstruktur lesen:
<syntaxhighlight lang="abap">
READ TABLE <itab> INTO <wa> WITH [TABLE] KEY <s1> = <f1>.
</syntaxhighlight>
 
Für mehrere Sätze besser einen LOOP über die interne Tabelle erstellen.
 
Weitere Hinweise:
 
<syntaxhighlight lang="abap">
SELECT SINGLE
</syntaxhighlight>
 
<syntaxhighlight lang="abap">
SELECT UP TO 1 ROWS
</syntaxhighlight>
 
Weitere Quellen:
https://blogs.sap.com/2016/06/11/select-single-vs-select-up-to-1-rows/
https://blogs.sap.com/2015/03/11/selecting-one-line-from-an-database-table/
 
== Einfügen / Schreiben von Daten ==
Datensätze können in interne Tabellen mit '''INSERT''' oder '''APPEND''' geschrieben werden.<syntaxhighlight lang="abap">
" Anhängen von Daten am Ende der internen Tabelle
APPEND <wa> TO <itab>
</syntaxhighlight>Bei SORTED- oder HASHED-Tabellen kann auch INSERT verwendet werden:<syntaxhighlight lang="abap">
INSERT <wa> INTO TABLE <itab>
</syntaxhighlight>Abhängig von Tabellenart passiert bei INSERT jedoch etwas anderes:
{| class="wikitable"
!Tabellenart
!Erläuterung
|-
|'''STANDARD'''
|Datensatz wird angehängt
|-
|'''SORTED'''
|Datensatz wird laut Schlüsselfeldern sortiert eingefügt
|-
|'''HASHED'''
|Datensatz wird laut schlüssel eingefügt, jedoch nicht sortiert
|}
 
== Löschen ==
 
=== Grundform ===
 
<syntaxhighlight lang="abap">
DELETE itab WHERE field1 = value1.
</syntaxhighlight>
 
=== Löschen mit SELECT-OPTIONS ===
 
<syntaxhighlight lang="abap">
LOOP AT itab1 ASSIGNING <struct1>.
  ls_range-sign = 'I'.
  ls_range-opt = 'EQ'.
  ls_range-low = <struct1>-field1.
  ls_range-high = ''.
  APPEND ls_range TO lt_range.
ENDLOOP.
 
DELETE itab
  WHERE field1 NOT IN lt_range.
</syntaxhighlight>
 
=== Duplikate löschen ===
 
<syntaxhighlight lang="abap">
DELETE ADJACENT DUPLICATES FROM itab.
</syntaxhighlight>
 
'''Hinweis:''' Abhängig von Tabellentyp muss die Tabelle ggf. vorher umsortiert werden, damit die zu löschenden Datensätze hintereinander liegen.
 
 
== Kopieren ==
Kopieren von Inhalten einer internen Tabelle in eine andere interne Tabelle, wobei beide einige unterschiedliche Felder haben können:
 
<syntaxhighlight lang="abap">
LOOP AT lt_vkdat INTO ls_vkdat.
  " MOVE-CORRESPONDING ermöglicht es Feldinhalte von Strukturen zu kopieren,
  " wenn nur eine Teilmenge der Felder in  Quell- und Zielstruktur gleich sind
  MOVE-CORRESPONDING ls_vkdat TO ls_vkdat_res.
  ls_vkdat_res-p10_custno = ls_vkdat-customer.
  ls_vkdat_res-amount = ls_vkdat-amount + 2000.
  APPEND ls_vkdat_res TO lt_vkdat_res.
ENDLOOP.
</syntaxhighlight>
 
Wenn eine gesamte interne Tabelle kopiert werden soll in eine andere interne Tabelle, dann geht dies für die Felder, die in beiden Tabellen vorhanden sind folgendermaßen:
 
<syntaxhighlight lang="abap">
MOVE-CORRESPONDING gt_from_tab1 TO gt_to_tab2.
</syntaxhighlight>
 
Kopieren von Inhalten von einer internen Tabelle in eine andere interne Tabelle mit einem Loop für Zuordnung einzelner Felder in der Inline-Deklaration (verfügbar ab ca. 7.40):
 
<syntaxhighlight lang="abap">
lt_itab2 = VALUE ltt_itab1( FOR i = 1 THEN i + 1 UNTIL i > lines( lt_itab1 )
                                      (
                                      field1 = lt_itab1[ i ]-field1
                                      ) ).
</syntaxhighlight>
 
== Sortieren ==
Interne Tabellen können sortiert werden:<syntaxhighlight lang="abap">
SORT <itab> BY <spalte> [ASCENDING|DESCENDING]
</syntaxhighlight>Dies passiert auf dem Applikationsserver.
 
== Leeren von internen Tabellen ==
CLEAR initialisiert interne Tabellen ohne den Speicher frei zu geben:<syntaxhighlight lang="abap">
" Leeren der Tabelle und der Arbeitsstruktur
CLEAR lt_itab.
CLEAR ls_itab.
 
" Optional in einem Kettensatz
CLEAR: lt_itab, ls_itab.
</syntaxhighlight>FREE gibt den von der Tabelle beanspruchten Speicher frei:<syntaxhighlight lang="abap">
FREE: lt_itab, ls_itab.
</syntaxhighlight>Wenn die Tabelle nach einem FREE erneut angesprochen wird, wird der Speicher wieder reserviert, was Performance kostet.
 
== Übergabe an Funktionsbausteine ==
Funktionsbausteine benötigen für das entgegen Nehmen von internen Tabellen einen Tabellentyp.
 
Dieser wird im Dictionary definiert.
 
Wenn eine interne Tabelle auf Basis einer Datenbanktabelle erstellt wurde, muss ein entsprechender Tabellentyp im Dictionary definiert werden, der als Zeilentyp die Datenbanktabelle entählt.
 
'''Ungetestet:''' Alternativ kann der Parameter im Funktionsbaustein den TYPE "like dbtab" erhalten. Dieses Vorgehen ist jedoch ungetestet.


[[Kategorie:SAP]]
[[Category:ABAP]]
[[Kategorie:ABAP]]

Aktuelle Version vom 8. April 2020, 16:11 Uhr

Interne Tabellen sind Tabellen, die im Hauptspeicher gehalten werden. Im Gegensatz dazu werden Datenbanktabellen im Datenbanksystem abgelegt.

Strukturtyp definieren

Für die nachfolgenden Beispiele sei die folgende Struktur gegeben. Diese könnte auch im Dictionary definiert sein.

" Struktur für Buch
TYPES: BEGIN OF lst_buch,
         buch_titel type string,
         autor      type string,
         verlag     type string,
         anz_seiten type int4,
       END OF lst_buch.

Aufbau von internen Tabellen

Interne Tabellen benötigen einen Tabellentyp. Ein Tabellentyp kann per Code oder im Dictionary definiert werden. Er definiert:

  • Zeilentyp, z. B. ein Strukturtyp
  • Tabellenart, z. B. STANDARD
  • Schlüsseldefinition: z. B. WITH NON_UNIQUE DEFAULT KEY

Tabellenarten

Typ ANY*
Generisch INDEX TABLE* Hashed Table
Tabellenart STANDARD TABLE SORTED TABLE HASHED TABLE
Indexzugriff Ja Ja Nein
Schlüsselzugriff Ja Ja Ja
Schlüsseleindeutigkeit NON-UNIQUE UNIQUE oder NON-UNIQUE UNIQUE
Bemerkung Schlüssel kann, aber muss nicht eindeutig sein. Schlüssel kann und muss eindeutig sein. Schlüssel muss eindeutig sein.

*) ANY und INDEX TABLE können als Typisierung für Schnittstellen von Methode, Funktionsbausteinen etc. verwendet werden.

*) Bei HASHED TABLE wird aus dem Schlüsselwert ein Hash-Key berechnet, der die Startadresse des Tabelleneintrags repräsentiert (und in der Hash-Tabelle gespechert wird?).

Beispiel für explizite Definition:

" Tabellentyp für sortierte Tabelle
TYPES: ltt_buchregal_sortiert TYPE SORTED TABLE OF lst_buch
       WITH NON-UNIQUE DEFAULT KEY.

" Tabellentyp für hashed Tabelle
TYPES: ltt_buchregal_hashed TYPE HASHED TABLE OF lst_buch
       WITH UNIQUE DEFAULT KEY.

Schlüsseldefinition

Der Standardschlüssel DEFAULT KEY umfasst alle nicht numerischen Felder des Strukturtyps.

Beispiel für explizite Definition:

" Tabellentyp für sortierte Tabelle mit Schlüsselfeld anz_seiten
TYPES: ltt_buchregal_sortiert TYPE SORTED TABLE OF lst_buch
       WITH NON-UNIQUE KEY anz_seiten.

" Tabellentyp für sortierte Tabelle mit zusammengesetztem Primärschlüssel
" Keine Kommas zwischen den Schlüsselkomponenten
" (nachfolgende Definition ungetestet)
TYPES: ltt_buchregal_sortiert TYPE SORTED TABLE OF lst_buch
       WITH UNIQUE KEY buch_titel autor verlag
       WITH NON-UNIQUE KEY userkey1 COMPONENTS autor anz_seiten.

Wichtig sind folgende Einschänkungen zur Schlüsseleindeutigkeit:

Tabellenart Schlüsseleindeutigkeit Beschreibung
STANDARD NON-UNIQUE Kann mehrere Einträge mit identischen Schlüsselwerten enthalten
SORTED UNIQUE und NON-UNIQUE Eindeutigkeit der Schlüsselwerte ist optional
HASHED UNIQUE Einträge müssen eindeutige Schlüsselwerte tragen

Erstellen von internen Tabellen

Beispiel für implizite Definition einer internen Tabells aus einer Struktur:

DATA: lt_buchregal TYPE TABLE OF lst_buch

Beispiele für explizite Definition eines Tabellentyps und anschließende definition einer internen Tabelle. Der Tabellentyp könnte auch im Dictionary definiert werden:

" Tabellentyp für Standard-Tabelle
TYPES: ltt_buchregal TYPE STANDARD TABLE OF lst_buch   " Definition lst_buch siehe oben
       WITH NON-UNIQUE DEFAULT KEY.

DATA: lt_buchregal TYPE ltt_buchregal.

Für die Bearbeitung einer internen Tabelle wird eine Arbeitsstruktur, manchmal auch als Workarea bezeichnet, benötigt.

Eine Arbeitsstruktur kann mittels LIKE LINE OF auf Basis einer internen Tabelle erstellt werden:

" Definition einer internen Tabelle auf Basis eines Tabellentyps
DATA: lt_biblio TYPE ltt_biblio.

" Erstellung einer passenden Struktur
DATA: ls_biblio LIKE LINE OF lt_biblio.

Alternativ kann eine Struktur auf Basis einer Datenbanktabelle (transparenten Tabelle) mit TYPE erstellt werden:

" Erstellen einer Struktur auf Basis der Datenbanktabelle zbiblio
DATA: ls_biblio TYPE zbiblio.

" Allgemeine Formulierung
DATA: <wa> TYPE <dbtab>

Eine interne Tabelle kann mit TYPE TABLE OF auf Basis einer Datenbanktabelle erstellt werden:

" Interne Tabelle auf Basis transp. Tabelle
DATA: lt_cust TYPE TABLE OF zcust.

Andere Möglichkeit eine interne Tabelle auf Basis einer Datenbanktabelle anzulegen ist LIKE:

" Gegeben ist, dass /BIC/AZNWVKDAT00 eine transparente Tabelle eines DSOs ist
DATA: lt_data LIKE TABLE OF /BIC/AZNWVKDAT00.

Erstellen einer internen Tabelle, die ABAP-Objekte enthält:

" Zunächst wird eine Referenzvariable für die Klasse gebildet:
DATA: lr_vehicle TYPE REF TO zcl_vehicle_mo.

" Aus der Referenz wird die interne Tabelle gebildet:
DATA: lt_vehicle LIKE TABLE OF lr_vehicle.

Weitere Beispiele siehe Field-Symbols (ABAP) und Dynamische Programmierung (ABAP)

Lesen von Daten

Gesamte interne Tabelle lesen

Früher: Interne Tabellen wurden mit Kopfzeilen angelegt (Stichwort ABAP-Anweisung OCCURS).

Das heißt, die Kopfzeile ist die Arbeitsstruktur in die die Daten der Tabelle geschrieben werden.

Diese Arbeitsstruktur ist namensgleich mit dem Tabellenkorpus. Damit war eine verkürzte Notation möglich:

" Verkürzte Notation
LOOP AT <itab>.
  " Code
ENDLOOP.

Empfehlung heute: Interne Tabellen ohne Kopfzeilen anlegen. Damit ist der Weg für optimierten Zugriff auf die Tabelleninhalte frei.

" Lange Notation
LOOP AT <itab> INTO <wa>.
  " Code
ENDLOOP.

Datensätze nach bestimmten Gruppen durchlaufen:

SORT itab.

LOOP AT itab ASSIGNING <wa>
  GROUP BY ( key1 = <wa>-field1 ).

  " Code
ENDLOOP.

Einzelne Datensätze lesen

Ersten Datensatz aus interner Tabelle lesen (egal, mit welchem Schlüssel):

READ TABLE <itab> INDEX 1 INTO <wa>.

Einzelne Datensätze aus interner Tabelle in eine Arbeitsstruktur lesen:

READ TABLE <itab> INTO <wa> WITH [TABLE] KEY <s1> = <f1>.

Für mehrere Sätze besser einen LOOP über die interne Tabelle erstellen.

Weitere Hinweise:

SELECT SINGLE
SELECT UP TO 1 ROWS

Weitere Quellen: https://blogs.sap.com/2016/06/11/select-single-vs-select-up-to-1-rows/ https://blogs.sap.com/2015/03/11/selecting-one-line-from-an-database-table/

Einfügen / Schreiben von Daten

Datensätze können in interne Tabellen mit INSERT oder APPEND geschrieben werden.

" Anhängen von Daten am Ende der internen Tabelle
APPEND <wa> TO <itab>

Bei SORTED- oder HASHED-Tabellen kann auch INSERT verwendet werden:

INSERT <wa> INTO TABLE <itab>

Abhängig von Tabellenart passiert bei INSERT jedoch etwas anderes:

Tabellenart Erläuterung
STANDARD Datensatz wird angehängt
SORTED Datensatz wird laut Schlüsselfeldern sortiert eingefügt
HASHED Datensatz wird laut schlüssel eingefügt, jedoch nicht sortiert

Löschen

Grundform

DELETE itab WHERE field1 = value1.

Löschen mit SELECT-OPTIONS

LOOP AT itab1 ASSIGNING <struct1>.
  ls_range-sign = 'I'.
  ls_range-opt = 'EQ'.
  ls_range-low = <struct1>-field1.
  ls_range-high = ''.
  APPEND ls_range TO lt_range.
ENDLOOP.

DELETE itab
  WHERE field1 NOT IN lt_range.

Duplikate löschen

DELETE ADJACENT DUPLICATES FROM itab.

Hinweis: Abhängig von Tabellentyp muss die Tabelle ggf. vorher umsortiert werden, damit die zu löschenden Datensätze hintereinander liegen.


Kopieren

Kopieren von Inhalten einer internen Tabelle in eine andere interne Tabelle, wobei beide einige unterschiedliche Felder haben können:

LOOP AT lt_vkdat INTO ls_vkdat.
  " MOVE-CORRESPONDING ermöglicht es Feldinhalte von Strukturen zu kopieren, 
  " wenn nur eine Teilmenge der Felder in  Quell- und Zielstruktur gleich sind
  MOVE-CORRESPONDING ls_vkdat TO ls_vkdat_res.
  ls_vkdat_res-p10_custno = ls_vkdat-customer.
  ls_vkdat_res-amount = ls_vkdat-amount + 2000.
  APPEND ls_vkdat_res TO lt_vkdat_res.
ENDLOOP.

Wenn eine gesamte interne Tabelle kopiert werden soll in eine andere interne Tabelle, dann geht dies für die Felder, die in beiden Tabellen vorhanden sind folgendermaßen:

MOVE-CORRESPONDING gt_from_tab1 TO gt_to_tab2.

Kopieren von Inhalten von einer internen Tabelle in eine andere interne Tabelle mit einem Loop für Zuordnung einzelner Felder in der Inline-Deklaration (verfügbar ab ca. 7.40):

lt_itab2 = VALUE ltt_itab1( FOR i = 1 THEN i + 1 UNTIL i > lines( lt_itab1 )
                                      (
                                      field1 = lt_itab1[ i ]-field1
                                      ) ).

Sortieren

Interne Tabellen können sortiert werden:

SORT <itab> BY <spalte> [ASCENDING|DESCENDING]

Dies passiert auf dem Applikationsserver.

Leeren von internen Tabellen

CLEAR initialisiert interne Tabellen ohne den Speicher frei zu geben:

" Leeren der Tabelle und der Arbeitsstruktur
CLEAR lt_itab.
CLEAR ls_itab.

" Optional in einem Kettensatz
CLEAR: lt_itab, ls_itab.

FREE gibt den von der Tabelle beanspruchten Speicher frei:

FREE: lt_itab, ls_itab.

Wenn die Tabelle nach einem FREE erneut angesprochen wird, wird der Speicher wieder reserviert, was Performance kostet.

Übergabe an Funktionsbausteine

Funktionsbausteine benötigen für das entgegen Nehmen von internen Tabellen einen Tabellentyp.

Dieser wird im Dictionary definiert.

Wenn eine interne Tabelle auf Basis einer Datenbanktabelle erstellt wurde, muss ein entsprechender Tabellentyp im Dictionary definiert werden, der als Zeilentyp die Datenbanktabelle entählt.

Ungetestet: Alternativ kann der Parameter im Funktionsbaustein den TYPE "like dbtab" erhalten. Dieses Vorgehen ist jedoch ungetestet.