Anfang des Inhaltsbereichs

Ereignisse auslösen und behandeln Dokument im Navigationsbaum lokalisieren

Ereignisse auslösen und Behandeln bedeuted in ABAP Objects, daß 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 muß eine Klasse

Ereignisse deklarieren

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

EVENTS <evt> EXPORTING... VALUE(<ei>) 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. Intanzereignisse 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... <ei> = <f i>...

Für sämtliche nicht optionalen Formalparameter <ei> des Ereignisses müssen mit dem EXPORTING-Zusatz Aktualparameter <f i> 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 muß eine Methode

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.. <ei>..

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 muß aber nicht alle Parameter übernehmen, die mit der Anweisung RAISE EVENT übergeben werden. Falls der implizite Parameter SENDER übernommen werden soll, muß 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, daß 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, muß zur Laufzeit festgelegt werden, auf welche Auslöser sie reagieren soll. Dies geschieht mit der Anweisung

SET HANDLER... <hi>... [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

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

Bei Instanzereignissen muß 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... <hi>...FOR <ref>.

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

SET HANDLER... <hi>...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... <hi>...

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 daß alle Behandlermethoden gleichzeitig ausgeführt werden.

Siehe auch:

Übersichtsgrafiken zu Ereignissen

Einführendes Beispiel zu Ereignissen

Komplexes Beispiel zu Ereignissen

Ende des Inhaltsbereichs