Anfang des InhaltsbereichsProgrammgesteuerte Datenübergabe Dokument im Navigationsbaum lokalisieren

Zum Übergeben einzelner Ausgabefelder oder zusätzlicher Informationen einer Zeile an den zugehörigen Verarbeitungsblock während eines interaktiven Ereignisses verwendet man folgende Anweisungen:

Die HIDE-Anweisung ist eine der wesentlichen Anweisungen für das interaktive Reporting. Mit der HIDE-Technik definiert man schon während der Erstellung einer Listenstufe, welche Informationen an die nachfolgenden Verzweigungslisten weitergegeben werden sollen.

Mit den Anweisungen READ LINE und READ CURRENT LINE liest man gezielt die Daten aus Zeilen vorhandener Listenstufen. Diese Anweisung steht in engem Zusammenhang mit der HIDE-Technik.

Die Anweisungen GET CURSOR FIELD und GET CURSOR LINE ermöglichen es, entweder ein Ausgabefeld oder eine Ausgabezeile, auf denen der Cursor während einem interaktiven Ereignis positioniert war, in das ABAP-Programm zu übernehmen.

Die Anweisung DESCRIBE LIST erlaubt es, Eigenschaften von Listen, wie z.B. die Anzahl der Zeilen oder Seiten, in Variablen einzulesen.

Die folgenden Abschnitte beschreiben diese Anweisungen näher

Die HIDE-Technik

Mit der HIDE-Technik legt man während der Erstellung einer Listenstufe zeilenbezogene Informationen für den späteren Gebrauch ab. Hierzu verwendet man die Anweisung HIDE wie folgt:

HIDE <f>.

Diese Anweisung legt den Inhalt der Variable <f> bezogen auf die laufende Ausgabezeile (Systemfeld SY-LINNO) intern im sogenannten HIDE-Bereich ab. Die Variable <f> muß dafür nicht notwendigerweise selbst in der laufenden Zeile ausgegeben werden.

Um ein Programm übersichtlich zu halten, sollte die HIDE-Anweisung immer direkt hinter die Ausgabeanweisung für die Variable <f> oder die letzte Ausgabeanweisung für die laufende Zeile geschrieben werden.

Sobald eine Zeile, zu der HIDE-Felder abgespeichert wurden, ausgewählt wird, füllt das System diese Variablen im Programm wieder mit den abgelegten Werten. Die Auswahl einer Zeile erfolgt

Bei jedem interaktiven Ereignis werden die HIDE-Felder der Zeile, auf der zum Zeitpunkt des Ereignisses der Cursor steht, mit den abgespeicherten Werten gefüllt.

Man kann sich den HIDE-Bereich als eine Tabelle vorstellen, in der zu jeder Listen- und Zeilennummer die Namen und Werte aller HIDE-Felder abgelegt und bei Bedarf wieder gelesen werden.

Das folgende Beispiel faßt einige der wesentlichen Merkmale des interaktiven Reporting zusammen. Aus zusammenfassenden Informationen einer Grundliste wird mit Hilfe der HIDE-Technik zu immer detaillierteren Informationen auf Folgelisten verzweigt.

Beispiel

Das folgende Programm sei mit der logischen Datenbank F1S verknüpft.

REPORT demo_list_hide NO STANDARD PAGE HEADING.

TABLES: spfli, sbook.

DATA: num TYPE i,
      dat TYPE d.

START-OF-SELECTION.
  num = 0.
  SET PF-STATUS 'FLIGHT'.

GET spfli.
  num = num + 1.
  WRITE: / spfli-carrid, spfli-connid,
           spfli-cityfrom, spfli-cityto.
  HIDE:    spfli-carrid, spfli-connid, num.

END-OF-SELECTION.
  CLEAR num.

TOP-OF-PAGE.
  WRITE 'List of Flights'.
  ULINE.
  WRITE 'CA  CONN FROM                 TO'.
  ULINE.

TOP-OF-PAGE DURING LINE-SELECTION.
  CASE sy-pfkey.
    WHEN 'BOOKING'.
      WRITE sy-lisel.
      ULINE.
    WHEN 'WIND'.
      WRITE:  'Booking', sbook-bookid,
           /  'Date   ', sbook-fldate.
      ULINE.
  ENDCASE.

AT USER-COMMAND.
  CASE sy-ucomm.
    WHEN 'SELE'.
      IF num NE 0.
        SET PF-STATUS 'BOOKING'.
        CLEAR dat.
        SELECT * FROM sbook WHERE carrid = spfli-carrid
                            AND   connid = spfli-connid.
          IF sbook-fldate NE dat.
            dat = sbook-fldate.
            SKIP.
            WRITE / sbook-fldate.
            POSITION 16.
          ELSE.
            NEW-LINE.
            POSITION 16.
          ENDIF.
          WRITE sbook-bookid.
          HIDE: sbook-bookid, sbook-fldate, sbook-custtype,
                sbook-smoker, sbook-luggweight, sbook-class.
        ENDSELECT.
        IF sy-subrc NE 0.
          WRITE / 'No bookings for this flight'.
        ENDIF.
        num = 0.
        CLEAR sbook-bookid.
      ENDIF.
    WHEN 'INFO'.
      IF NOT sbook-bookid IS INITIAL.
        SET PF-STATUS 'WIND'.
        SET TITLEBAR 'BKI'.
        WINDOW STARTING AT 30 5 ENDING AT  60 10.
        WRITE: 'Customer type   :', sbook-custtype,
             / 'Smoker          :', sbook-smoker,
             / 'Luggage weigtht :', sbook-luggweight UNIT 'KG',
             / 'Class           :', sbook-class.
      ENDIF.
  ENDCASE.

Zum Zeitpunkt START-OF-SELECTION wird der Status FLIGHT für die Grundliste gesetzt. Im Status FLIGHT seien die Funktionstaste F2 und eine Drucktaste mit dem Funktionscode SELE (Text SELECT) belegt. Dadurch führen die Benutzeraktionen Doppelklick, Drücken auf F2 bzw. Drucktaste SELECT alle zum Ereignis AT USER-COMMAND.

Die drei Felder SPFLI-CARRID, SPFLI-CONNID und NUM werden während der Erstellung der Grundliste in den HIDE-Bereich geschrieben. Nach Auswahl einer Zeile erscheint die unter AT USER-COMMAND zum Funktionscode SELE definierte Verzweigungsliste. Beim Ereignis AT USER-COMMAND werden alle abgelegten HIDE-Felder der ausgewählten Zeile wieder geladen. Über NUM wird überprüft, ob eine Zeile der eigentlichen Liste ausgewählt wurde. Die Verzweigungsliste erhält den Status BOOKING, in der F2 mit dem Funktionscode INFO (Text: Booking Information) belegt wird. Auf der Verzweigungsliste werden Daten dargestellt, die mit Hilfe der HIDE-Felder der Grundliste selektiert werden. Zu jeder ausgegebenen Listenzeile werden zusätzliche Informationen im HIDE-Bereich abgelegt.

Eine Zeilenauswahl auf der Verzweigungsliste führt zur Anzeige der abgelegten Informationen in einem Dialogfenster mit dem Status WIND. Für den Status WIND sind die Voreinstellungen des Statustyps Dialogfenster mit Abgleich für Listenstatus übernommen worden. Die Gültigkeit der Zeilenauswahl wird anhand SBOOK-BOOKID überprüft.

Sämtliche Seitenköpfe und die Titelleiste des Dialogfensters werden im Programm gesetzt.

Zeilen aus Listen lesen

Alle von einen ABAP-Programm nacheinander erzeugten Listen werden vom System intern gespeichert. Daher kann man im Programm auf jede Liste zugreifen, die zum aktuellen Dynpro erzeugt und noch nicht durch Rückkehr zu einer vorhergehenden Ebene gelöscht wurde. Zum Lesen von Zeilen dienen die Anweisungen READ LINE und READ CURRENT LINE.

Um eine Zeile nach einem interaktiven Listenereignis aus einer Liste zu lesen, verwendet man die Anweisung READ LINE wie folgt:

READ LINE <lin> [INDEX <idx>]
                [FIELD VALUE <f1> [INTO <g1>] ... <fn> [INTO <gn>]]
                [OF CURRENT PAGE|OF PAGE <p>].

Ohne Zusätze stellt diese Anweisung den Inhalt der Zeile <lin> aus der Liste, auf der das Ereignis stattgefunden hat (Index SY-LILLI), in das Systemfeld SY-LISEL und lädt alle HIDE-Informationen, die zu dieser Zeile abgelegt wurden zurück in die entsprechenden Felder. Bezogen auf SY-LISEL und den HIDE-Bereich wirkt READ LINE also wie eine interaktive Auswahl der Zeile.

Ist die ausgewählte Zeile <lin> vorhanden, wird SY-SUBRC auf null, ansonsten auf vier gesetzt.

Die verschiedenen Zusätze haben folgende Wirkung:

Das System liest die Informationen zur Zeile <lin> aus der Liste der Stufe <idx>.

Das System interpretiert die Ausgabewerte der Variablen <f i > in der Zeile <lin> als Zeichenketten und stellt sie unter Einbehaltung der Konvertierungsregeln entweder wieder in die gleichen Felder <f i > oder beim Gebrauch von INTO in die Felder <g i >.

Felder, die in einer Zeile nicht vorkommen, lassen das Zielfeld unverändert. Bei Mehrachausgaben eines Felds in einer Liste wird nur das erste Vorkommen berücksichtigt.

Der Feldinhalt wird in seinem Ausgabeformat transportiert, also einschließlich aller Aufbereitungszeichen. Dabei können unter Umständen Tausendertrennzeichen in Dezimalzeichen verwandelt werden oder sonstige Unverträglichkeiten auftreten.

Dieser Zusatz dient hauptsächlich dazu, die Benutzereingaben in eingabebereiten Listenfeldern zu verarbeiten, da Sie diese nicht mit der HIDE-Technik handhaben können.

Mit diesem Zusatz bedeutet <lin> nicht die Nummer der Zeile in der Gesamtliste, sondern die Nummer der Zeile bezogen auf die oberste angezeigte Seite der adressierten Liste . Die entsprechende Seitennummer ist in SY-CPAGE abgespeichert.

Mit diesem Zusatz bedeutet <lin> nicht die Nummer der Zeile in der Gesamtliste, sondern die Nummer der Zeile bezogen auf die Seite <p> der adressierten Liste.

Um eine Zeile zweimal hintereinander zu lesen verwendet man die Anweisung READ CURRENT LINE wie folgt:

READ CURRENT LINE [FIELD VALUE <f1> [INTO <g1>] ...].

Diese Anweisung liest eine zuvor bei einem interaktiven Ereignis ( F2 ) oder durch READ LINE gelesene Zeile. Der Zusatz FIELD VALUE arbeitet wie für READ LINE beschrieben.

Dadurch hat man z.B. die Möglichkeit je nach Inhalt der gelesenen Zeile Felder programmgesteuert nochmals aus der gleichen Zeile zu füllen.

Beispiel

Das folgende Programm ist mit der logischen Datenbank F1S verknüpft.

REPORT demo_list_read_line NO STANDARD PAGE HEADING.

TABLES: sflight.

DATA: box(1) TYPE c, lines TYPE i, free TYPE i.

START-OF-SELECTION.
  SET PF-STATUS 'CHECK'.

GET sflight.
  WRITE: box AS CHECKBOX, sflight-fldate.
  HIDE: sflight-fldate, sflight-carrid, sflight-connid,
        sflight-seatsmax, sflight-seatsocc.

END-OF-SELECTION.
  lines = sy-linno - 1.

TOP-OF-PAGE.
  WRITE: 'List of flight dates'.
  ULINE.

TOP-OF-PAGE DURING LINE-SELECTION.
  WRITE:  'Date:', sflight-fldate.
  ULINE.

AT USER-COMMAND.
  CASE sy-ucomm.
    WHEN 'READ'.
      box = space.
      SET PF-STATUS 'CHECK' EXCLUDING 'READ'.
      DO lines TIMES.
        READ LINE sy-index FIELD VALUE box.
        IF box = 'X'.
          free = sflight-seatsmax - sflight-seatsocc.
          IF free > 0.
            NEW-PAGE.
            WRITE: 'Company:', sflight-carrid,
                   'Connection: ',sflight-connid,
                 / 'Number of free seats:', free.
          ENDIF.
        ENDIF.
      ENDDO.
  ENDCASE.

Nach Anzeige des Selektionsbilds erscheint eine Grundliste, auf welcher der Benutzer Ankreuzfelder ausfüllen kann.Der selbstdefnierte Seitenkopf der Grundliste verwendet die Parameter CITY_FR und CITY_TO. Diese Parameter sind in der logischen Datenbank F1S definiert.

Das Programm verwendet den Status CHECK, bei dem der Funktionscode READ (Text Read Lines) die Funktionstaste F5 und eine Taste in der Drucktastenleiste belegt. Nach der entsprechenden Benutzeraktion werden zum Zeitpunkt AT USER-COMMAND alle Zeilen der Grundliste über READ LINE in einer DO-Schleife gelesen. Dabei werden alle zuvor mit HIDE abgelegten Werte für jede Zeile in die zugehörigen Felder gestellt. Das Ankreuzfeld BOX wird durch die Option FIELD VALUE zusätzlich gelesen. Zu jeder angekreuzten Zeile werden falls noch Plätze frei sind Fluggesellschaft, Verbindungsnummer und die Anzahl der freien Plätze in eine Verzweigungsliste geschrieben.

Für jede Ausgabe wird eine neue Seite mit eigenem Seitenkopf angelegt. Auf der Verzweigungsliste wird der Funktionscode READ mit dem EXCLUDING-Zusatz der Anweisung SET PF-STATUS deaktiviert.

Nach der Rückkehr aus der Verzweigungsliste, sind die Ankreuzfelder weiterhin gefüllt.

Listen an Cursorposition lesen

Um Informationen über die Cursorposition während eines interaktiven Ereignisses zu erhalten, verwendet man die Anweisung GET CURSOR. Diese Anweisung kann entweder feld- oder zeilenbezogen verwendet werden.

Für feldbezogene Informationen verwendet man folgende Variante:

GET CURSOR FIELD <f> [OFFSET <off>] [LINE <lin>]
                     [VALUE <val>] [LENGTH <len>].

Diese Anweisung überträgt den Namen des Felds, auf dem der Cursor während einer Benutzeraktion steht, in die Variable <f>. Falls der Cursor auf einem Feld steht wird SY-SUBRC auf 0, ansonsten auf 4 gesetzt.

Felder, deren Namen übertragen wird, können globale Variable, Konstanten, Feldsymbole oder Referenzparameter von Unterprogrammen sein. Bei Literalen, lokalen Feldern und VALUE-Parametern von Unterprogrammen, wird SY-SUBRC zwar auf 0 gesetzt, als Name aber SPACE übertragen.

Die verschiedenen Zusätze haben folgende Wirkung:

Das Feld <off> enthält die Position des Cursors innerhalb des Feldes. Dabei ergibt der Cursor auf der ersten Spalte <off> = 0.

Das Feld <lin> enthält die Nummer der Listenzeile, auf der der Cursor steht (SY-LILLI).

Das Feld <val> enthält die Zeichenkettendarstellung des Feldes auf dem der Cursor steht im Ausgabeformat, also inklusive Aufbereitungszeichen.

Das Feld <len> enthält die Ausgabelänge des Feldes auf dem der Cursor steht.

Für zeilenbezogene Informationen verwendet man folgende Variante:

GET CURSOR LINE <lin> [OFFSET <off>] [VALUE <val>] [LENGTH <len>].

Diese Anweisung überträgt die Nummer der Zeile, auf der der Cursor während einer Benutzeraktion steht, in die Variable <lin>. Falls der Cursor auf einer Listenzeile steht wird SY-SUBRC auf 0, ansonsten auf 4 gesetzt. Man kann diese Anweisung verwenden, um z.B. ungültige Zeilenauswahlen abzufangen.

Die verschiedenen Zusätze haben folgende Wirkung:

Das Feld <off> enthält die Position des Cursors innerhalb der Listenzeile. Dabei ergibt der Cursor auf der ersten Spalte <off> = 0.

Das Feld <val> enthält die Zeichenkettendarstellung (SY-LISEL) der Zeile auf der der Cursor steht im Ausgabeformat, also inklusive Aufbereitungszeichen.

Das Feld <len> enthält die Ausgabelänge der Zeile auf der der Cursor steht.

Beispiel

REPORT SAPMZTST NO STANDARD PAGE HEADING LINE-SIZE 40.

DATA: HOTSPOT(10) VALUE 'Click me!',
      F(10), OFF TYPE I, LIN TYPE I, VAL(40), LEN TYPE I.

FIELD-SYMBOLS <FS>.
ASSIGN HOTSPOT TO <FS>.
WRITE 'Demonstration of GET CURSOR statement'.
SKIP TO LINE 4.
POSITION 20.
WRITE <FS> HOTSPOT COLOR 5 INVERSE ON.

AT LINE-SELECTION.
  WINDOW STARTING AT 5 6 ENDING AT 45 20.
  GET CURSOR FIELD F OFFSET OFF
             LINE LIN VALUE VAL LENGTH LEN.
  WRITE: 'Result of GET CURSOR FIELD: '.
  ULINE AT /(28).
  WRITE: / 'Field: ', F,
         / 'Offset:', OFF,
         / 'Line:  ', LIN,
         / 'Value: ', (10) VAL,
         / 'Length:', LEN.
  SKIP.
  GET CURSOR LINE LIN OFFSET OFF VALUE VAL LENGTH LEN.
  WRITE: 'Result of GET CURSOR LINE: '.
  ULINE AT /(27).
  WRITE: / 'Offset:', OFF,
         / 'Value: ', VAL,
         / 'Length:', LEN.

In diesem Programm wird das Feld HOTSPOT dem Feldsymbol <FS> zugewiesen und als Hotspot auf dem Ausgabebild dargestellt. Positioniert der Benutzer den Cursor auf einer Listenzeile und wählt die Zeile aus, erscheint ein Dialogfenster, das die Resultate der Anweisungen GET CURSOR zum Zeitpunkt AT LINE-SELECTION ausgibt.

Bei Positionierung auf der Ausgabe des Feldsymbols steht nach GET CURSOR FIELD der Name des Felde, das dem Feldsymbol <FS> zugewiesen ist, in F und nicht der Name des Feldsymbols.

Attribute von Listen bestimmen

Falls man während der Arbeit mit Listenstufen Eigenschaften benötigt, die nicht während der Listenerstellung in Variablen gespeichert wurden, kann man die Anweisung DESCRIBE LIST verwenden.

Um die Anzahl der Zeilen oder Seiten einer Liste zu erhalten, verwendet man DESCRIBE LIST wie folgt:

DESCRIBE LIST NUMBER OF LINES|PAGES <n> [INDEX <idx>].

Diese Anweisung schreibt die Anzahl der Zeilen bzw. Seiten der Listenstufe mit dem Index <idx> in die Variable <n>. Falls keine Liste mit dem Index <idx> vorhanden ist, wird SY-SUBRC ungleich 0, ansonsten gleich 0 gesetzt.

Um die Seitenzahl zu einer bestimmten Zeilennummer zu erhalten, verwendet man DESCRIBE LIST wie folgt:

DESCRIBE LIST LINE <lin> PAGE <pag> [INDEX <idx>].

Diese Anweisung schreibt für die Listenstufe <idx> die Seitenzahl, auf der die Listenzeile der Nummer <lin> steht, in die Variable <pag>. SY-SUBRC wird wie folgt gesetzt: falls keine Liste mit dem Index <idx> vorhanden ist, auf 8; falls keine Zeile mit der Nummer <lin> vorhanden ist auf 4; ansonsten auf 0.

Um die Eigenschaften einer bestimmten Seite zu erhalten, verwendet man DESCRIBE LIST wie folgt:

DESCRIBE LIST PAGE <pag> [INDEX <idx>] [<options>]

Diese Anweisung besorgt für die Listenstufe <idx> die in <options> angegebenen Eigenschaften der Seite <pag>. SY-SUBRC wird wie folgt gesetzt: falls keine Liste mit dem Index <idx> vorhanden ist, auf 8; falls keine Seite mit der Nummer <pag> vorhanden ist auf 4; ansonsten auf 0.

Die Anweisung hat folgende Zusätze <options>:

schreibt die Seitenbreite in die Variable <col>.

schreibt die Seitenlänge in die Variable <len>.

schreibt die Anzahl der ausgegebenen Zeilen in die Variable <lin>.

schreibt die absolute Nummer der ersten Zeile in die Variable <lin1>.

schreibt die Anzahl der Zeilen im Seitenkopf in die Variable <top>.

schreibt die Anzahl der Zeilen in der Listenüberschrift des Standardseitenkopfs in die Variable <tit>.

schreibt die Anzahl der Zeilen in der Spaltenüberschrift des Standardseitenkopfs in die Variable <head>.

schreibt die Anzahl der Zeilen im Seitenfuß in die Variable <end>.

Man verwende DESCRIBE LIST möglichst nur für fertiggestellte Listen, da bei Listen, die gerade erstellt werden (Index SY-LSIND), manche Eigenschaften noch nicht aktualisiert sind.

Beispiel

REPORT demo_list_describe_list NO STANDARD PAGE HEADING
                               LINE-SIZE 40 LINE-COUNT 5(1).

DATA: lin TYPE i, pag TYPE i,
      col TYPE i, len TYPE i, lin1 TYPE i,
      top TYPE i, tit TYPE i, head TYPE i, end TYPE i.

DO 4 TIMES.
  WRITE / sy-index.
ENDDO.

TOP-OF-PAGE.
  WRITE 'Demonstration of DESCRIBE LIST statement'.
  ULINE.

END-OF-PAGE.
  ULINE.

AT LINE-SELECTION.
  NEW-PAGE LINE-COUNT 0.
  WINDOW STARTING AT 1 13 ENDING AT 40 25.
  DESCRIBE LIST: NUMBER OF LINES lin INDEX 0,
                 NUMBER OF PAGES pag INDEX 0.
  WRITE: 'Results of DESCRIBE LIST: '.
  ULINE AT /(25).
  WRITE: / 'Lines: ', lin,
         / 'Pages: ', pag.
  SKIP.
  DESCRIBE LIST LINE sy-lilli PAGE pag INDEX 0.
  WRITE: / 'Line', (1) sy-lilli, 'is on page', (1) pag.
  SKIP.
  DESCRIBE LIST PAGE pag INDEX 0 LINE-SIZE   col
                                 LINE-COUNT  len
                                 LINES       lin
                                 FIRST-LINE  lin1
                                 TOP-LINES   top
                                 TITLE-LINES tit
                                 HEAD-LINES  head
                                 END-LINES   end.
  WRITE: 'Properties of Page', (1) pag, ':',
       / 'Width:       ',  col,
       / 'Length:      ',  len,
       / 'Lines:       ',  lin,
       / 'First Line:  ',  lin1,
       / 'Page Header: ',  top,
       / 'Title Lines: ',  tit,
       / 'Header Lines:',  head,
       / 'Footer Lines:',  end.

Dieses Programm erzeugt eine zweiseitige Liste von jeweils 5 Zeilen. Zwei Zeilen werden für den selbstdefinierten Seitenkopf, eine Zeile für den Seitenfuß verwendet. Wählt der Benutzer eine Zeile, erscheint ein Dialogfenster, das die Eigenschaften der Liste anzeigt.

Während der Erstellung der Verzweigungsliste werden alle Varianten der Anweisung DESCRIBE LIST auf die Grundliste angewendet und die Ergebnisse im Dialogfenster dargestellt. Dabei werden die zu beschreibenden Zeilen und Seiten dynamisch über SY-LILLI adressiert.

Ende des Inhaltsbereichs