Anfang des Inhaltsbereichs

Listenereignisse im ABAP-Programm Dokument im Navigationsbaum lokalisieren

Nach einer Benutzeraktion auf der Oberfläche einer Liste überprüft die ABAP-Laufzeitumgebung den Funktionscode, verarbeitet ihn entweder selbst (z.B. %EX oder %PC) oder löst das zugehörige Ereignis aus. Im Gegensatz zu normalen Dynpros, bei der das Ereignis PAI ausgelöst wird, löst die Laufzeitumgebung bei Listenereignissen drei spezielle Ereignisse aus. In den entsprechenden Ereignisblöcken des ABAP-Programms kann auf die Benutzeraktionen reagiert werden. Dabei ist der Funktionscode nur über das Feld SY-UCOMM zugänglich. Ein OK-Feld wird hier nicht versorgt.

Ereignisblöcke für die Funktionscodes PF<nn> (obsolet)

Wenn während der Listenverarbeitung ein Funktionscode PF<nn> (<nn> ist 01 bis 24) ausgewählt wird, wird immer das Ereignis AT PF<nn> ausgelöst. Im Standardlistenstatus sind sämtliche Funktionstasten der Tastatur F<nn> , die nicht für andere vordefinierte Systemfunktionen verwendet werden, mit den Funktionscodes PF<nn> belegt, falls im Programm ein entsprechender Ereignisblöcke definiert ist.

AT PF<nn>.
  <statements>.

Diese Ereignisblöcke werden bei Auswahl der zugehörigen Funktionstasten ausgeführt. Die Cursorposition auf der Liste ist dabei unbedeutend.

Solche Ereignisblöcke sollten, wenn überhaupt, nur für temporäre Testversionen verwendet werden. In produktiven Programmen sollte für die Belegung von Funktionstasten mit Funktionscodes ausschließlich das Ereignis AT USER-COMMAND in Verbindung mit eigenen Dialogstatus verwendet werden. Auf eigenen Oberflächen wird dem Benutzer die Funktionalität einer Aktion durch die Funktionstexte angezeigt. Diese Möglichkeit fehlt bei Benutzung obiger Ereignisblöcke.

Ereignisblock für den Funktionscode PICK

Wenn während der Listenverarbeitung der Funktionscode PICK ausgewählt wird, wird immer das Ereignis AT LINE-SELECTION ausgelöst, falls der Cursor auf einer Listenzeile positioniert ist. Der Funktionscode PICK ist standardmäßig mit der Funktionstaste F2 und dadurch mit der Doppelklick-Funktionalität der Maus verknüpft. Deshalb genügt es, in einfachen Programmen, die auf keine weiteren Benutzeraktionen reagieren müssen, nur diesen einzigen Ereignisblock vorzusehen.

AT LINE-SELECTION.
  <statements>.

Wie unter Dialogstatus für Listen beschrieben, bewirkt die Definition dieses Ereignisblocks automatisch eine Erweiterung des Standardlistenstatus um den Funktionscode PICK.

Falls PICK anderen Funktionstasten oder Menüeinträgen zugeordnet wird, führt auch deren Auswahl zum Ereignis AT LINE-SELECTION. Dies ist wegen der Semantik des Ereignisses her zu vermeiden.

Umgekehrt sollte man in aufwendigeren Programmen, die nicht nur auf Zeilenauswahl reagieren sollen, den Funktionscode PICK nicht verwenden, sondern der Taste F2 einen anderen Funktionscode zuordnen, damit möglichst alle Benutzeraktionen das Ereignis AT USER-COMMAND auslösen.

Ereignisblock für eigene Funktionscodes

Wenn während der Listenverarbeitung ein Funktionscode ausgewählt wird, der weder vom System verarbeitet wird, noch PICK oder PF<nn> ist, wird das Ereignis AT USER-COMMAND ausgelöst. Für solche Ereignisse muß ein eigener GUI-Status für Listen definiert werden. Um auf eigene Funktionscodes zu reagieren, muß folgender Ereignisblock im ABAP-Programm definiert werden.

AT USER-COMMAND.
  <statements>.

