Freitag, 7. März 2008

Wie man teure Zusicherungen in ABAP verwendet

Das ABAP-Statement ASSERT dient dazu, den Programmcode an geeigneten Stellen abzusichern, indem eine für das Folgende unablässige Bedingung geprüft wird. Das kann zum Beispiel sy-subrc eq 0 nach einem Lesezugriff auf eine interne Tabelle sein, für die man sich im nachfolgenden Code darauf verlassen muss, dass der Eintrag existiert. Würde das Programm, obwohl die Bedingung verletzt ist, einfach weiterrechnen, könnten sich schwerwiegende Daten-Inkonsistenzen ergeben. Auf jeden Fall ist das Programm auf diesen Fall nicht vorbereitet.

Ohne das ASSERT zur Verfügung zu haben, würde man vielleicht folgendes programmieren:

read table lt_wichtig assigning <ls_wichtig>
with table key vbeln = ls_vbap-vbeln.
if sy-subrc ne 0.
* Dieser Fall kann eigentlich nie vorkommen...
* X-Message: Absichtlich einen Dump auslösen
message x100(z001) with ls_vbap-vbeln.
endif.

So kann man verhindern, dass das Programm weiterarbeitet, wenn es in diese Situation gerät.

Mit ASSERT würde man etwa folgendes schreiben:

read table lt_wichtig assigning <ls_wichtig>
with table key vbeln = ls_vbap-vbeln.
assert id z_sd
subkey ls_vbap-vbeln
fields ls_vbap lt_wichtig
condition sy-subrc eq 0.

Mit den Checkpoint-Aktivierungen (Transaktion SAAB) kann man dann steuern, ob an dieser Stelle ein Dump ausgelöst wird (mit der ID ASSERTION_FAILED), ob der ASSERT ein Protokoll schreiben soll, ob man an dieser Stelle in den Debugger springen möchte oder ob die ASSERT-Bedingung vollständig ignoriert werden soll. All dies lässt sich pro User, pro Server oder global einstellen.

Manchmal gibt es Konsistenzprüfungen, die man nur in Fällen mitlaufen lassen möchte, wenn es begründete Zweifel an der Qualität der verwendeten Daten gibt. Im Normalbetrieb sollen diese Konsistenzprüfungen aus Effizienzgründen jedoch nicht durchlaufen werden. Bei Verwendung eines Checkpoints und der assert Anweisung ergibt sich das technische Problem, wie man auch komplexere Prüfungen in die Bedingung eines einzigen Statements packen kann. Kann man?

Man kann! Denn Methoden lassen sich in ihrer funktionalen Notation "y = f(x)" in einer ABAP-Bedingung verwenden. So könnte der Code zum Prüfen einer Positionstabelle wie folgt aussehen:
 assert id z_sd fields lt_vbap condition items_consistent( lt_vbap ) = 'X'.

Der Code - der auch etwas mehr Systemlast kosten kann - wird nun in der Methode items_consistent() implementiert. Wenn alles OK ist, gibt die Methode den Wert 'X' zurück, was in der Bedingung ausgewertet werden kann. Das Gute: Sie können auf diese Weise auch komplexere Bedingungen in ein assert-Statement stecken. Und noch besser: Nur wenn die Checkpoint-ID aktiv ist, wird der Code überhaupt aufgerufen.

1 Kommentar :

Wireless hat gesagt…

Hello. This post is likeable, and your blog is very interesting, congratulations :-). I will add in my blogroll =). If possible gives a last there on my blog, it is about the Wireless, I hope you enjoy. The address is http://wireless-brasil.blogspot.com. A hug.