Anfang des Inhaltsbereichs

Komplexes Beispiel zu Ereignissen Dokument im Navigationsbaum lokalisieren

Das folgende Beispiel zeigt die Deklaration, den Aufruf und die Behandlung von Ereignissen in ABAP Objects.

Überblick

In diesem Beispiel wird mit der unten abgebildeten Interaktiven Liste gearbeitet, auf der Benutzeraktionen zu Ereignissen in ABAP Objects führen. Die Liste und ihre Daten werden in einer Klasse C_LIST realisiert. Zur Verarbeitung der Benutzeraktionen dient die Klasse STATUS, die zum Zeitpunkt AT USER-COMMAND ein Ereignis BUTTON_CLICKED auslöst. Das Ereignis wird in der Klasse C_LIST behandelt. Die Klasse C_LIST enthält pro Listenzeile ein Objekt der Klassen C_SHIP oder C_TRUCK, die beide das Interface I_VEHICLE implementieren. Wenn sich die Geschwindigkeit eines dieser Objekte ändert, wird das Ereignis SPEED_CHANGE ausgelöst, auf das wiederum die Klasse C_LIST reagiert, um die Listenausgabe anzupassen.

Diese Grafik wird im zugehörigen Text erklärt

Einschränkung

Achtung

Die ABAP-Anweisungen zur Listenverarbeitungen stehen in ABAP-Objects noch nicht in vollem Umfang zur Verfügung. Um einfache Testausgaben zu erstellen, können jedoch folgende Anweisungen verwendet werden:

Beachten Sie, daß insbesondere die Funktionalität von Aufbereitungsoptionen und interaktiver Listenverarbeitung im derzeitigne Zustand nicht garantiert ist und sich zum nächsten Release inkompatibel ändern kann.

Deklarationen

 

Das Beispiel ist mit lokalen Interfaces und Klassen realisiert. Es folgen die Deklarationen des Interfaces und der verwendeten Klassen:

*****************************************************************
* Interface and Class declarations
*****************************************************************

INTERFACE i_vehicle.

  DATA     max_speed TYPE i.

  EVENTS speed_change EXPORTING VALUE(new_speed) TYPE i.

  METHODS: drive,
           stop.

ENDINTERFACE.

*----------------------------------------------------------------

CLASS c_ship DEFINITION.

  PUBLIC SECTION.

  METHODS constructor.

  INTERFACES i_vehicle.

  PRIVATE SECTION.

  ALIASES max FOR i_vehicle~max_speed.

  DATA ship_speed TYPE i.

ENDCLASS.

*----------------------------------------------------------------

CLASS c_truck DEFINITION.

  PUBLIC SECTION.

  METHODS constructor.

  INTERFACES i_vehicle.

  PRIVATE SECTION.

  ALIASES max FOR i_vehicle~max_speed.

  DATA truck_speed TYPE i.

ENDCLASS.

*----------------------------------------------------------------

CLASS status DEFINITION.

  PUBLIC SECTION.

   CLASS-EVENTS button_clicked EXPORTING VALUE(fcode) LIKE sy-ucomm.

  CLASS-METHODS: class_constructor,
                user_action.

ENDCLASS.

*----------------------------------------------------------------

CLASS c_list DEFINITION.

  PUBLIC SECTION.

  METHODS: fcode_handler FOR EVENT button_clicked OF status
                             IMPORTING fcode,
           list_change   FOR EVENT speed_change OF i_vehicle
                             IMPORTING new_speed,
           list_output.

  PRIVATE SECTION.

  DATA: id TYPE i,
        ref_ship  TYPE REF TO c_ship,
        ref_truck TYPE REF TO c_truck,

        BEGIN OF line,
          id TYPE I,
          flag(1) TYPE c,
          iref  TYPE REF TO i_vehicle,
          speed TYPE i,
        END OF LINE,
        LIST LIKE SORTED TABLE OF line WITH UNIQUE KEY id.

ENDCLASS.

*****************************************************************

 

In diesem Beispiel werden folgende Ereignisse deklariert:

Die Klasse C_LIST enthält Ereignisbehandlermethoden für beide Ereignisse.

Beachten Sie, daß die Klasse STATUS keine Attribute enthält und daher nur mit statischen Methoden und Ereignissen arbeitet.

Implementierungen

Es folgen die Implementierungen der Methoden obiger Klassen:

*****************************************************************
* Implementations
*****************************************************************

CLASS c_ship IMPLEMENTATION.

  METHOD constructor.
    max = 30.
  ENDMETHOD.

  METHOD i_vehicle~drive.
    CHECK ship_speed < max.
    ship_speed = ship_speed + 10.
    RAISE EVENT i_vehicle~speed_change
                EXPORTING new_speed = ship_speed.
  ENDMETHOD.

  METHOD i_vehicle~stop.
    CHECK ship_speed > 0.
    ship_speed = 0.
    RAISE EVENT i_vehicle~speed_change
                EXPORTING new_speed = ship_speed.
  ENDMETHOD.

ENDCLASS.

*----------------------------------------------------------------

CLASS c_truck IMPLEMENTATION.

  METHOD constructor.
    max = 150.
  ENDMETHOD.

  METHOD i_vehicle~drive.
    CHECK truck_speed < max.
    truck_speed = truck_speed + 50.
    RAISE EVENT i_vehicle~speed_change
                EXPORTING new_speed = truck_speed.
  ENDMETHOD.

  METHOD i_vehicle~stop.
    CHECK truck_speed > 0.
    truck_speed = 0.
    RAISE EVENT i_vehicle~speed_change
                EXPORTING new_speed = truck_speed.
  ENDMETHOD.

ENDCLASS.

*----------------------------------------------------------------

CLASS status IMPLEMENTATION.

  METHOD class_constructor.
    SET pf-status 'VEHICLE'.
    WRITE 'Click a button!'.
  ENDMETHOD.

  METHOD user_action.
    RAISE event button_clicked EXPORTING fcode = sy-ucomm.
  ENDMETHOD.

ENDCLASS.

*----------------------------------------------------------------

CLASS c_list IMPLEMENTATION.

  METHOD fcode_handler .
    CLEAR line.
    CASE fcode.
      WHEN 'CREA_SHIP'.
        id = id + 1.
        CREATE OBJECT ref_ship.
        line-id = id.
        line-flag = 'c'.
        line-iref = ref_ship.
        APPEND line TO list.
      WHEN 'CREA_TRUCK'.
        id = id + 1.
        CREATE OBJECT ref_truck.
        line-id = id.
        line-flag = 'T'.
        line-iref = ref_truck.
        APPEND line TO list.
      WHEN 'DRIVE'.
        CHECK sy-lilli > 0.
        READ TABLE list INDEX sy-lilli INTO line.
        CALL METHOD line-iref->drive.
      WHEN 'STOP'.
        LOOP AT list INTO line.
          CALL METHOD line-iref->stop.
        ENDLOOP.
      WHEN 'CANCEL'.
        LEAVE PROGRAM.
    ENDCASE.
    CALL METHOD list_output.
  ENDMETHOD.

  METHOD list_change .
    line-speed = new_speed.
    MODIFY TABLE list FROM line.
  ENDMETHOD.

  METHOD list_output.
    sy-lsind = 0.
    SET TITLEBAR 'TIT'.
    LOOP AT list INTO line.
      IF line-flag = 'C'.
        WRITE / icon_ws_ship AS icon.
      ELSEIF line-flag = 'T'.
        WRITE / icon_ws_truck AS icon.
      ENDIF.
      WRITE: 'Speed = ', line-speed.
    ENDLOOP.
  ENDMETHOD.

ENDCLASS.

*****************************************************************

 

Die statische Methode USER_ACTION der Klasse STATUS löst das statische Ereignis BUTTON_CLICKED aus. Die Instanzmethoden I_VEHICLE~DRIVE und I_VEHICLE~STOP lösen das Instanzereignis I_VEHICLE~SPEED_CHANGE in den Klassen C_SHIP und C_TRUCK aus.

Verwendung in einem Programm

Das folgende Programm verwendet obige Klassen:

REPORT demo_abap_objects_events NO STANDARD PAGE HEADING.
*****************************************************************
* Global data of program
*****************************************************************

DATA list TYPE REF TO c_list.

*****************************************************************
* Program events
*****************************************************************

START-OF-SELECTION.

  CREATE OBJECT list.

  SET HANDLER: list->fcode_handler,
               list->list_change FOR ALL INSTANCES.

*----------------------------------------------------------------

AT USER-COMMAND.
  CALL METHOD status=>user_action.

*****************************************************************

Das Programm erzeugt ein Objekt der Klasse C_LIST und registriert die Ereignisbehandlermethode FCODE_HANDLER dieses Objekts für das Klassenereignis BUTTON_CLICKED der Klasse Status und die Ereignisbehandlermethode LIST_CHANGE für das Ereignis SPEED_CHANGE aller Instanzen, die das Interface I_VEHICLE implementieren.

 

 

Ende des Inhaltsbereichs