Anfang des Inhaltsbereichs

Nachrichtenbehandlung in Tabellen-Modulen Dokument im Navigationsbaum lokalisieren

Die Voraussetzung für das Senden von Benutzernachrichten aus Tabellen-Modulen ist, daß die Nachrichten für die einzelnen Module in der Tabelle Module angegeben sind. Falls keine Nachricht zu einem Tabellen-Modul angegeben ist, gibt das System auch keine Nachricht aus, sondern initialisiert lediglich die entsprechenden abhängigen Werte.

Bei der Abfrage von abhängigen Daten von Context-Instanzen mit der Anweisung DEMAND können Sie entscheiden, ob das System die Benutzernachricht behandeln soll, oder ob Sie die Nachricht im Programm behandeln.

Nachrichtenbehandlung vom System

Falls das System die Nachricht behandeln soll, verwenden Sie die Grundform der DEMAND-Anweisung ohne die Option MESSAGES. Dann verhält das System sich so, als wenn nach der DEMAND-Anweisung folgende Anweisung im Programm stünde:

MESSAGE ID 'Nachrichten Id' TYPE 'T' NUMBER 'Nummer'
        WITH 'Variable 1' .... 'Variable 4'.

Das System übernimmt die Argumente der MESSAGE-Anweisung aus den entsprechenden Einträgen der Tabelle Module. Beachten Sie, daß die Reaktion auf die verschiedenen Nachrichtentypen vom aktuellen Benutzerdialog (Dynpro, Selektionsbild oder Liste) abhängt.

Nachrichtenbehandlung im Programm

Falls Sie die Nachricht im Programm abfangen wollen, verwenden Sie die DEMAND-Anweisung mit der Option MESSAGES INTO <itab>. Hierfür müssen Sie eine interne Tabelle <itab> der Struktur SYMSG anlegen. Das System löscht die Tabelle <itab> zu Beginn der DEMAND-Anweisung und schreibt dann die Kennungen aller während der Context-Verarbeitung auftretender Nachrichten in die Tabelle <itab> statt sie an den Benutzer auszugeben und entsprechend des Nachrichtentyps zu reagieren. Weiterhin setzt das System den Rückgabewert SY-SUBRC ungleich Null, falls nach der DEMAND-Anweisung Nachrichten in der Tabelle vorhanden sind.

Sie können somit die automatische Nachrichtenbehandlung von Contexten verhindern um z.B. mit den Einträgen in der internen Tabelle eine eigene Nachrichtenbehandlung zu programmieren. Dies ist z.B. wichtig, wenn Sie gezielt Felder auf Eingabeschirmen wieder eingabebereit machen wollen. Dann muß sich Ihre Nachrichtenbehandlung auf diese Felder beziehen (Anweisung FIELDS in der Ablauflogik von Dynpros oder ABAP-Anweisung AT SELECTION-SCREEN bei Selektionsbildern) und nicht auf Context-Felder.

Beispiel

Die Tabelle Module des Contexts DOCU_TEST1 (siehe Tabellen als Module) enthalte folgende Einträge für das Modul SPFLI:

Diese Grafik wird im zugehörigen Text erklärt

Als Beispiel für die Nachrichtenbehandlung vom System führen Sie folgendes Programm aus:

REPORT  demo_context_message_1.

DATA: c_from TYPE spfli-cityfrom,
      c_to   TYPE spfli-cityto.

CONTEXTS docu_test1.

DATA: context_inst TYPE context_docu_test1.

 

SUPPLY carrid = 'XX'
       connid = '400'
       TO CONTEXT context_inst.

DEMAND cityfrom = c_from
       cityto   = c_to
       FROM CONTEXT context_inst.

WRITE: / c_from, c_to.

Das Programm wird mit der Fehlermeldung

Keine Einträge zum Schlüssel XX 0400 gefunden

abgebrochen.

Als Beispiel für die Nachrichtenbehandlung im Programm führen Sie folgendes Programm aus:

REPORT  demo_context_message_2.

DATA: c_from TYPE spfli-cityfrom,
      c_to   TYPE spfli-cityto.

DATA itab TYPE TABLE OF symsg WITH HEADER LINE.

CONTEXTS docu_test1.

DATA: context_inst TYPE context_docu_test1.

 

SUPPLY carrid = 'XX'
       connid = '400'
       TO CONTEXT context_inst.

DEMAND cityfrom = c_from
       cityto   = c_to
       FROM CONTEXT context_inst MESSAGES INTO itab.

WRITE: / c_from, c_to.

IF sy-subrc NE 0.
  LOOP AT itab.
    WRITE: / itab-msgty,
           / itab-msgid,
           / itab-msgno,
           / itab-msgv1,
           / itab-msgv2.
  ENDLOOP.
ENDIF.

Das Programm liefert folgende Ausgabe:

E  AT  107  XX  0400

Statt mit einer Error-Nachricht abzubrechen, steht die Nachricht in der internen Tabelle ITAB zur weiteren Verarbeitung zur Verfügung.

Ende des Inhaltsbereichs