In diesem Ereignisblock können verschiedene Funktionscodes im Systemfeld SY-UCOMM durch IF- oder CASE-Kontrollstrukturen unterschieden werden. Die übrigen Systemfelder, die bei Listenereignissen gefüllt werden, wie SY-LSIND oder SY-PFKEY bieten weitere Unterscheidungsmöglichkeiten.

Listenereignisse programmgesteuert auslösen

Sämtliche Listenereignisse lassen sich statt durch Benutzeraktionen auf einer Liste auch wie folgt programmgesteuert auslösen

SET USER-COMMAND <fc>.

Diese Anweisung wirkt nach der Fertigstellung der aktuellen Liste. Vor der Anzeige dieser Liste wird das zum Funktionscode <fc> zugehörige Ereignis unabhängig vom verwendeten Dialogstatus ausgelöst.

Die Wirkung ist wie bei einer Benutzeraktion. Das heißt vordefinierte Listenfunktionscodes werden von der Laufzeitumgebung abgefangen und ausgeführt, bei den Funktionscodes PICK und PF<nn> werden die Ereignisse AT LINE-SELECTION bzw. AT PF<nn> ausgeführt, bei eigenen Funktionscodes wird der Ereignisblock AT USER-COMMAND ausgeführt.

Der Funktionscode PICK löst aber nur dann ein Ereignis aus, wenn der Cursor auf einer Listenzeile positioniert ist.

Mit dieser Anweisung in Verbindung mit für Systemfunktionen vordefinierten Funktionscodes lassen sich solche Funktionen also programmgesteuert aufrufen. Beispielsweise kann man zur aktuellen Liste durch SET USER-COMMAND '%SC' direkt das Dialogfenster zum Suchen aufrufen oder durch die Angabe der entsprechenden Funktionscodes die Liste vor ihrer Ausgabe positionieren.

Falls die Anweisung SET USER-COMMAND während der Erstellung einer Liste mehrmals verwendet wird, wirkt nur die letzte Anweisung.

Beispiele

Beispiel

Beispiel für AT LINE-SELECTION.

REPORT demo_list_at_line_selection.

START-OF-SELECTION.
  WRITE  'Basic List'.

AT LINE-SELECTION.
  WRITE: 'Secondary List by Line-Selection',
       / 'SY-UCOMM =', sy-ucomm.

Nach dem Starten des Programms erscheint die Grundliste mit dem Standardlistenstatus. Auf den Verzweigungslisten wird angezeigt, daß SY-UCOMM den Wert PICK hat.

Beispiel

Beispiel für AT PF<nn>.

REPORT demo_list_at_pf.

START-OF-SELECTION.
  WRITE 'Basic List, Press PF5, PF6, PF7, or PF8'.

AT pf5.
  PERFORM out.

AT pf6.
  PERFORM out.

AT pf7.
  PERFORM out.

AT pf8.
  PERFORM out.

FORM out.
  WRITE: 'Secondary List by PF-Key Selection',
       / 'SY-LSIND =', sy-lsind,
       / 'SY-UCOMM =', sy-ucomm.
ENDFORM.

Dieses Programm zeigt nach dem Start die Grundliste an. Der Standardlistenstatus dieser Grundliste erlaubt es dem Benutzer die Tasten F5 , F6 , F7 und F8 zu drücken, um Verzweigungslisten zu erzeugen. Erfolgt beispielsweise der 14. Tastendruck auf F6 , sieht die Ausgabe auf der angezeigten Verzweigungsliste wie folgt aus:

Secondary List by PF-Key Selection

SY-LSIND =  14

SY-UCOMM = PF06

Beispiel

Beispiel für AT USER-COMMAND.

REPORT demo_list_at_user_command NO STANDARD PAGE HEADING.

START-OF-SELECTION.
  WRITE: 'Basic List',
       / 'SY-LSIND:', sy-lsind.

TOP-OF-PAGE.
  WRITE 'Top-of-Page'.
  ULINE.

TOP-OF-PAGE DURING LINE-SELECTION.
  CASE sy-pfkey.
    WHEN 'TEST'.
      WRITE 'Self-defined GUI for Function Codes'.
      ULINE.
  ENDCASE.

