Verzweigungslisten 

Bei der Verarbeitung von Ereignisblöcken, die nicht interaktiven Listenereignissen zugeordnet sind, und bei der Verarbeitung von Dialogmodulen schreibt ein ABAP Programm seine Listenausgaben in die sogenannte Grundliste.

Das ABAP-Systemfeld SY-LSIND enthält immer den aktuellen Index der Liste, die gerade erstellt wird. Während der Erstellung der Grundliste ist SY-LSIND gleich null.

Standardmäßig hat eine Grundliste einen Standardlistenstatus und einen Standardseitenkopf. Während der Erstellung der Grundliste können die Ereignisse TOP-OF-PAGE und END-OF-PAGE eintreten. Alle während dieser Ereignisse gemachten Ausgaben werden in den Seitenkopf bzw. Seitenfuß der Grundliste geschrieben. Bei ausführbaren Programmen wird die Grundliste nach Verarbeitung des Ereignisses END-OF-SELECTION automatisch an den Listenprozessor übergeben und ausgegeben. Ansonsten erfolgt die Anzeige nach dem PAI-Verarbeitungsblock des Dynpros, in dessen Dialogmodul LEAVE TO LIST-PROCESSING ausgeführt wurde.

Erzeugung von Verzweigungslisten

Jedesmal, der Benutzer auf einer Liste eine Aktion ausführt, wird von der Laufzeitumgebung überprüft, ob im ABAP-Programm ein zum Funktionscode passender Ereignisblock definiert ist. Gegebenenfalls wird der Listenindex SY-LSIND automatisch um eins erhöht und der entsprechende Ereignisblock ausgeführt. Sämtliche Ausgabeanweisungen die während der Ausführung des Ereignisblocks durchgeführt werden, stellen ihre Daten in eine neue Liste (Listenstufe) mit dem Index SY-LSIND. Voraussetzung zur Erstellung einer neuen Listenstufe ist also, daß der GUI-Status der Grundliste Benutzeraktionen ermöglicht und daß die entsprechenden Ereignisblöcke im Programm definiert sind.

Wir nennen alle Listen, die während eines interaktiven Listenereignisses erstellt werden, Verzweigungslisten oder Detaillisten. Bei jedem interaktiven Listenereignis wird eine neue Verzweigungsliste erzeugt. Ein ABAP-Programm kann außer der Grundliste bis zu 20 Verzweigungslisten verwalten. Erstellt der Benutzer eine Liste höherer Stufe, speichert das System die vorige Liste und zeigt die neue an. Es ist immer die gerade dargestellte Liste interaktiv nutzbar.

Nach der Verarbeitung des gesamten Ereignisblocks bzw. dessen Verlassen über EXIT bzw. CHECK, wird die Verzweigungsliste automatisch angezeigt. Sie überdeckt standardmäßig die vorhergehende Liste. Es können aber auch Listen in Dialogfenstern ausgegeben werden. Falls im Ereignisblock kein anderer Dialogstatus gesetzt wird, verwendet das System verwendet für Verzweigungslisten den Dialogstatus der vorhergehenden Listenstufe. Auf Verzweigungslisten wird aber kein Standardseitenkopf angezeigt (siehe unten).

Konsequenzen aus der Erzeugungsmethode

Daß Verzweigungslisten in Ereignisblöcken programmiert werden, hat wichtige Konsequenzen. Wie in Aufbau von ABAP-Programmen beschrieben, können Verarbeitungsblöcke nicht geschachtelt werden. Deshalb können in den Ereignisblöcken für interaktive Listen keine weiteren Listenereignisse bearbeitet werden.

Insbesondere kann

In Listen navigieren

Über die Auswahl von Zurück auf Verzweigungslisten kann der Benutzer von höheren zur nächstniedrigen Listenstufe zurücknavigieren. Dabei gibt das System die zuletzt angezeigte Liste frei und zeigt die Liste an, die vor dieser Liste erzeugt wurde. Der Inhalt der freigegeben Liste wird gelöscht.

Um zu beeinflussen, in welche Listenstufe die Ausgaben eines Ereignisblocks gestellt werden kann das Systemfeld SY-LSIND explizit gesetzt werden. Dies ist eine der wenigen Ausnahmen von der Regel, daß ABAP-Systemfelder nicht explizit überschrieben werden sollen. Es dürfen nur Werte angegeben werden, zu denen es auch Verzweigungslisten gibt. Alle schon vorhandenen Listenstufen mit einem Index höher oder gleich dem explizit gesetzten werden dabei gelöscht. Wird SY-LSIND insbesondere auf null gesetzt, werden alle vorhandenen Listen gelöscht, und die Grundliste wird mit der aktuellen Verzweigungsliste überschrieben.

Das System berücksichtigt eine Manipulation von SY-LSIND erst am Ende des Ereignisblocks für die darin erstellte Liste. Falls im Verarbeitungsblock mit Anweisungen gearbeitet wird, die durch einen INDEX-Zusatz (z.B. SCROLL) auf die Liste mit dem Index SY-LSIND zugreifen, sollte SY-LSIND immer erst nach diesen Anweisungen gesetzt werden, am besten immer erst als letzte Anweisung des Ereignisblocks.

Systemfelder für Verzweigungslisten

Nach jeder Benutzeraktion auf Listen sind folgende ABAP-Systemfelder im zugehörigen Ereignisblock wie folgt versorgt:

Systemfeld

Information

SY-LSIND

Index der Liste, die während dieses Ereignis erstellt wird (Grundliste = 0)

SY-LISTI

Index der Listenstufe, auf der das Ereignis ausgelöst wurde

SY-LILLI

Absolute Nummer der Zeile, auf der das Ereignis ausgelöst wurde

SY-LISEL

Inhalt der Zeile, auf der das Ereignis ausgelöst wurde

SY-CUROW

Position der Zeile im Fenster, auf der das Ereignis ausgelöst wurde (Zählung beginnt bei 1)

SY-CUCOL

Position der Spalte im Fenster, auf der das Ereignis ausgelöst wurde (Zählung beginnt bei 2)

SY-CPAGE

Seitennummer der obersten angezeigten Seite der Liste, auf der das Ereignis ausgelöst wurde

SY-STARO

Nummer der obersten Zeile der obersten angezeigten Seite der Liste, auf der das Ereignis ausgelöst wurde (Zählung beginnt bei 1). Gegebenenfalls befindet sich dort der Seitenkopf.

SY-STACO

Nummer der ersten angezeigten Spalte der Liste auf der das Ereignis ausgelöst wurde (Zählung beginnt bei 1)

SY-UCOMM

Funktionscode, der das Ereignis ausgelöst hat

SY-PFKEY

GUI-Status der angezeigten Liste

Seitenköpfe für Verzweigungslisten

Auf Verzweigungslisten zeigt das System keinen Standardseitenkopf an, und das Ereignis TOP-OF-PAGE wird nicht ausgelöst. Um Seitenköpfe für Verzweigungslisten zu erzeugen, muß TOP-OF-PAGE wie folgt erweitert werden:

TOP-OF-PAGE DURING LINE-SELECTION.

Dieses Ereignis wird beim Aufbau jeder Verzweigungsliste ausgelöst. Sollen für verschiedene Listenstufen verschiedene Seitenköpfe erzeugt werden, muß das im Verarbeitungsblock dieses Ereignisses entsprechend programmiert werden, z.B. durch die Abfrage von Systemfeldern wie SY-LSIND oder SY-PFKEY in Kontrollblöcken.

Wie bei der Grundliste bleibt der Seitenkopf von Verzweigungslisten beim vertikalen Blättern stehen.

Nachrichten auf Verzweigungslisten

ABAP bietet die allgemein Möglichkeit auf fehlerhafte oder fragwürdige Benutzereingaben durch das Senden von Nachrichten mit der MESSAGE-Anweisung zu reagieren, die den weiteren Programmverlauf je nach Schwere des gemachten Fehlers beeinflussen.

Während der Listenverarbeitung ist die Nachrichtenverarbeitung für die einzelnen Nachrichtentypen wie folgt:

Anzeige der Nachricht in einem Dialogfenster. Die gesamte Transaktion (z.B. SA38) wird nach der Bestätigung durch ENTER abgebrochen.

Anzeige der Nachricht in der Statuszeile. Nach der Bestätigung durch ENTER wird der aktuelle Ereignisblock abgebrochen und die Anzeige der vorhergehenden Listenstufe bleibt bestehen. Während der Erstellung der Grundliste wird das gesamte Programm abgebrochen.

Anzeige der Nachricht in einem Dialogfenster. Nach der Bestätigung durch ENTER wird die Verarbeitung hinter der MESSAGE-Anweisung Stelle wieder aufgenommen.

Anzeige der Nachricht in der Statuszeile der momentan erstellten Liste.

Dieser Nachrichtentyp löst einen Laufzeitfehler aus und erzeugt einen Kurzdump.

Verwendung von Verzweigungslisten

Ein klassischer Report ist ein Programm, das eine einzige Liste erzeugt. D.h. das Programm wird einmal gestartet und muß auf der erzeugten Liste alle gewünschten Detailinformationen ausgeben. Dies kann zu sehr umfangreichen Listen führen, aus denen sich der Benutzer die gewünschten Daten heraussuchen muß. Diese Art von Reportprogrammierung ist die einzig mögliche für die Hintergrundverarbeitung. Nach dem Start eines Hintergrundjobs gibt es keine Möglichkeit mehr, das Programm zu beeinflussen. Die gewünschten Selektionen müssen vorab für das Selektionsbild zusammengestellt werden und die Liste muß umfassende Informationen liefern.

Für Dialogsitzungen bestehen diese Einschränkungen nicht. Der Benutzer ist während der Programmausführung zugegen und kann steuernd in die Programmabläufe eingreifen. Um alle Vorteile einer Online-Umgebung zu nutzen, wurde das klassische Reporting zum interaktiven Reporting weiterentwickelt.

Interaktives Reporting emöglicht es, dem Benutzer die Datenbeschaffung und -darstellung während der Benutzersitzung aktiv zu steuern. Im interaktiven Reporting erstellt man statt einer umfassenden und detaillierten Liste eine verdichtete Grundliste, von der aus der Benutzer über Cursorpositionierung und Befehlseingaben Detailinformationen abrufen kann. Beim interaktiven Reporting wird die Datenbeschaffung somit auf die wirklich benötigten Daten beschränkt. Die Detailinformationen werden in Verzweigungslisten dargestellt.

Außer der Erstellung von Verzweigungslisten ermöglicht das interaktive Reporting natürlich auch den Aufruf von Transaktionen oder anderen ausführbaren Programmen (Reports) aus Listen heraus. Dabei können in der Liste angezeigte Werte als Startwerte für die Eingabefelder der aufgerufenen Programme verwendet werden. Zum Beispiel kann der Benutzer durch den reportgesteuerten Aufruf von Transaktionen Änderungen in den Datenbanktabellen durchführen, deren Daten in der Liste angezeigt werden.

Beispiele

Erzeugung von Verzweigungslisten.

REPORT demo_list_interactive_1.

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

AT LINE-SELECTION.
  WRITE: 'Secondary List, SY-LSIND =', sy-lsind.

Nach dem Programmstart erscheint die Grundliste. Der GUI-Status ermöglicht automatisch die Funktion Auswählen F2. Nach Auswählen einer Listenzeile wird das Ereignis AT LINE-SELECTION ausgelöst und die erste Verzweigungsliste überlagert die Grundliste. Diese Liste hat keinen Standardseitenkopf. Sie erbt den GUI-Status der Grundliste. Der Benutzer kann durch Auswählen nun bis zu 19 solcher Listen erstellen. Der Versuch, mehr als 19 Verzweigungslisten zu erstellen, führt zu einem Laufzeitfehler. Über Zurück kann der Benutzer zu vorhergehenden Listen zurücknavigieren.

Navigation in Verzweigungslisten.

REPORT demo_list_interactive_2.

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

AT LINE-SELECTION.
  IF sy-lsind = 3.
    sy-lsind = 0.
  ENDIF.
  WRITE: 'Secondary List, SY-LSIND =', sy-lsind.

Nach dem Programmstart wird die Grundliste angezeigt:

Basic List, SY-LSIND =    0

Der GUI-Status ermöglicht automatisch die Benutzeraktion Auswählen. Durch Positionierung des Cursors auf der Listenzeile und Auswählen wird das Ereignis AT LINE-SELECTION ausgelöst und eine Verzweigungsliste mit folgender Zeile erscheint:

Secondary List, SY-LSIND =    1

Wiederholtes Auswählen führt zu:

Secondary List, SY-LSIND =    2

Durch Zurück gelangt man zu den vorhergehenden Listenstufen. Wählt man dagegen wieder Auswählen, erscheint wegen der IF-Bedingung eine Verzweigungsliste mit folgender Zeile:

Secondary List, SY-LSIND =    0

Die Grundliste und die Listenstufen 1 und 2 sind gelöscht. Jetzt gelangt man über Zurück an die Stelle, von der die Listenverarbeitung gestartet wurde. Über Auswählen wird wieder eine erste Verzweigungsliste erstellt. Die Liste auf Listenstufe 0 ist keine Grundliste mehr (kein Seitenkopf), sondern hat die Eigenschaften einer Verzweigungsliste.

Seitenköpfe für Verzweigungslisten.

REPORT demo_list_interactive_3.

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

AT LINE-SELECTION.
  WRITE  'Secondary List'.

TOP-OF-PAGE DURING LINE-SELECTION.
  CASE sy-lsind.
    WHEN 1.
      WRITE 'First Secondary List'.
    WHEN 2.
      WRITE 'Second Secondary List'.
    WHEN OTHERS.
      WRITE: 'Secondary List, Level:', sy-lsind.
  ENDCASE.
  ULINE.

Nach dem Programmstart erscheint die Grundliste. Durch Auswählen kann der Benutzer Verzweigungslisten erzeugen. Die Verzweigungslisten enthalten von SY-LSIND abhängige Seitenköpfe.

Nachrichten auf Verzweigungslisten.

REPORT demo_list_interactive_4 NO STANDARD PAGE HEADING.

AT LINE-SELECTION.
  WRITE 'Basic List'.
  MESSAGE s888(sabapdocu) WITH text-001.

AT LINE-SELECTION.
  IF sy-lsind = 1.
    MESSAGE i888(sabapdocu) WITH text-002.
  ENDIF.
  IF sy-lsind = 2.
    MESSAGE e888(sabapdocu) WITH text-003 sy-lsind text-004.
  ENDIF.
  WRITE: 'Secondary List, SY-LSIND:', sy-lsind.

Nach dem Programmstart erscheint die Grundliste mit der Statusnachricht 100 in der Statuszeile. Durch Zeilenauswahl wird das Ereignis AT LINE-SELECTION ausgelöst. Während der Erstellung der ersten Verzweigungsliste wird ein Dialogfenster mit der Informationsnachricht 100 angezeigt. Die zweite Verzweigungsliste kann hier nicht erstellt werden, da die Nachricht 200 als Typ E ausgegeben wird: