Show TOC Anfang des Inhaltsbereichs

Ereignisse auslösen und behandeln  Dokument im Navigationsbaum lokalisieren

Ereignisse auslösen und Behandeln bedeutet in ABAP Objects, dass bestimmte Methoden als Auslöser agieren und Ereignisse auslösen, worauf andere Methoden als Behandler reagieren d.h. zum Ereigniszeitpunkt ausgeführt werden.

Dieser Abschnitt gibt einen Überblick über das Arbeiten mit Ereignissen in ABAP Objects. Für genauere Informationen zu den Anweisungen lesen Sie bitte die entsprechende Schlüsselwortdokumentation.

Ereignisse auslösen

Für das Auslösen eines Ereignisses muss eine Klasse

·        das Ereignis in ihrem Deklarationsteil deklarieren.

·        das Ereignis in einer ihrer Methoden auslösen.

Ereignisse deklarieren

Ereignisse werden im Deklarationsteil einer Klasse oder in einem Interface deklariert. Zum Deklarieren von Instanzereignissen dient die Anweisung

EVENTS evt EXPORTING... VALUE(e1 e2 ...) TYPE type [OPTIONAL]..

Zum Deklarieren von statischen Ereignissen dient die Anweisung

CLASS-EVENTS evt...

Beide Anweisungen haben die gleiche Syntax.

Bei der Ereignisdeklaration können mit dem EXPORTING-Zusatz Parameter definiert werden, die der Auslöser des Ereignisses an den Behandler übergibt. Die Übergabe erfolgt dabei immer als Wert. Instanzereignisse enthalten immer den impliziten Parameter sender, der als Referenz auf die Klasse bzw. das Interface typisiert ist, in dem das Ereignis deklariert wird.

Ereignisse auslösen

Wenn eine Klasse ein Instanzereignis enthält, kann jede Instanzmethode der Klasse das Ereignis auslösen. Ein statisches Ereignis kann von jeder Methode ausgelöst werden. Statische Methoden können aber nur statische Ereignisse auslösen. Zum Auslösen eines Ereignisses in Methoden dient die Anweisung

RAISE EVENT evt EXPORTING e1 = f1  e2 = f2 ...

Für sämtliche nicht optionalen Formalparameter e1 e2 ... des Ereignisses müssen mit dem EXPORTING-Zusatz Aktualparameter f1 f2 ... angegeben werden. An den impliziten Parameter sender wird automatisch die Selbstreferenz me übergeben.

Ereignisse behandeln

Ereignise werden durch spezielle Methoden behandelt. Um ein Ereignis zu behandeln muss eine Methode

·        als Ereignisbehandlermethode für dieses Ereignis deklariert sein.

·        zur Laufzeit für das Ereignis registriert werden.

Ereignisbehandlermethoden deklarieren

Jede Klasse kann Ereignisbehandlermethoden für Ereignisse anderer Klassen oder Interfaces enthalten. Ereignisbehandlermethoden für Ereignisse der gleichen Klasse sind natürlich auch möglich. Die Deklaration einer Ereignisbehandlermethode erfolgt über

METHODS meth FOR EVENT evt OF cif IMPORTING e1 e2 ...

für eine Instanzmethode und mit CLASS-METHODS entsprechend für eine statische Methode. Dabei ist evt ein in Klasse bzw. Interface cif deklariertes Ereignis.

Die Schnittstelle einer Ereignisbehandlermethode darf nur Formalparameter enthalten, die bei der Deklaration des Ereignisses evt definiert wurden. Die Eigenschaften der Parameter werden ebenfalls vom Ereignis übernommen. Die Ereignisbehandlermethode muss aber nicht alle Parameter übernehmen, die mit der Anweisung RAISE EVENT übergeben werden. Falls der implizite Parameter sender übernommen werden soll, muss er ebenfalls in der Schnittstelle aufgeführt werden. Dieser Parameter erlaubt es einem Behandler von Instanzereignissen, auf den Auslöser zuzugreifen und ihm beispielsweise Ergebnisse zu übermitteln.

Die Deklaration einer Ereignisbehandlermethode in einer Klasse bedeuted, dass die Instanzen der Klasse, bzw. die Klasse selbst, prinzipiell in der Lage sind, ein Ereignis evt, das in einer Methode ausgelöst wird, zu behandeln.

Ereignisbehandlermethoden registrieren

Damit eine Ereignisbehandlermethode auf ein ausgelöstes Ereignis reagiert, d.h. sie wird zum Ereigniszeitpunkt ausgeführt, muss zur Laufzeit festgelegt werden, auf welche Auslöser sie reagieren soll. Dies geschieht mit der Anweisung

SET HANDLER h1 h2 ... [FOR]...

Diese Anweisung verknüpft eine Liste von Behandlermethoden mit Auslösermethoden. Dabei sind hinsichtlich der ausgelösten Ereignisse vier Fälle zu unterscheiden:

Das Ereignis ist

·        ein Instanzereignis, das in einer Klasse

·        ein Instanzereignis, das in einem Interface

·        ein statisches Ereignis, das in einer Klasse

·        ein statisches Ereignis, das in einem Interface

deklariert ist. Je nach Ereignis ist die Syntax und die Wirkung der Anweisung SET HANDLER unterschiedlich.

Bei Instanzereignissen muss mit dem Zusatz FOR angegeben werden, für welche auslösende Instanz die Behandler registriert werden. Dabei kann entweder genau eine auslösende Instanz mit Hilfe einer Referenzvariablen ref angeben werden:

SET HANDLER h1 h2 ... FOR ref.

Oder die Behandler werden für alle Instanzen registriert, die das Ereignis auslösen können:

SET HANDLER h1 h2 ... FOR ALL INSTANCES.

Diese Registrierung gilt auch für auslösende Instanzen, die zum Zeitpunkt der Registrierung noch gar nicht erzeugt wurden.

Bei statischen Ereignissen darf kein FOR-Zusatz verwendet werden:

SET HANDLER h1 h2 ...

Die Registrierung gilt automatisch für die gesamte Klasse, bzw. für alle Klassen, die ein Interface mit einem statischen Ereignis implementieren. Bei Interfaces gilt die Registrierung auch für auslösende Klassen, die erst nach dem Zeitpunkt der Registrierung geladen werden.

Zeitpunkt der Behandlung

Nach der Anweisung RAISE EVENT werden erst alle registrierten Behandlermethoden ausgeführt, bevor die nächste Anweisung bearbeitet wird (synchrone Ereignisbehandlung). Wenn eine Behandlermethode selber Ereignisse auslöst, werden erst deren Behandlermethoden ausgeführt, bevor die Programmausführung in der Behandlermethode fortgesetzt wird. Um endlose Rekursionen zu vermeiden ist die maximale Schachtelung von Ereignissen zur Zeit auf 64 beschränkt.

Die Reihenfolge in der die Behandlermethoden ausgeführt werden, richtet sich nach ihrer Registrierung. Da die Registrierung der Behandlermethoden dynamisch erfolgt, sollte man sich bei der synchronen Ereignisbehandlung aber auf keine Reihenfolge verlassen, sondern von der Annahme ausgehen dass alle Behandlermethoden gleichzeitig ausgeführt werden.

Siehe auch:

Übersichtsgrafiken zu Ereignissen

Einführendes Beispiel zu Ereignissen

Komplexes Beispiel zu Ereignissen

Ende des Inhaltsbereichs