Rheinwerk < openbook > SAP-Wissen aus erster Hand
SAP-Wissen aus erster Hand.
 
Inhaltsverzeichnis
Vorwort zur vierten Auflage
1 ABAP und die ersten Schritte im SAP-System
2 ABAP Dictionary
3 Programmieren im ABAP Editor
4 Felder und Berechnungen
5 Modifikation von Zeichenketten
6 Debugging von Programmen
7 Modifikation von transparenten Datenbanktabellen
8 Rechnen mit Datum und Zeit, Mengen und Währungen
9 Mit Daten in einer Datenbanktabelle arbeiten
10 Programmablaufsteuerung und logische Ausdrücke
11 Selektionsbildschirme
12 Interne Tabellen
13 Modularisierung von Programmen
14 Weiterführende Themen
A Icons auf einen Blick
B Abkürzungsverzeichnis
C Die Autoren
Stichwortverzeichnis

Download:
- Beispielprogramme, ca. 23 KB

Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Einstieg in ABAP von Karl-Heinz Kühnhauser, Thorsten Franz
Buch: Einstieg in ABAP

Einstieg in ABAP
Pfeil 12 Interne Tabellen
Pfeil 12.1 Sinn und Zweck interner Tabellen
Pfeil 12.2 Aufbau und Arten von internen Tabellen
Pfeil 12.3 Interne Standardtabelle anlegen
Pfeil 12.3.1 Objektorientierte Schreibweise mit Workarea
Pfeil 12.3.2 Obsolete Schreibweise mit Kopfzeile
Pfeil 12.4 Interne Standardtabelle füllen
Pfeil 12.4.1 Interne Tabelle mit Workarea füllen
Pfeil 12.4.2 Interne Tabelle mit Kopfzeile füllen
Pfeil 12.5 Interne Tabelle zeilenweise verarbeiten
Pfeil 12.5.1 Interne Tabelle mit Workarea verarbeiten
Pfeil 12.5.2 Interne Tabelle mit Kopfzeile verarbeiten
Pfeil 12.6 Inhalte von internen Tabellen löschen
Pfeil 12.6.1 Workareas und interne Tabellen mit Workarea löschen
Pfeil 12.6.2 Interne Tabellen mit Kopfzeile löschen
Pfeil 12.7 Codebeispiel zu ITAB mit Workarea
Pfeil 12.8 Codebeispiel zu ITAB mit Kopfzeile
 
Zum Seitenanfang

12.5    Interne Tabelle zeilenweise verarbeiten Zur vorigen ÜberschriftZur nächsten Überschrift

Um die zeilenweise Verarbeitung von internen Tabellen zu zeigen, verarbeiten wir wieder zunächst eine interne Tabelle mit Workarea.

 
Zum Seitenanfang

12.5.1    Interne Tabelle mit Workarea verarbeiten Zur vorigen ÜberschriftZur nächsten Überschrift

Wie bei Datenbanktabellen können Sie auch bei internen Tabellen über eine Schleife alle Zeilen nacheinander oder gezielt einzelne Zeilen verarbeiten. Sie verwenden allerdings in diesem Zusammenhang bei Datenbanktabellen und internen Tabellen unterschiedliche Anweisungen.

Um alle Sätze einer internen Tabelle in einer Schleife zu verarbeiten, verwenden Sie die Anweisungen LOOP und ENDLOOP. Bei diesen Anweisungen handelt es sich um eine Struktur, vergleichbar mit der Struktur von SELECT und ENDSELECT. Mit der Anweisung LOOP wird die Struktur eröffnet, mit der Anweisung ENDLOOP wird die Struktur wieder geschlossen. Dazwischen stehen die Anweisungen, wie eine Zeile zu verarbeiten ist.

