Subscreens 

Die Subscreen-Technik erlaubt es, auf dem Bildschirmbild eines Dynpros zur Laufzeit andere Bildschirmbilder namens Subscreens einzublenden. Die hierfür vorgesehenen rechteckigen Bereiche auf dem Bildschirmbild des Haupt-Dynpros werden im Screen Painter auch mit Subscreens bezeichnet. Wir sprechen im folgenden von Subscreen-Bereichen. Die eingeblendeten Bildschirmbilder, d.h. die eigentlichen Subscreens, gehören zu speziellen Subscreen-Dynpros. Beim Einblenden von Subscreens wird auch die Ablauflogik der Subscreen-Dynpros eingebunden. Das Einbinden von Subscreens in Dynpros ist vergleichbar mit dem Einbinden von Include-Programmen in ABAP.

Das Einblenden von Subscreens erlaubt es, Dynpros zur Laufzeit dynamisch zu ergänzen. Die im Rahmen des Erweiterungskonzepts vorgedachten Dynpro-Exits basieren beispielsweise auf Subscreens. Auch die Einbindung anderer, komplexer Bildschirmelemente wie z.B. TabStrips basieren auf Subscreens.

Zur Verwendung der Subscreen-Technik müssen:

  1. Subscreen-Bereiche auf einem Bildschirmbild definiert werden.
  2. Passende Subscreen-Dynpros definiert werden.
  3. Die Subscreen-Dynpros dynamisch in die Subscreen-Bereiche eingebunden werden.

Definition von Subscreen-Bereichen

Die Definition von Subscreen-Bereichen erfolgt mit dem Screen Painter im Layout des Bildschirmbilds, auf dem Subscreens eingebettet werden sollen. Jeder Subscreen-Bereich eines Dynpros hat einen eindeutigen Namen, eine Position, Länge und Höhe. Subscreen-Bereiche können nicht überlappen und keine anderen Bildschirmelemente überdecken. Für einen Subscreen-Bereich kann mit den Resizing-Attributen festgelegt werden, ob er Größenänderungen des Haupt-Bildschirms in vertikaler oder horizontaler Richtung unterstützt, wobei eine Mindestgröße festgelegt werden kann. Falls die Resizing-Attribute markiert sind, führt eine Größenänderungen des Haupt-Bildschirms zum Ereignis PAI.

Definition von Subscreen-Dynpros

Subscreen-Dynpros können im gleichen oder einem anderen ABAP-Programm angelegt werden. Zum Anlegen eines Subscreen-Dynpros gibt man den Dynprotyp Subscreen in den Dynproattributen an. Als statisches Folgedynpro setzt man die Dynpronummer des Subscreens selbst. Die Größe des Bildschirmbilds sollte so gewählt werden, daß sie in den gewünschten Subscreen-Bereich paßt. Ansonsten wird ausgehend von der linken oberen Ecke nur ein Teil des Bildschirmbilds angezeigt.

Das Layout, die Elementliste und die Ablauflogik eines Subscreen-Dynpros werden wie bei einem normalen Dynpro erstellt. Insbesondere können Subscreen-Dynpros wiederum Subscreens einbinden. Es gelten aber folgende Einschränkungen:

Es können auch Selektionsbilder als Subscreens definiert werden.

Subscreens-Dynpros einbinden

Das Einbinden von Subscreen-Dynpros erfolgt mit der Anweisung CALL SUBSCREEN in der Ablauflogik des Haupt-Dynpros.

Um das Bildschirmbild eines Subscreen-Dynpros in den Subscreen-Bereich des Hauptdynpros einzubinden und um die PBO-Ablauflogik des Subscreen-Dynpros aufzurufen, schreibt man in der PBO-Ablauflogik des Haupt-Dynpros:

PROCESS BEFORE OUTPUT.
...
  CALL SUBSCREEN <area> INCLUDING [<prog>] <dynp>.
...

