Anfang des Inhaltsbereichs

Table Controls: Beispiel mit Modifikationen Dokument im Navigationsbaum lokalisieren

Das folgende Beispiel verarbeitet einen Table Control mit LOOP mit paralleler Schleife über eine interne Tabelle. Das Sortieren nach Spalten und das Löschen von Zeilen aus der internen Tabelle ist über Funktionscodes möglich. Die Eingabebereitschaft der Table Control-Felder kann ebenfalls durch einen Funktionscode gesteuert werden.

Beispiel

REPORT demo_dynpro_tabcont_loop_at.

CONTROLS flights TYPE TABLEVIEW USING SCREEN 100.
DATA: cols LIKE LINE OF flights-cols,
lines TYPE i.

DATA: ok_code TYPE sy-ucomm,
      save_ok TYPE sy-ucomm.

DATA: itab TYPE TABLE OF demo_conn.

      TABLES demo_conn.

SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE itab.

LOOP AT flights-cols INTO cols WHERE index GT 2.
  cols-screen-input = '0'.
  MODIFY flights-cols FROM cols INDEX sy-tabix.
ENDLOOP.

CALL SCREEN 100.

MODULE status_0100 OUTPUT.
  SET PF-STATUS 'SCREEN_100'.
DESCRIBE TABLE itab LINES lines.
flights-lines = lines.
ENDMODULE.

MODULE cancel INPUT.
  LEAVE PROGRAM.
ENDMODULE.

MODULE read_table_control INPUT.
  MODIFY itab FROM demo_conn INDEX flights-current_line.
ENDMODULE.

MODULE user_command_0100 INPUT.
  save_ok = ok_code.
  CLEAR ok_code.
  CASE save_ok.
    WHEN 'TOGGLE'.
      LOOP AT flights-cols INTO cols WHERE index GT 2.
        IF  cols-screen-input = '0'.
          cols-screen-input = '1'.
        ELSEIF  cols-screen-input = '1'.
          cols-screen-input = '0'.
        ENDIF.
        MODIFY flights-cols FROM cols INDEX sy-tabix.
      ENDLOOP.
    WHEN 'SORT_UP'.
      READ TABLE flights-cols INTO cols WITH KEY selected = 'X'.
      IF sy-subrc = 0.
        SORT itab STABLE BY (cols-screen-name+10) ASCENDING.
        cols-selected = ' '.
        MODIFY flights-cols FROM cols INDEX sy-tabix.
      ENDIF.
    WHEN 'SORT_DOWN'.
      READ TABLE flights-cols INTO cols WITH KEY selected = 'X'.
      IF sy-subrc = 0.
        SORT itab STABLE BY (cols-screen-name+10) DESCENDING.
        cols-selected = ' '.
        MODIFY flights-cols FROM cols INDEX sy-tabix.
      ENDIF.
    WHEN 'DELETE'.
      READ TABLE flights-cols INTO cols
                              WITH KEY screen-input = '1'.
      IF sy-subrc = 0.
        LOOP AT itab INTO demo_conn WHERE mark = 'X'.
          DELETE itab.
        ENDLOOP.
      ENDIF.
  ENDCASE.
ENDMODULE.

Das Layout von Dynpro 100 ist:

Diese Grafik wird im zugehörigen Text erklärt

Es ist ein resizefähiges Table Control namens FLIGHTS definiert. Die Felder des Table Controls sind von der Struktur DEMO_CONN aus dem Dictionary übernommen worden. Die ersten beiden Spalten sind Führungsspalten. Die entsprechenden Felder sind Ausgabefelder. Es sind eine Titelleiste, Spaltenüberschriften und eine Markierspalte angelegt. Der Markierspalte ist die Komponente MARK vom Typ Character der Länge 1 aus der Struktur DEMO_CONN zugeordnet. Es können eine Spalte und mehrere Zeilen markiert werden.

Die Ablauflogik von Dynpro 100 ist:

PROCESS BEFORE OUTPUT.
  MODULE status_0100.
  LOOP AT itab INTO demo_conn WITH CONTROL flights.
  ENDLOOP.

PROCESS AFTER INPUT.
  MODULE cancel AT EXIT-COMMAND.
  LOOP AT itab.
    MODULE read_table_control.
  ENDLOOP.
  MODULE user_command_0100.

Es werden zu PBO und PAI jeweils eine Schleife über das Table Control FLIGHTS ausgeführt und parallel über die interne Tabelle ITAB des ABAP Programms ausgeführt. In der PBO-Schleife wird kein Modul zum Füllen des Table Controls aus der Tabelle ITAB des ABAP-Programms aufgerufen. In der PAI Schleife wird aber ein Modul zum Modifizieren der Tabelle ITAB aufgerufen.

Zu PBO wird die Komponente LINES der Control-Struktur FLIGHTS vor der PBO-Schleife explizit mit der aktuellen Anzahl von Zeilen in der internen Tabelle ITAB gefüllt um die Blätterleiste des Table Controls einzurichten.

In der PBO-Schleife wird im Modul FILL_TABLE_CONTROL der Arbeitsbereich DEMO_CONN mit Werten aus der internen Tabelle gefüllt, wobei der Zeilenindex der aktuellen Table Control-Zeile entspricht.

In der PAI-Schleife wird die Zeile der internen Tabelle, deren Zeilenindex der aktuellen Table Control-Zeile entspricht, mit dem Inhalt des Arbeitsbereichs DEMO_CONN überschrieben. Dadurch werden Benutzereingaben in die Eingabefelder des Controls in die interne Tabelle übernommen. Insbesondere enthält die interne Tabelle damit auch in ihrer Spalte MARK ein Flag, ob die Table Control-Zeile markiert ist oder nicht.

Nach der PAI-Schleife werden im Modul USER_COMMAND_0100 Benutzereingaben verarbeitet. Der GUI Status SCREEN_100 ermöglicht die entsprechenden Funktionscodes.

Beim Aufruf des Programms sind alle Felder des Table Control nicht eingabebereit. Die statischen Vorgaben des Table Controls im Screen Painter werden vor CALL SCREEN im Programm modifiziert. Es wird die Tabelle COLS in der Control-Struktur FLIGHTS verwendet. Alle Spalten mit Spaltenposition größer zwei werden in einer Schleife über die Tabelle FLIGHTS-COLS auf nicht eingabebereit gesetzt. Durch Auswahl des Funktionscodes TOGGLE kann die Eingabebereitschaft dieser Spalten ein und ausgeschaltet werden.

Mit den Funktionscodes SORT_UP und SORT_DOWN ist das auf- bzw. abwärts Sortieren der internen Tabelle ITAB nach markierten Spalten möglich. Durch die statischen Einstellungen des Table Controls kann immer nur eine Spalte markiert sein. Die markierte Spalte wird der internen Tabelle FLIGHTS-COLS entnommen. Der Name des Sortierkriteriums in der SORT-Anweisung wird dynamisch aus der Komponente COLS-SCREEN-NAME bestimmt. Dabei muß der Präfix DEMO_CONN- durch eine Offset-Angabe abgeschnitten werden. Nach der Sortierung wird die Markierung rückgängig gemacht, indem der Komponente SELECTED in der Tabelle FLIGHTS-COLS ein Leerzeichen zugewiesen wird.

Mit dem Funktionscode DELETE können markierte Zeilen aus der internen Tabelle ITABgelöscht werden. Zuerst wird in FLIGHTS-COLS überprüft, ob die Felder im Table Control eingabebereit sind. Dann werden in einer Schleife über die interne Tabelle ITAB alle markierten Zeilen gelöscht. Da das Table Control in der PBO-Schleife vollständig neu aus der internen Tabelle ITAB versorgt wird, werden die Zeilen auch auf dem Bildschirm gelöscht.

Ende des Inhaltsbereichs