ABAP MESSAGE Anweisung erklärt: Typen, Syntax und Beispiele

kategorie
ABAP-Statements
Veröffentlicht
autor
Johannes

Die MESSAGE-Anweisung dient dazu:

  1. Nachrichten anzuzeigen: Dem Benutzer Informationen, Erfolgsmeldungen, Warnungen oder Fehlermeldungen mitzuteilen (meist in der Statusleiste, einem Popup-Fenster oder im Protokoll).
  2. Programmablauf zu beeinflussen: Je nach Typ der Nachricht (siehe unten) kann die Anweisung den aktuellen Verarbeitungsschritt unterbrechen, die gesamte Transaktion abbrechen oder sogar einen Laufzeitfehler (Dump) auslösen.

Nachrichten werden standardmäßig nicht direkt im Code als Text hinterlegt, sondern in Nachrichtenklassen ( Transaktion SE91) zentral gepflegt. Dies ermöglicht eine einfache Übersetzung und Wartung.

Syntax

Die gebräuchlichste Form sieht so aus:

MESSAGE <typ><nr>(<klasse>)
[WITH <wert1> <wert2> <wert3> <wert4>] " Platzhalter füllen
[RAISING <ausnahmeklasse>] " Ausnahme auslösen (in Fubas/Methoden)
[INTO <variable>]. " Nachrichtentext in Variable speichern (statt anzeigen)

Es gibt auch eine (seltener empfohlene) Form für ad-hoc Textliterale:

MESSAGE <literal_text> TYPE <typ>.

Bestandteile

  • <typ> (Nachrichtentyp): Ein einzelner Buchstabe, der das Verhalten bestimmt. Das ist der wichtigste Teil!

    • I: Information - Zeigt die Nachricht an (oft Popup). Programm wartet auf Bestätigung (Enter/OK) und läuft dann weiter.
    • S: Success (Erfolg) - Zeigt die Nachricht in der Statuszeile des nächsten Bildschirms an. Programm läuft sofort weiter.
    • W: Warning (Warnung) - Zeigt eine Warnung an (oft Popup oder Statuszeile). Eingabefelder bleiben oft bereit. Programm wartet auf Bestätigung und läuft dann weiter. Kontextabhängig.
    • E: Error (Fehler) - Zeigt eine Fehlermeldung an. Unterbricht meist den aktuellen Verarbeitungsschritt ( z. B. PAI-Modul, START-OF-SELECTION). Oft werden Eingabefelder wieder eingabebereit gemacht. Beendet nicht das ganze Programm.
    • A: Abend (Abbruch) - Zeigt die Nachricht an und bricht die gesamte Transaktion sofort ab! Führt ein Datenbank-Rollback durch. Sehr vorsichtig verwenden!
    • X: eXit (Dump) - Verursacht einen Laufzeitfehler (Kurzdump). Die Nachricht wird im Dump angezeigt. Für schwerwiegende, unerwartete Programmfehler.
  • <nr>: Die dreistellige Nachrichtennummer (als Literal oder Variable) aus der Nachrichtenklasse (000-999).

  • (<klasse>): Die ID der Nachrichtenklasse (Literal oder Variable, z. B. 'ZMYMSG') aus Transaktion SE91, in der die Nachricht <nr> definiert ist. Dieser Teil kann entfallen, wenn im Programm global eine Standard-Nachrichtenklasse mit REPORT ... MESSAGE-ID ... deklariert wurde.

  • WITH <wert1> ... <wert4> (Optional): Hiermit übergibst Du bis zu vier Werte (Variablen, Literale), die die * Platzhalter* &1, &2, &3, &4 im Nachrichtentext ersetzen. Ein einfaches & wird sequenziell durch die Werte gefüllt.

    • Beispieltext in SE91: Material &1 für Werk &2 nicht gefunden.
    • Aufruf: MESSAGE E005(ZMAT) WITH lv_matnr lv_werks.
  • RAISING <ausnahmeklasse> (Optional): Nur in Funktionsbausteinen und Methoden sinnvoll. Löst zusätzlich zur Nachricht eine klassenbasierte Ausnahme aus, die der Aufrufer mit TRY ... CATCH fangen kann. Ermöglicht strukturierte Fehlerbehandlung.

  • INTO <variable> (Optional): Die Nachricht wird nicht angezeigt. Der fertig formatierte Nachrichtentext wird stattdessen in die zeichenartige <variable> geschrieben. Das Programm läuft sofort weiter. Nützlich für Protokollierungen.

Nachrichtenklassen (SE91)

Die Verwendung von Nachrichtenklassen ist Standard und bietet Vorteile:

  • Übersetzung: Nachrichten können zentral übersetzt werden.
  • Wartung: Texte sind an einer Stelle änderbar.
  • Wiederverwendung: Gleiche Meldungen können von verschiedenen Programmen genutzt werden.
  • Kontext: Verwendung von Platzhaltern (&, &1…).

Systemfelder

Nach dem Anzeigen einer Nachricht (nicht bei INTO) werden Systemfelder wie sy-msgid (Klasse), sy-msgty (Typ), sy-msgno (Nummer) und sy-msgv1 bis sy-msgv4 (Werte aus WITH) gefüllt. Achtung: sy-subrc wird durch MESSAGE selbst nicht zuverlässig gesetzt, um Erfolg/Misserfolg anzuzeigen – die Logik ergibt sich primär aus dem Nachrichtentyp (E, A, X).

Beispiele

" Annahme: Nachrichtenklasse ZMSG existiert
" NNr | Text
" ---|--------------------------------------
" 001 | Verarbeitung erfolgreich abgeschlossen.
" 002 | Material &1 konnte nicht gesperrt werden.
" 003 | Bitte geben Sie eine Auftragsnummer ein.
" 004 | Datum &1 liegt in der Vergangenheit. Fortfahren?
" 005 | Interner Fehler (&1) in Routine &2 aufgetreten! Abbruch!
DATA lv_matnr TYPE matnr VALUE 'M-01'.
DATA lv_date TYPE d VALUE sy-datum - 1.
DATA lv_text TYPE string.
" Erfolgsmeldung (Typ S - erscheint in Statuszeile des nächsten Bilds)
MESSAGE s001(ZMSG).
" Fehlermeldung (Typ E - stoppt meist aktuellen Block)
IF lv_matnr IS INITIAL.
MESSAGE e003(ZMSG).
RETURN. " Explizites Verlassen notwendig, wenn nicht im PAI o.ä.
ENDIF.
" Warnung (Typ W - Benutzer muss bestätigen)
IF lv_date < sy-datum.
MESSAGE w004(ZMSG) WITH lv_date.
" Programm hält hier an, bis User bestätigt.
ENDIF.
" Information (Typ I - Benutzer muss bestätigen)
MESSAGE i002(ZMSG) WITH lv_matnr.
" Abbruch (Typ A - Transaktion wird beendet!) - SEHR VORSICHTIG NUTZEN
* MESSAGE a005(ZMSG) WITH sy-subrc 'MEINE_ROUTINE'.
" Nachricht in Variable schreiben (Typ S - wird nicht angezeigt)
MESSAGE s001(ZMSG) INTO lv_text.
WRITE: / 'Nachricht in Variable:', lv_text.

Wichtige Hinweise / Best Practice

  • Verwende Nachrichtenklassen für alle Meldungen, die übersetzt werden sollen oder mehrfach vorkommen.
  • Wähle den Nachrichtentyp (I, S, W, E, A, X) bewusst, je nachdem, wie das Programm reagieren soll.
  • Gehe extrem sparsam mit den Typen A (Abbruch) und X (Dump) um. Sie sind für schwerwiegende, nicht behebbare Fehler gedacht.
  • Nutze den WITH-Zusatz, um dem Benutzer kontextspezifische Informationen (Werte, Feldnamen etc.) in der Meldung zu geben.
  • In Funktionsbausteinen und Methoden bevorzuge RAISING mit Ausnahmeklassen gegenüber MESSAGE E... für eine saubere Fehlerkommunikation zum Aufrufer.