Diese Anweisung weist dem Subscreen-Bereich des Namens <area> das Subscreen-Dynpro mit der Nummer <dynp> zu. Optional kann das ABAP-Programm angegeben werden, in dem das Subscreen-Dynpro definiert ist. Ohne explizite Angabe des Programms wird das Subscreen-Dynpro im ABAP-Programm des Haupt-Dynpros gesucht. Wird kein Subscreen-Dynpro mit der angegebenen Nummer gefunden, kommt es zum Laufzeitfehler. Die PBO-Ablauflogik des Subscreen-Dynpros wird ebenfalls an der angegebenen Stelle eingebunden. Diese kann PBO-Module des ABAP-Programms aufrufen, in dem das Subscreen-Dynpro definiert ist. Am Ende werden die globalen Felder aus diesem Programm an die gleichnamigen Felder des Subscreen-Dynpros transportiert. Die eingebundene PBO-Ablauflogik des Subscreen-Dynpros kann selber wieder untergeordnete Subscreen-Dynpros einbinden.

Der Namen <area> Subscreen-Bereich muß direkt ohne Hochkommata angegeben werden. Die Namen <prog> und <dynp> können als Literal oder als Variable angegeben werden, wobei gleichnamige Variablen im zugehörigen ABAP-Programm deklariert und vorher versorgt werden müssen. Die Dynpronummer <dynp> muß vierstellig angegeben werden. Wird einem Subscreen-Bereich kein Subscreen-Dynpro zugewiesen, bleibt der Bereich leer.

Um die PAI-Ablauflogik des Subscreen-Dynpros aufzurufen, schreibt man in der PAI-Ablauflogik des Haupt-Dynpros:

PROCESS AFTER INPUT.
...
  CALL SUBSCREEN <area>.
...

Diese Anweisung bindet die PAI-Ablauflogik des Subscreen-Dynpros, das zum Zeitpunkt PBO im Subscreen-Bereich <area> eingebunden wurde, an der angegebenen Stelle ein. Diese kann PAI-Module des ABAP-Programms aufrufen, in dem das Subscreen-Dynpro definiert ist. Der Datentransport zwischen gleichnamigen Feldern des Subscreen-Dynpros und diesem ABAP-Programm erfolgt im Moment des Aufrufs, bzw. verzögert durch FIELD-Anweisungen in der PAI-Ablauflogik des Subscreen-Dynpros.

Die Anweisung CALL SUBSCREEN darf nicht zwischen CHAIN und ENDCHAIN oder LOOP und ENDLOOP (siehe Table Controls) stehen. Während der Verarbeitung eines Subscreen-Dynpros enthält das Systemfeld SY-DYNNR dessen Dynpronummer. Sein Inhalt wechselt also bei Ausführung der Anweiung CALL SUBSCREEN und bei der Rückkehr zur Verarbeitung des Haupt-Dynpros.

Beim Einbinden von Subscreen-Dynpros ist zu beachten, daß diese die Daten von Ein-/Ausgabefeldern prinzipiell von und zu dem ABAP-Programm transportieren, in dem sie definiert sind, während die Funktionscodes von Benutzeraktionen auf dem Dynpro immer in das OK-Feld des Haupt-Dynpros und gestellt und entsprechend in dessen ABAP-Programm transportiert werden. Die möglichen Funktionscodes verschiedener eingebundener Subscreen-Dynpros sollten deshalb unterscheidbar sein.

Wenn Subscreen-Dynpros aus Gründen der Kapselung in anderen ABAP-Programmen als das Haupt-Dynpro definiert werden, muß man vor Aufruf ihrer PBO-Ablauflogik und entsprechend nach Aufruf ihrer PAI-Ablauflogik dafür sorgen, daß die gewünschten globalen Daten ihrer ABAP-Programme in das Programm des aufrufenden Dynpros transportiert werden:

Beispiel

Subscreens.

REPORT demo_dynpro_subscreens.

DATA: ok_code TYPE sy-ucomm,
      save_ok TYPE sy-ucomm.
DATA: number1(4) TYPE n VALUE '0110',
      number2(4) TYPE n VALUE '0130',
      field(10) TYPE c, field1(10) TYPE c, field2(10) TYPE c.

CALL SCREEN 100.
MODULE status_100 OUTPUT.
  SET PF-STATUS 'SCREEN_100'.
ENDMODULE.

MODULE fill_0110 OUTPUT.
  field = 'Eingabe 1'(001).
ENDMODULE.

MODULE fill_0120 OUTPUT.
  field = field1.
ENDMODULE.

MODULE fill_0130 OUTPUT.
  field = 'Eingabe 2'(002).
ENDMODULE.

MODULE fill_0140 OUTPUT.
  field = field2.
ENDMODULE.

MODULE cancel INPUT.
  LEAVE PROGRAM.
ENDMODULE.

MODULE save_ok INPUT.
  save_ok = ok_code.
  CLEAR ok_code.
ENDMODULE.

MODULE user_command_0110 INPUT.
  IF save_ok = 'OK1'.
    number1 = '0120'.
    field1 = field.
    CLEAR field.
  ENDIF.
ENDMODULE.

MODULE user_command_0130 INPUT.
  IF save_ok = 'OK2'.
    number2 = '0140'.
    field2 = field.
    CLEAR field.
  ENDIF.
ENDMODULE.

MODULE user_command_100 INPUT.
  CASE save_ok.
    WHEN 'SUB1'.
      number1 = '0110'.
    WHEN 'SUB2'.
      number1 = '0120'.
      CLEAR field1.
    WHEN 'SUB3'.
      number2 = '0130'.
    WHEN 'SUB4'.
      number2 = '0140'.
      CLEAR field2.
  ENDCASE.
ENDMODULE.

Die statische Folgedynpronummer von Dynpro 100 ist 100 und sein Layout ist:

Es sind vier Drucktasten mit den Funktionscodes SUB1 bis SUB4 und zwei gleichgroße Subscreen-Bereiche AREA1 und AREA2 angelegt.

Im gleichen ABAP-Programm sind vier Subscreen-Dynpros 110 bis 140 definiert, die von der Größe her genau in obige Bereiche passen. Ihr Layout ist:

Die Ein-/Ausgabefelder aller vier Subscreen-Dynpros haben den Namen FIELD. Die Funktionscodes der Drucktasten auf den Subscreen-Dynpros 110 und 130 sind OK1 und OK2.

Die Bildschirmablauflogik von Dynpro 100 ist:

PROCESS BEFORE OUTPUT.
  MODULE status_100.
  CALL SUBSCREEN: area1 INCLUDING sy-repid number1,
                  area2 INCLUDING sy-repid number2.

PROCESS AFTER INPUT.
  MODULE cancel AT EXIT-COMMAND.
  MODULE save_ok.
  CALL SUBSCREEN: area1,
                  area2.
  MODULE user_command_100.

Die Bildschirmablauflogik der Subscreen-Dynpros 110 und 130 ist:

PROCESS BEFORE OUTPUT.
  MODULE fill_0110|0130.

PROCESS AFTER INPUT.
  MODULE user_command_0110|0130.

Die Bildschirmablauflogik der Subscreen-Dynpros 120 und 140 ist:

PROCESS BEFORE OUTPUT.
  MODULE fill_0120|0150.

PROCESS AFTER INPUT.

Bei Ausführung des Programms erhält der Benutzer einen Bildschirm, auf dem die Subscreens 110 und 130 eingeblendet sind. Er kann mit den Drucktasten des Haupt-Dynpros zwischen zwei Subscreen-Dynpros pro Subscreen-Bereich auswählen und durch die Drucktasten auf den Subscreen-Dynpros 110 und 130 Daten an die Subscreen-Dynpros 120 und 140 übergeben.

Da auf allen Subscreen-Dynpros der gleiche Feldname FIELD verwendet wird, wird das gleichnamige ABAP-Feld mehrmals pro Zeitpunkt PBO und PAI des Haupt-Dynpros transportiert. Im ABAP-Programm müssen die Werte deshalb in den Hilfsfeldern FIELD1 und FIELD2 zwischengespeichert werden.

Der Funktionscode der Drucktasten der Subscreen-Dynpros ist unterschiedlich und es genügt die normale Behandlung in einem ABAP-Feld. Bei gleichnamigen Funktionscodes hätte auch hier eine Behandlung mit mehreren Hilfsfeldern durchgeführt werden müssen.