AT LINE-SELECTION.
  SET PF-STATUS 'TEST' EXCLUDING 'PICK'.
  PERFORM out.
  sy-lsind = sy-lsind - 1.

AT USER-COMMAND.
  CASE sy-ucomm.
    WHEN 'FC1'.
      PERFORM out.
      WRITE / 'Button FUN 1 was pressed'.
    WHEN 'FC2'.
      PERFORM out.
      WRITE / 'Button FUN 2 was pressed'.
    WHEN 'FC3'.
      PERFORM out.
      WRITE / 'Button FUN 3 was pressed'.
    WHEN 'FC4'.
      PERFORM out.
      WRITE / 'Button FUN 4 was pressed'.
    WHEN 'FC5'.
      PERFORM out.
      WRITE / 'Button FUN 5 was pressed'.
  ENDCASE.
  sy-lsind = sy-lsind - 1.

FORM out.
  WRITE: 'Secondary List',
       / 'SY-LSIND:', sy-lsind,
       / 'SY-PFKEY:', sy-pfkey.
ENDFORM.

Nach dem Programmstart erscheint eine Grundliste mit selbstdefiniertem Seitenkopf:

Durch Auswählen einer Zeile über Doppelklick kann der Benutzer das Ereignis AT LINE-SELECTION auslösen. Hier wird der Status TEST gesetzt und der Funktionscode PICK deaktiviert. Der Status TEST enthält die Funktionscodes FC1 bis FC5 und diese belegen Drucktasten der Drucktastenleiste. Der Seitenkopf der Verzweigungslisten wird abhängig vom Status gesetzt.

Auf einer Verzweigungsliste löst ein Doppelklick auf eine Zeile kein Ereignis mehr aus. Dagegen stehen dem Benutzer jetzt fünf Tasten in der Drucktastenleiste zur Verfügung. Mit diesen löst er das Ereignis AT USER-COMMAND aus. Über die CASE-Anweisung reagiert das System unterschiedlich, wenn verschiedene Tasten gedrückt werden.

Dadurch, daß bei jedem interaktiven Ereignis SY-LSIND um eins verkleinert wird, wird die automatische Erhöhung aufgehoben und alle Verzweigungslisten haben die gleiche Stufe wie die Grundliste. Die Grundliste wird überschrieben. Während der Erstellung der Verzweigungslisten enthält SY-LSIND noch den Wert 1.

Beispiel

Beispiel für SET USER_COMMAND.

REPORT demo_list_set_user_command NO STANDARD PAGE HEADING.

START-OF-SELECTION.
  SET USER-COMMAND 'MYCO'.
  WRITE 'Basic List'.

AT USER-COMMAND.
  CASE sy-ucomm.
    WHEN 'MYCO'.
      WRITE 'Secondary List from USER-COMMAND,'.
      WRITE: 'SY-LSIND', sy-lsind.
      SET USER-COMMAND 'PF05'.
  ENDCASE.

AT pf05.
  WRITE 'Secondary List from PF05,'.
  WRITE: 'SY-LSIND', sy-lsind.
  SET CURSOR LINE 1.
  SET USER-COMMAND 'PICK'.

AT LINE-SELECTION.
  WRITE 'Secondary List from LINE-SELECTION,'.
  WRITE: 'SY-LSIND', sy-lsind.
  SET USER-COMMAND '%SC'.

Dieses Programm erzeugt eine Grund- und drei Verzweigungslisten. Nach dem Programmstart wird sofort die dritte Verzweigungsliste mit einem Dialogfenster zum Suchen in der Liste angezeigt. Letzteres wird durch den vordefinierten Funktionscode %SC bewirkt. Durch Zurück kann sich der Benutzer die vorhergehenden Listen anzeigen lassen.

Es ist zu beachten, daß beim Ereignis AT PF05 der Cursor mit der Anweisung SET CURSOR auf einer Listenzeile plaziert wird, um den Funktionscode PICK wirksam zu machen.

Ende des Inhaltsbereichs