ABAP - Schlüsselwortdokumentation →  ABAP - Programmierrichtlinien →  Robustes ABAP →  Systemfelder → 

Auswertung

Hintergrund

Systemfelder beschreiben allgemeine Systemzustände oder werden von einzelnen Anweisungen spezifisch gesetzt. Der Inhalt von Systemfeldern ist dabei nur so definiert, wie er in der Dokumentation der Systemfelder oder der Dokumentation von ABAP-Anweisungen, die Systemfelder setzen, beschrieben ist. In anderen als den beschriebenen Kontexten ist der Inhalt von Systemfeldern undefiniert. Insbesondere können Anweisungen, bei denen keine Wirkung auf Systemfelder dokumentiert ist, den Inhalt bestimmter Systemfelder, wie beispielsweise der Rückgabewert sy-subrc, in undefinierter Weise beeinflussen. Dies gilt vor allem für Anweisungen, bei deren Ausführung explizit oder implizit ABAP-Code aufgerufen wird.

Regel

Systemfelder an richtiger Stelle auswerten

Werten Sie Systemfelder nur in solchen Kontexten aus, für die sie definiert sind. Falls eine ABAP-Anweisung laut ihrer Dokumentation ein Systemfeld setzt, sollte dieses direkt hinter der Anweisung ausgewertet werden. Systemfelder dürfen hingegen nicht hinter Anweisungen ausgewertet werden, für die keine Wirkung dokumentiert ist.

Details

Ein Systemfeld sollte möglichst direkt hinter der Anweisung ausgewertet werden, die es gesetzt hat, damit es nicht von anderen Anweisungen überschrieben wird. Je größer der Abstand zwischen der betrachteten ABAP-Anweisung und der Auswertung eines Systemfeldes ist, desto größer ist die Gefahr, dass dieses Systemfeld in der Zwischenzeit von einer weiteren Anweisung beeinflusst wird.

Bei Bedarf sollten die Werte von Systemfeldern in Hilfsvariablen gesichert werden. Dies gilt im besonderen Maße für den allgemeinen Rückgabewert sy-subrc, der von besonders vielen verschiedenen Anweisungen gesetzt wird. Weitere gängige Beispiele sind der Schleifenzähler syindex oder der Tabellenindex sy-tabix.

Keinesfalls sollten anweisungsbezogene Systemfelder hinter Anweisungen ausgewertet werden, die diese nach ihrer Dokumentation gar nicht setzen. Ein gängiges Beispiel ist wieder die Auswertung von sy-subrc. Wenn bei einer Anweisung nicht dokumentiert ist, dass sy-subrc definiert gesetzt wird, ist die Auswertung hinter der Anweisung höchst gefährlich. Entweder hat sy-subrc noch den vorherigen Wert oder wird durch die Anweisung undefiniert gesetzt, was beides zu falschem Programmverhalten führen kann. Das schlechte Beispiel im Abschnitt über die erweiterte Programmprüfung zeigt einen solchen Fall.

Hinweis

Die statischen Methoden der Klasse CL_ABAP_SYST geben ebenfalls wichtige Systemzustände zurück. Dabei ist die Gefahr einer vorherigen Überschreibung im Programm ausgeschlossen.

Schlechtes Beispiel

Folgender Quelltext zeigt eine zu späte Auswertung von sy-subrc. Selbst wenn bei den Anweisungen zwischen FIND und IF nicht dokumentiert ist, dass sy-subrc gesetzt wird, kann der Wert dennoch durch Nebeneffekte überschrieben werden.

FIND REGEX ... IN ...
...
... "other statements
...
IF sy-subrc = 0.
   ...
ENDIF.

Gutes Beispiel

Folgender Quelltext korrigiert obiges Beispiel, indem sy-subrc direkt nach FIND einer Hilfsvariablen zugewiesen wird, die dann in IF ausgewertet wird. Genauso kann es auch notwendig sein, sy-index oder sy-tabix direkt nach dem Eintritt in eine DO- bzw. LOOP-Schleife einer Hilfsvariablen zuzuweisen.

FIND REGEX ... IN ...
find_subrc = sy-subrc.
...
... "other statements
...
IF find_subrc = 0.
   ...
ENDIF.