Bei der LOOP-Schleife werden die Zeilen satzweise in die Workarea gestellt. Da die Workarea frei wählbar ist, müssen Sie in der LOOP-Anweisung angeben, in welche Workarea die Zeile gestellt werden soll. Wenn Sie für die interne Tabelle ITAB01 die Workarea WA_ITAB01 vorgesehen haben, lautet die LOOP-Anweisung:

LOOP AT itab01 INTO wa_itab01.
[»]  LOOP AT mit Referenzen und Feldsymbolen

Neben der Verwendung einer Workarea gibt es noch zwei weitere Techniken zum zeilenweisen Zugriff auf eine interne Tabelle. Verwenden Sie die LOOP-Anweisung mit dem Zusatz ASSIGNING, wird ein Feldsymbol bei jedem Schleifendurchlauf einer anderen Tabellenzeile zugewiesen.

Verwenden Sie die LOOP-Anweisung mit dem Zusatz REFERENCE INTO, wird eine Referenzvariable bei jedem Schleifendurchlauf mit einer Referenz auf eine andere Tabellenzeile gefüllt. Dabei handelt es sich jedoch um fortgeschrittene Techniken, die hier nur der Vollständigkeit halber erwähnt sein sollen.

Die Workarea WA_ITAB01 wird damit für jeden Schleifendurchlauf mit einer Zeile der Tabelle ITAB01 gefüllt. Wenn Sie beispielsweise die Felder der Workarea WA_ITAB01 in einer Liste ausgeben möchten, schreiben Sie:

WRITE: / wa_itab01-zzkurstitel, wa_itab01-tkurspreis.

In der Praxis wird die Verarbeitung einer Zeile meist aufwendiger sein. In allen Fällen muss allerdings die Verarbeitungsschleife mit der Anweisung ENDLOOP abgeschlossen werden.

Für die Änderung bestehender Einträge in einer internen Tabelle verwenden Sie die MODIFY-Anweisung. Steht die MODIFY-Anweisung innerhalb einer LOOP-Schleife, wird die aktuelle Zeile der internen Tabelle unter Angabe der relevanten Workarea aktualisiert. Zunächst muss in diesem Fall in der LOOP-Schleife wiederum der Inhalt der Workarea aktualisiert werden, etwa mit einer Anweisung:

wa_itab03-preis = 567.

Nachdem alle Felder der Workarea den aktualisierten Inhalt erhalten haben, wird die Rumpfzeile der internen Tabelle unter Bezug auf die relevante Workarea mit dem Zusatz FROM aktualisiert:

MODIFY itab03 FROM wa_itab03.
[+]  MODIFY

Die Anweisung MODIFY ändert nur den Inhalt einer bestehenden Zeile der internen Tabelle; sie legt hier keine neue Zeile an. Steht das MODIFY-Kommando in einer LOOP-Schleife, wird immer die aktuelle Zeile geändert. Bei Tabellen mit eindeutigem Schlüssel darf allerdings hierbei der Schlüssel nicht verändert werden. Steht die MODIFY-Anweisung außerhalb einer LOOP-Schleife, müssen Sie die zu ändernde Zeile über den Index angeben.

Beim Einfügen neuer Zeilen muss die neue Zeile zunächst in der entsprechenden Workarea aufgebaut werden. In folgendem Beispiel handelt es sich um die Workarea WA_ITAB01:

wa_itab01-zzkurstitel = 'LINUX-GRUNDLAGEN'.
wa_itab01-tkurspreis = '456.78'.

Anschließend übertragen Sie den Inhalt der Workarea in den Tabellenrumpf der internen Tabelle ITAB01. Der Index für die richtige Zeile steht im Feld ZEILEN_ITAB01; Sie haben auch diesen bereits vorher ermittelt:

INSERT wa_itab01 INTO itab01 INDEX zeilen_itab01.

Sobald Sie die richtige Zeile der internen Tabelle über den Index identifiziert haben, greifen Sie über READ und den Zusatz INDEX auf den Index der Zeile zu und stellen die Zeile mit dem Zusatz INTO in die vorgesehene Workarea, beispielsweise WA_ITAB03:

READ TABLE itab03 INDEX 3 INTO wa_itab03.
[+]  Index

Der Index kann absolut angegeben werden; in der Praxis wird natürlich statt der 3 im gezeigten Beispiel ein Feldname mit dem relevanten Inhalt stehen. Der Zugriff über den Index ist die schnellste Zugriffsart bei Indextabellen.

Falls Sie den Index aber nicht ermitteln können, besteht auch die Möglichkeit, über Schlüsselfelder zuzugreifen. Bei sortierten Tabellen konnten Sie bei der Deklaration bereits den Schlüssel angeben; diesen Schlüssel würden Sie entsprechend bei der READ-Anweisung verwenden.

In unserem Beispiel arbeiten wir mit Standardtabellen, die immer einen nicht eindeutigen Schlüssel besitzen. Sie müssen sich daher überlegen, durch welche Schlüsselfelder Sie eine Zeile der internen Tabelle möglichst eindeutig identifizieren. Da in Standardtabellen Zeilen mehrfach vorkommen dürfen, ist dies besonders wichtig: Die READ-Anweisung zieht den ersten passenden Satz, ohne zu hinterfragen, ob es möglicherweise noch weitere Trefferzeilen in der internen Tabelle gibt, und stellt diesen in die jeweilige Workarea:

READ TABLE itab02 INTO wa_itab02
WITH KEY zzkurstitel = 'SAP-Grundlagen'.

Hier wird aus den Rumpfzeilen der internen Tabelle ITAB02 die erste passende Zeile mit dem Zusatz INTO in die Workarea WA_ITAB02 übertragen, bei der das Feld ZZKURSTITEL den Inhalt »SAP-Grundlagen« hat. Zwar könnten in der Tabelle mehrere Zeilen mit diesem Feldinhalt stehen; die READ-Anweisung prüft dies allerdings nicht mehr.

Auch beim Löschen einer Rumpfzeile können Sie über den Index oder über den Inhalt des Arbeitsbereiches die relevante Zeile identifizieren. Suchen Sie die zu löschende Rumpfzeile über die Workarea, muss vor der DELETE-Anweisung die Workarea adäquat gefüllt sein. Die DELETE-Anweisung sucht – wie die READ-Anweisung vom Tabellenanfang aus – nur den ersten passenden Satz in den Rumpfzeilen und löscht auch nur diesen. Das Problem mehrfach vorkommender, gleichlautender Rumpfzeilen gibt es demnach auch bei der DELETE-Anweisung, nur in einem anderen Sinn.

Eine Möglichkeit, redundante Zeilen zu löschen, wäre, die interne Tabelle zunächst entsprechend zu sortieren und dann mit der Anweisung DELETE und dem Zusatz ADJACENT DUPLICATES die redundanten Zeilen bis auf eine zu löschen. Darauf soll hier aber nicht weiter eingegangen werden.

Ist die Workarea WA_ITAB02 bereits adäquat gefüllt, geben Sie mit dem Zusatz TABLE die interne Tabelle ITAB02 an und mit dem Zusatz FROM die relevante Workarea:

DELETE TABLE itab02 FROM wa_itab02.
 
Zum Seitenanfang

12.5.2    Interne Tabelle mit Kopfzeile verarbeiten Zur vorigen ÜberschriftZur nächsten Überschrift

In diesem Abschnitt sollen insbesondere die Abweichungen herausgestellt werden, die sich bei internen Tabellen durch das Arbeiten mit einer Kopfzeile anstelle einer Workarea ergeben. Wie bei den Darstellungen zu internen Tabellen mit Kopfzeilen gilt, dass diese Technik obsolet und im Umfeld von ABAP Objects verboten ist, Ihnen aber trotzdem häufig begegnen wird und ihre Kenntnis in der Praxis unverzichtbar ist.

Der Grund für das Verbot interner Tabellen mit Kopfzeilen in ABAP Objects ist der gleiche wie der für das Verbot der TABLES-Anweisung: Zwei unterschiedliche Datenobjekte (Kopfzeile und Tabellenrumpf) werden über denselben Namen angesprochen. Diese und andere implizite Verhaltensweisen des ABAP-Systems in Verbindung mit Tabellen mit Kopfzeilen sind für viele Entwickler verwirrend und entsprechen nicht den modernen Programmiergepflogenheiten. Heute wird ein expliziterer Programmierstil bevorzugt, bei dem man das, was das System tun soll, so auch ausdrücklich im Quelltext wiederfindet.

Der wesentliche Unterschied in der zeilenweisen Verarbeitung ist, dass das Lesen und Schreiben von Zeilen der internen Tabelle immer und ausschließlich über eine entsprechende Kopfzeile laufen muss. Dies gilt für Einzelzugriffe und Schleifen.

Bei einer internen Tabelle mit Kopfzeile wird Zeile für Zeile aus dem Tabellenrumpf in die Kopfzeile gestellt und dort gemäß den Anweisungen verarbeitet:

LOOP AT itab01.
* Anweisungsblock Verarbeitung Zeile Arbeitsbereich
ENDLOOP.

Möglicherweise besteht der Anweisungsblock nur aus einer einfachen Listausgabe:

WRITE: / itab01-bezeichnung, itab01-preis,
itab01-maxteil.

Nachdem der letzte Satz in den Arbeitsbereich gestellt und verarbeitet wurde, wird die Struktur LOOP ... ENDLOOP geschlossen und die nächste Anweisung im Quellcode ausgeführt. Der Tabellenrumpf der internen Tabelle bleibt in diesem Beispiel unverändert erhalten.

Der Anweisungsblock kann beliebige ABAP-Anweisungen enthalten. Diese Anweisungen betreffen aber immer nur den Arbeitsbereich, in diesem Fall die Kopfzeile der internen Tabelle, nicht aber die Zeilen im Tabellenrumpf. Möchten Sie beispielsweise das Feld für die Mindestteilnehmer in der Liste mit einem Wert ausgeben, kann dieser Wert in der Schleife ermittelt werden:

LOOP AT itab02.
itab02-minteiln = 2.
WRITE: / itab02-zzkurstitel, itab02-tkurspreis,
itab02-minteiln.
ENDLOOP.

In diesem Beispiel ist die Wertzuweisung für eine Verarbeitung eher symbolisch. Sie soll aber verdeutlichen, dass für die Weiterverarbeitung das Feld im Arbeitsbereich mit einem Wert gefüllt wird, das Feld im Tabellenrumpf hingegen nicht.

Möchten Sie den in der Kopfzeile ermittelten Wert in eine entsprechende Zeile und ein entsprechendes Tabellenfeld übernehmen, können Sie wie im folgenden Codebeispiel vorgehen: Hier wird der Preis für einen bestimmten Kurs in der Kopfzeile der internen Tabelle verändert und in die jeweilige Rumpfzeile der internen Tabelle geschrieben. Die Wirkungsweise der MODIFY-Anweisung innerhalb und außerhalb von LOOP-Schleifen wurde bereits beschrieben. Beachten Sie wieder die »richtige« Groß- und Kleinschreibung im Literal der Bedingung; nur bei einem Treffersatz ist die Bedingung erfüllt, und der Preis wird geändert:

LOOP AT itab03.
IF itab03-bezeichnung = 'PC-GRUNDLAGEN'.
itab03-preis = 567.
ENDIF.
WRITE: / itab03-bezeichnung, itab03-preis,
itab03-maxteil.
MODIFY itab03.
ENDLOOP.
[»]  Nur für Indextabellen und Tabellen mit Kopfzeile

Diese Form der MODIFY-Anweisung im Beispiel ist nur für Indextabellen und nur für Tabellen mit Kopfzeile zulässig. Wenn die Anweisung MODIFY in einer LOOP-Schleife steht und keine weiteren Zusätze angegeben sind, wirkt das MODIFY-Kommando automatisch auf den aktuellen Satz in der Kopfzeile und die entsprechende Rumpfzeile. Anderenfalls müsste über den Zusatz INDEX der Tabellenindex der zu ändernden Rumpfzeile angegeben werden.

Für bestimmte Verarbeitungsschritte ist es notwendig, Informationen über die interne Tabelle einzuholen. Mit der Anweisung DESCRIBE können Sie die Anzahl der Rumpfzeilen, den reservierten Speicherplatz und die Tabellenart (Standardtabelle, sortierte Tabelle oder Hash-Tabelle) abfragen. Für den Einstieg ist es wahrscheinlich am wichtigsten, die Anzahl von Rumpfzeilen zu kennen, die Sie mit dem Zusatz LINES ermitteln. Möchten Sie z. B. wissen, wie viele Rumpfzeilen die interne Tabelle ITAB01 hat, schreiben Sie:

DESCRIBE TABLE itab01 LINES zeilen_itab01.

Für die gefundene Anzahl Zeilen liefert die Anweisung einen Integerwert zurück und stellt ihn in diesem Beispiel in das Feld ZEILEN_ITAB01.

Die ermittelte Anzahl von Rumpfzeilen könnten Sie beispielsweise verwenden, wenn Sie in eine interne Indextabelle eine neue Zeile mit der INSERT-Anweisung einfügen möchten.

INSERT itab01 INDEX zeilen_itab01.

Im Gegensatz zur APPEND-Anweisung, die einfach nur Zeilen am Ende des Tabellenrumpfes anhängt, können Sie mit der INSERT-Anweisung Zeilen an beliebiger Stelle in den Rumpf einschieben. Grundsätzlich wird die neue Zeile immer vor der Position eingefügt, die Sie mit dem Zusatz INDEX angeben. Wird beispielsweise INDEX 5 angegeben, wird die neue Zeile vor der alten Zeile 5 eingefügt. Im Beispiel steht in der Variablen ZEILEN_ITAB01 die Anzahl der Rumpfzeilen. Die neue Zeile würde vor der letzten Zeile eingefügt. Sollte der Inhalt von ZEILEN_ITAB01 um 1 erhöht worden sein, wird die neue Zeile an den Tabellenrumpf angehängt. In diesem Sonderfall ist die Wirkung der Anweisung dann mit der APPEND-Anweisung vergleichbar.

Bei Standardtabellen dürfen Zeilen mehrfach vorkommen. Handelt es sich hingegen um eine sortierte Tabelle, müssen Sie darauf achten, dass nach der INSERT-Anweisung die Sortierung immer noch fehlerfrei ist, da das System anderenfalls einen Laufzeitfehler erzeugen würde. Falls die Tabelle mit einem eindeutigen Schlüssel deklariert wurde, würde das System analog reagieren.

Natürlich können Sie die Zeilen von internen Tabellen nicht nur in einer Schleife lesen und verarbeiten, sondern mit der Anweisung READ auch gezielt einzelne Sätze aus dem Tabellenrumpf lesen. Arbeiten Sie mit einer Kopfzeile, wird der Satz in die Kopfzeile gestellt; arbeiten Sie mit einer Workarea, müssen Sie diese explizit angeben.

Bei der Arbeit mit dieser Anweisung, insbesondere mit deren Zusätzen, müssen Sie sich immer überlegen, welchen internen Tabellentyp Sie mit welchem Schlüssel verarbeiten möchten. Entsprechend der Konzeption der internen Tabellen sieht die READ-Anweisung mit ihren Zusätzen unterschiedlich aus.

Wenn es sich bei ITAB03 beispielsweise um eine Standardtabelle mit nicht eindeutigem Standardschlüssel und Kopfzeile handelt und Sie in dieser internen Tabelle die dritte Rumpfzeile zur Weiterverarbeitung in die Kopfzeile stellen möchten, lautet die Anweisung:

READ TABLE itab03 INDEX 3.
[+]  Auf Typ und Schlüssel achten

Wie erwähnt, kennt man leider häufig nicht den richtigen Index, sondern nur den Inhalt bestimmter Felder. In diesem Fall bleibt Ihnen nichts anderes übrig, als über einen Schlüssel zu suchen. Ist die interne Tabelle strukturgleich mit der Datenbanktabelle, können Sie sich vielleicht über die Schlüsselfelder der Datenbanktabelle helfen. Wichtig ist wiederum, auf den Typ und den Schlüssel der internen Tabelle zu achten.

Haben Sie es mit einer Standardtabelle mit nicht eindeutigem Standardschlüssel und Kopfzeile zu tun, sind bei dieser Tabellenart mehrere gleichlautende Zeilen zulässig. Der Schlüssel der Datenbanktabelle muss für diese interne Tabelle nicht zwangsläufig eindeutig sein, sondern es hängt davon ab, welche Verarbeitungsschritte mit der internen Tabelle bereits durchgeführt wurden.

Wenn Sie einfach davon ausgehen, dass Sie die Schlüsselfelder der Datenbanktabelle auch als Schlüssel für die interne Tabelle betrachten können, die interne Tabelle aufsteigend sortiert ist und keine redundanten Zeilen vorliegen, können Sie mit der Anweisung READ auch in der internen Tabelle den gewünschten Satz finden und zur Verarbeitung in die Kopfzeile stellen. Die interne Tabelle wird dabei ab Zeile 1 sequenziell durchsucht, bis der »richtige« Satz gefunden wird.

Über den Index in einer internen Tabelle zu lesen, ist die schnellste Zugriffsart. Das Problem ist meistens, die richtige Zeilennummer bzw. den richtigen Index herauszufinden; anderenfalls wäre diese Zugriffsart ideal. Im Vergleich zum Indexzugriff bedeutet der Zugriff über einen Hash-Algorithmus etwa den dreifachen Aufwand und der Zugriff über einen Schlüssel einen bis zu 14-fach höheren Aufwand.

Im folgenden Codebeispiel ist die interne Tabelle ITAB04 strukturgleich mit der Datenbanktabelle ZTEILNEHMER02; die übrigen Voraussetzungen liegen ebenfalls vor. Somit können Sie die Schlüsselfelder der Datenbanktabelle MANDANT und TNUMMER zur sequenziellen Suche in der internen Tabelle verwenden:

READ TABLE itab04 WITH KEY
mandant = sy-mandt tnummer = 5.

Die gezeigte Schreibweise der READ-Anweisung könnten Sie auch für sortierte Tabellen und Hash-Tabellen verwenden. Bilden die angegebenen Felder den Schlüssel vollständig ab, wird bei sortierten Tabellen binär, bei Hash-Tabellen nach dem Hash-Algorithmus gesucht. Werden andere Felder als die Schlüsselfelder verwendet, werden auch sortierte Tabellen und Hash-Tabellen sequenziell durchsucht.

[»]  Auf den Entwickler kommt es an

Sie könnten für die Suche auch andere Felder verwenden; das Problem dabei ist die Eindeutigkeit. Bei der sequenziellen Suche mit der READ-Anweisung betrachtet das System den ersten gefundenen passenden Satz als Treffer und stellt ihn in die Kopfzeile; die sequenzielle Suche ist damit beendet. Ob der gefundene Satz auch der »richtige« Satz ist, ist nicht das Problem des Systems, sondern Ihres.

Um eine einzelne Zeile oder eine Gruppe von Zeilen aus der internen Tabelle zu löschen, verwenden Sie die Anweisung DELETE. Am schnellsten und eindeutig löschen Sie wieder unter Verwendung des Tabellenindexes. Analog zur READ-Anweisung ist dieser Zusatz bei Hash-Tabellen nicht möglich, sondern nur bei Standardtabellen und sortierten Tabellen, d. h. bei Indextabellen. Ebenso verhält es sich auch mit dem Problem, den richtigen Index zu identifizieren.

Im folgenden Beispiel ist die interne Tabelle ITAB01 wieder eine Standardtabelle mit Kopfzeile. Die Rumpfzeile mit dem Index 4, die vierte Rumpfzeile, löschen Sie mit folgender Anweisung:

DELETE itab01 INDEX 4.

Das Löschen einer Zeile im Tabellenrumpf hat keinerlei Auswirkungen auf die Kopfzeile bzw. Workarea der Tabelle; deren Inhalt bleibt unverändert. Sollte für Dokumentationszwecke die zu löschende Zeile protokolliert werden müssen, ist es notwendig, diese Zeile vor dem Löschen in den Arbeitsbereich der internen Tabelle zu stellen und entsprechend zu verarbeiten.

Diese Schreibweise der DELETE-Anweisung empfiehlt sich, wenn die Anweisung in einer LOOP-Schleife den aktuellen Satz aus dem Tabellenrumpf löschen soll. Der Index wird dann über das Systemfeld SY-TABIX ermittelt, und die Anweisung lautet für die interne Tabelle ITAB01:

DELETE itab01 INDEX sy-tabix.
[ ! ]  DELETE-Anweisung ohne INDEX-Zusatz

Ohne den Zusatz INDEX sollte die DELETE-Anweisung weder innerhalb noch außerhalb von LOOP-Schleifen verwendet werden. Außerhalb von LOOP-Schleifen erzeugt sie einen Laufzeitfehler, d. h. einen Kurz-Dump. Innerhalb von LOOP-Schleifen sollte – sofern möglich – der Zusatz INDEX im Hinblick auf zukünftige Releases immer angegeben werden.

Wie beschrieben, kennt man manchmal den Index der zu löschenden Zeile leider nicht auf Anhieb. Haben Sie einen eindeutigen Schlüssel, können Sie über ihn den richtigen Satz finden und löschen. Haben Sie einen nicht eindeutigen Schlüssel, müssen Sie eine logische Bedingung formulieren, die die Treffermenge möglichst gut eingrenzt. Nach dem Zusatz WHERE geben Sie einen logischen Ausdruck an, der Bedingungen enthält, die den zu löschenden Satz möglichst eindeutig identifizieren. Je allgemeiner die Bedingung formuliert ist, desto größer ist die Treffermenge.

Möchten Sie beispielsweise alle Zeilen aus ITAB02 löschen, bei denen im Feld ZZKURSTITEL der Inhalt »SAP-Grundlagen« enthalten ist, schreiben Sie:

DELETE itab02 WHERE zzkurstitel = 'SAP-Grundlagen'.
[»]  Nicht nur einen Satz löschen

Beachten Sie, dass mit dieser Anweisung nicht nur ein Satz gelöscht werden kann, sondern dass alle Zeilen der internen Tabelle gelöscht werden, auf die diese Bedingung zutrifft. Sowohl bei einer Standardtabelle als auch bei einer Hash-Tabelle werden alle Tabelleneinträge der internen Tabelle auf diese Bedingung hin geprüft. Nur bei sortierten Tabellen könnte die Verarbeitung unter bestimmten Umständen intern so optimiert werden, dass wirklich nur die »richtigen« Zeilen verarbeitet werden.

Zum Sortieren interner Tabellen verwenden Sie die Anweisung SORT. Grundsätzlich wird damit die interne Tabelle aufsteigend sortiert; ohne weitere Zusätze erfolgt die Sortierung nach dem deklarierten Tabellenschlüssel. Bei sortierten Tabellen und Hash-Tabellen müssen Sie außer dem Namen der internen Tabelle keine weiteren Zusätze angeben.

Verwenden Sie Standardtabellen, benötigt das System Anweisungen für die Sortierkriterien. Sie müssen zumindest die Felder angeben, nach denen sortiert werden soll – dies geschieht mit dem Zusatz BY.

Im folgenden Beispiel gehen wir davon aus, dass die interne Tabelle ITAB04 die Daten der Datenbanktabelle ZTEILNEHMER02 enthält. In der Datenbanktabelle besteht der Schlüssel aus den Feldern MANDANT und TNUMMER. Aufsteigend nach diesem Schlüssel, liegen die Datensätze auch in der internen Tabelle. Mit der folgenden Anweisung wird nun die interne Tabelle so umsortiert, dass die Zeilen nach dem Inhalt des Feldes KURSTITEL geordnet vorliegen:

SORT itab04 BY zzkurstitel.

Die Sortierreihenfolge erfolgt dabei für Felder vom Typ c binär, nicht nach sprachspezifischen Sortierkriterien. Abhängig vom Betriebssystem des Applikationsservers, werden beispielsweise Großbuchstaben vor Kleinbuchstaben ausgegeben.

Mit dieser Schreibweise gilt die sprachspezifische Sortierung für alle Felder der Feldliste. Sollte die sprachspezifische Sortierung nur für bestimmte Felder gelten, müsste der Zusatz AS TEXT nach jedem relevanten Feld geschrieben werden.

[+]  AS TEXT und Sortierkriterium

Soll nach sprachspezifischen Kriterien sortiert werden, empfiehlt sich der Zusatz AS TEXT direkt nach dem Namen der internen Tabelle:

SORT itab04 AS TEXT BY zzkurstitel.

Natürlich können als Sortierkriterium mehrere Feldnamen in Form einer Feldliste angegeben werden, bis zu 250 Felder maximal. Möchten Sie beispielsweise die interne Tabelle ITAB04 nach dem Kurstitel und dem Teilnehmernamen sortieren, geben Sie den Kurstitel als erstes Sortierkriterium an. Bei gleichem Kurstitel wird auf folgende Weise nach dem Teilnehmernamen sortiert:

SORT itab04 AS TEXT BY zzkurstitel tname.

Wie erwähnt, wird die interne Tabelle ohne weitere Zusätze aufsteigend sortiert. Falls Sie einmal eine absteigende Sortierreihenfolge benötigen, beispielsweise für Ranglisten, muss unmittelbar nach dem Namen der internen Tabelle der Zusatz DESCENDING folgen:

SORT itab04 DESCENDING AS TEXT BY zzkurstitel tname.

 


Ihre Meinung?

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Einstieg in ABAP Einstieg in ABAP
Jetzt Buch bestellen

 Buchempfehlungen
Zum Rheinwerk-Shop: SAP – Der technische Einstieg
SAP – Der technische Einstieg


Zum Rheinwerk-Shop: ABAP Objects – Das umfassende Handbuch
ABAP Objects – Das umfassende Handbuch


Zum Rheinwerk-Shop: ABAP-Entwicklung für SAP S/4HANA
ABAP-Entwicklung für SAP S/4HANA


Zum Rheinwerk-Shop: Kundeneigene Erweiterungen mit ABAP
Kundeneigene Erweiterungen mit ABAP


Zum Rheinwerk-Shop: Schrödinger programmiert ABAP
Schrödinger programmiert ABAP


Zum Rheinwerk-Shop: Migration nach SAP S/4HANA
Migration nach SAP S/4HANA


Zum Rheinwerk-Shop: Design Thinking mit SAP
Design Thinking mit SAP


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und in die Schweiz
InfoInfo

 
 


Copyright © Rheinwerk Verlag GmbH 2020
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 
[Rheinwerk]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern