Bedingte Modulaufrufe 

Einfache Modulaufrufe werden in der Reihenfolge abgearbeitet, in der sie in der Dynproablauflogik aufgeführt sind. Die Syntax der Dynprosprache erlaubt es aber auch, PAI-Modulaufrufe von Bedingungen abhängig zu machen. Hierzu wird die Anweisung FIELD mit der Anweisung MODULE kombiniert. Es können Bedingungen auf einzelne oder mehrere Dynprofelder gesetzt werden. Mit bedingten Aufrufen kann überflüssiger Laufzeitbedarf verhindert werden. Insbesondere bei Zugriffen auf Datenbanktabellen können bedingte Aufrufe die Performance verbessern.

Bedingungen für einzelne Dynprofelder

Um ein PAI-Modul nur dann aufzurufen, wenn ein Dynprofeld eine bestimmte Bedingung erfüllt, schreibt man:

FIELD <f> MODULE <mod> ON INPUT|REQUEST|*-INPUT.

Die Zusätze haben folgende Wirkung:

Das Modul <mod> wird nur dann aufgerufen, wenn das Feld einen nicht initalen Wert enthält. Der Initialwert des Feldes wird durch seinen Datentyp bestimmt: Leerzeichen für Zeichenketten, Null für numerische Felder. Auch wenn der Benutzer als Eingabewert den Initialwert explizit eingibt, wird das Modul nicht aufgerufen. (Demgegenüber löst ON REQUEST in diesem Fall den Aufruf aus).

Das Modul <mod> wird nur dann aufgerufen, wenn der Benutzer eine Eingabe in das Feld gemacht hat. Als Eingabe gilt auch, wenn der Benutzer eine bereits vorhandene Eingabe mit dem gleichen Wert überschreibt oder explizit den Initialwert eingibt.

Die Bedingung ON REQUEST wird generell durch jegliche Form der Werteingabe ausgelöst. Neben Benutzereingaben gibt es folgende Möglichkeiten der Werteingabe, die das Modul aufrufen:

Das Modul <mod> wird aufgerufen, wenn der Benutzer einen * als erstes Zeichen des Felds eingegeben hat und wenn das Feld das Attribut * -Eingabe im Screen Painter hat. Bei der Übergabe des Eingabefelds wird der * entfernt. Auf die Bedingung ON INPUT wirkt eine * -Eingabe wie ein initiales Feld.

Die Funktionalität der FIELD-Anweisung zur Steuerung des Datentransports wirkt auch in Kombination mit der MODULE-Anweisung.

Bedingungen für mehrere Dynprofelder

Um ein oder mehrere PAI-Module nur dann aufzurufen, wenn mehrere Dynprofelder eine bestimmte Bedingung erfüllen, müssen die Aufrufe in der Dynproablauflogik zu einer Verarbeitungskette zusammengefaßt werden. Eine Verarbeitungskette definiert man durch die Anweisungen:

CHAIN.
 ...
ENDCHAIN.

Alle Anweisungen der Ablauflogik, die innerhalb CHAIN-ENDCHAIN stehen gehören zu einer Verarbeitungskette. Die Felder einzelner FIELD-Anweisungen einer Verarbeitungskette werden zusammengefaßt und können in gemeinsamen Bedingung abgefragt werden:

CHAIN.
  FIELD: <f1>, <f 2>,...
  MODULE <mod1> ON CHAIN-INPUT|CHAIN-REQUEST.
  FIELD: <g1>, <g 2>,...
  MODULE <mod2> ON CHAIN-INPUT|CHAIN-REQUEST.
 ...
ENDCHAIN.

Die Zusätze ON CHAIN-INPUT und ON CHAIN-REQUEST wirken wie die Zusätze ON INPUT und ON REQUEST für Einzelfelder, wobei hier ein Modul dann aufgerufen wird, wenn mindestens eines der zuvor in einer FIELD-Anweisung aufgeführten Felder der Vearbeitungskette die Bedingung erfüllt. <mod1> wird also aufgerufen, wenn eines der Felder <fi> die Bedingung erfüllt. <mod2> wird aufgerufen, wenn eines der Felder <f i> oder <g i> die Bedingung erfüllt.

Innerhalb einer Verarbeitungskette kann eine einzelne FIELD-Anweisung wiederum mit einer MODULE-Anweisung kombiniert werden, um eine Bedingung auf ein einzelnes Feld der Kette zu setzen:

CHAIN.
  FIELD: <f1>, <f 2>,...
  FIELD  <f> MODULE <mod1> ON  INPUT|REQUEST|*-INPUT
                              |CHAIN-INPUT|CHAIN-REQUEST.
  MODULE <mod2> ON CHAIN-INPUT|CHAIN-REQUEST.
ENDCHAIN.

Modul <mod1> wird aufgerufen, wenn Dynprofeld <f> die angegebene Bedingung für Einzelfelder erfüllt. Modul <mod2> wird aufgerufen, wenn eines der Dynprofelder <fi> oder <f> die Bedingung erfüllt. Falls der Zusatz ON CHAIN-INPUT oder ON CHAIN-REQUEST zusammen mit FIELD <f> verwendet wird, bezieht sich die Bedingung ebenfalls auf die gesamte Kette und Modul <mod1> wird wie Modul <mod2> aufgerufen.

