Show TOC Anfang des Inhaltsbereichs

Nachrichtenbehandlung in Funktionsbaustein-Modulen  Dokument im Navigationsbaum lokalisieren

Achtung Contexte sind obsolet und sollten nicht verwendet werden. Contexte wurden zu Release 4.0 für performante Zugriffe auf häufig benötigte abgeleitete Daten eingeführt. Seit der Einführung von ABAP Objects zu Release 4.5 werden Contexte nicht weiterentwickelt. Seit Release 6.40 können Contexte durch Shared Objects ersetzt werden.

 

Die Voraussetzung für das Senden von Benutzernachrichten aus Funktionsbaustein-Modulen ist eine Ausnahmebehandlung im betroffenen Funktionsbaustein. Dabei muss die Ausnahmebehandlung im Funktionsbaustein mit der Anweisung MESSAGE... RAISING programmiert sein. Falls die Ausnahmebehandlung im Funktionsbaustein mit der Anweisung RAISE programmiert ist, reagiert das System mit einem Laufzeitfehler. Mehr zur Ausnahmebehandlung in Funktionsbausteinen finden Sie unter Funktionsbausteine.

Das System sendet die in der Anweisung MESSAGE... RAISING angegebene Nachricht. Nachrichten, die in der Tabelle Module für Funktionsbausteine angegeben sind, werden ignoriert.

Bei der Abfrage von abhängigen Daten von Context-Instanzen mit der Anweisung DEMANDkö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 ob die MESSAGE-Anweisung des Funktionsbausteins nach der DEMAND-Anweisung im Programm stünde. Beachten Sie, dass 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 muss 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

Der Funktionsbaustein percent hat folgenden Quelltext:

FUNCTION percent.

result = v1 - v2.

IF v1 = 0.
  MESSAGE ID 'AT' TYPE 'E' NUMBER '012' RAISING div_zero.
ELSE.
  result = result * 100 / v1.
ENDIF.

ENDFUNCTION.

Der Context docu_test4 verwendet diesen Funktionsbaustein als einziges Modul mit den Schlüsselfeldern max und occ für die Eingabeparameter v1 und v2 und dem abhängigen Feld percent für den Ausgabeparameter result.

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

REPORT  demo_context_message_3.

DATA percentage TYPE i.

CONTEXTS docu_test4.

DATA: context_inst TYPE context_docu_test4.

SUPPLY max = 00
       occ = 20
       TO CONTEXT context_inst.

DEMAND percent = percentage
       FROM CONTEXT context_inst.

WRITE: / 'Percentage: ', percentage.

Das Programm wird mit der Fehlermeldung

Dies ist eine Error-Message

abgebrochen.

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

REPORT  demo_context_message_4.

DATA: percentage TYPE i.

CONTEXTS docu_test4.

DATA: context_inst TYPE context_docu_test4.

DATA itab TYPE TABLE OF symsg WITH HEADER LINE.

SUPPLY max = 00
       occ = 20
       TO CONTEXT context_inst.

DEMAND percent = percentage
       FROM CONTEXT context_inst MESSAGES INTO itab.

WRITE: / 'Percentage: ', percentage.   "#EC NOTEXT

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:

PERCENTAGE:  0

E  AT  012

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

 

 

 

Ende des Inhaltsbereichs