In Fällen, in denen Bedingungen auf verschiedene Kombinationen von Dynprofeldern gesetzt werden sollen, empfiehlt es sich, separate Verarbeitungsketten für separate Feldkombinationen zu programmieren und darin verschiedene Module aufzurufen.

Die Funktionalität der FIELD-Anweisung zur Steuerung des Datentransports wirkt auch in Verarbeitungsketten. Ein Dynprofeld wird auch innerhalb einer Verarbeitungskette erst bei Bearbeitung der FIELD-Anweisung transportiert. Die mit CHAIN-ENDCHAIN definierten Verarbeitungsketten haben für die enthaltenen FIELDS-Anweisungen noch eine weitere Bedeutung, die im Zusammenhang mit Gültigkeitsüberprüfungen beschrieben wird.

Modulaufruf nach Cursorselektion

Es ist möglich, ein Modul nur dann aufzurufen, wenn der Cursor auf einem Bildschirmelement steht. Hierzu schreibt man:

MODULE <mod> AT CURSOR-SELECTION.

Das Modul <mod> wird genau dann aufgerufen, wenn der Funktionscode der Benutzeraktion CS mit Funktionstyp S ist. Falls diese Anweisung verwendet wird, empfiehlt es sich den Funktionscode CS der Funktionstaste F2 und dadurch der Doppelklick-Funktionalität der Maus zuzuordnen.

Der Aufruf erfolgt an dem durch die Ablauflogik definierten Zeitpunkt. Die automatischen Eingabeprüfungen werden nicht übergangen. Der Datentransport der Dynprofelder erfolgt so, wie er durch die FIELD-Anweisungen festgelegt ist. Der Funktionscode ist leer und SY-UCOMM und das OK-Feld werden nicht beeinflußt. Diese MODULE-Anweisung läßt sich auch mit der FIELD-Anweisung kombinieren:

FIELD <f> MODULE <mod> AT CURSOR-SELECTION.

oder für mehrere Felder:

CHAIN.
  FIELD: <f1>, <f 2>,...
  MODULE <mod> AT CURSOR-SELECTION.
ENDCHAIN.

Das Modul <mod> wird nur aufgerufen, wenn der Cursor auf einem Ein-/Ausgabefeld <f> bzw. einem Ein-/Ausgabefeld <fi> der Verarbeitungskette positioniert ist. Andere Bildschirmelemente außer Ein-/Ausgabefelder sind hier nicht möglich.

Die Ausführungshierarchie verschiedener Kombinationen ist:

Dabei ist es unerheblich, ob die Anweisungen innerhalb von CHAIN-ENDCHAIN stehen oder nicht.

Bedingte Modulaufrufe.

PROGRAM demo_dynpro_on_condition.

DATA: ok_code TYPE sy-ucomm,
      input1(20) TYPE c, input2(20) TYPE c, input3(20) TYPE c,
      fld(20) TYPE c.

CALL SCREEN 100.

MODULE init_screen_100 OUTPUT.
  SET PF-STATUS 'STATUS_100'.
ENDMODULE.

MODULE cancel INPUT.
  LEAVE PROGRAM.
ENDMODULE.

MODULE cursor INPUT.
  GET CURSOR FIELD fld.
  MESSAGE i888(sabapdocu) WITH text-001 fld.
ENDMODULE.

MODULE module_1 INPUT.
  MESSAGE i888(sabapdocu) WITH text-002.
ENDMODULE.

MODULE module_2 INPUT.
  MESSAGE i888(sabapdocu) WITH text-003.
ENDMODULE.

MODULE module_* INPUT.
  MESSAGE i888(sabapdocu) WITH text-004 input3.
ENDMODULE.

MODULE c1 INPUT.
  MESSAGE i888(sabapdocu) WITH text-005 '1'.
ENDMODULE.

MODULE c2 INPUT.
  MESSAGE i888(sabapdocu) WITH text-005 '2' text-006 '3'.
ENDMODULE.

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

Den Eingabefeldern sind die Dynprofelder INPUT1, INPUT2 und INPUT3 zugeordnet. Der Funktionscode der Drucktaste ist EXECUTE.

Im GUI-Status STATUS_100 ist das Symbol (F12) durch den Funktionscode CANCEL mit dem Funktionstyp E aktiviert. Weiterhin ist der Funktionstaste F2 der Funktionscode CS mit dem Funktionstyp S und der Funktionstaste F8 der Funktionscode EXECUTE ohne besonderen Funktionstyp zugeordnet.

Die Bildschirmablauflogik ist:

PROCESS BEFORE OUTPUT.
  MODULE init_screen_100.

PROCESS AFTER INPUT.
  MODULE cancel AT EXIT-COMMAND.
  CHAIN.
    FIELD: input1, input2.
    MODULE module_1 ON CHAIN-INPUT.
    FIELD  input3 MODULE module_* ON *-INPUT.
    MODULE module_2 ON CHAIN-REQUEST.
  ENDCHAIN.
  FIELD input1 MODULE c1 AT CURSOR-SELECTION.
  CHAIN.
    FIELD: input2, input3.
    MODULE c2 AT CURSOR-SELECTION.
  ENDCHAIN.
  MODULE cursor AT CURSOR-SELECTION.

Das Programm demonstriert durch Informationsnachrichten, welche Module nach welchen Benutzeraktionen aufgerufen und welche Daten transportiert werden: