Nachrichten in RAP und Fiori Elements: Success, Info, Warning, Error

Kategorie
RAP
Veröffentlicht
Autor
Johannes

Nachrichten sind die Brücke zwischen Backend-Logik und Benutzerinterface. In RAP werden sie über das IF_ABAP_BEHV_MESSAGE Interface erzeugt und vom Fiori Elements Framework automatisch visualisiert. Dieser Artikel zeigt alle vier Nachrichtentypen und ihr UI-Verhalten.

Die vier Nachrichtentypen

RAP kennt vier Severity-Level, die jeweils unterschiedlich in Fiori Elements dargestellt werden:

SeverityKonstanteUI-DarstellungVerwendung
Successseverity-successToast (verschwindet automatisch)Operation erfolgreich
Infoseverity-informationInfo-Dialog oder ToastHinweise, die keine Aktion erfordern
Warningseverity-warningGelbes PopupWarnung, Fortfahren möglich
Errorseverity-errorRotes Popup + InlineBlockiert Speichern
┌─────────────────────────────────────────────────────────────┐
│ SUCCESS (Toast) │
│ ┌─────────────────────────────────────┐ │
│ │ ✓ Buchung erfolgreich gespeichert │ → Verschwindet │
│ └─────────────────────────────────────┘ nach 3 Sekunden │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ ERROR (Popup + Inline) │
│ ┌─────────────────────────────────────┐ │
│ │ ✖ Speichern nicht möglich │ ← Bleibt stehen │
│ │ - Flugdatum in der Vergangenheit │ │
│ │ - Kunde nicht gefunden │ │
│ └─────────────────────────────────────┘ │
│ │
│ Flugdatum: [ 01.01.2020 ] ← Rot markiert │
│ ↑ Flugdatum muss in der Zukunft liegen │
└─────────────────────────────────────────────────────────────┘

Nachrichten in Validierungen

Die häufigste Verwendung von Nachrichten ist in Validierungen. Hier werden ungültige Daten erkannt und dem Benutzer mitgeteilt:

METHOD validateFlightDate.
" Daten lesen
READ ENTITIES OF zi_flightbooking IN LOCAL MODE
ENTITY FlightBooking
FIELDS ( flight_date )
WITH CORRESPONDING #( keys )
RESULT DATA(bookings).
LOOP AT bookings INTO DATA(booking).
" Prüfung: Flugdatum in der Vergangenheit?
IF booking-flight_date < cl_abap_context_info=>get_system_date( ).
" ERROR-Nachricht erzeugen
APPEND VALUE #(
%tky = booking-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-error
text = 'Flugdatum muss in der Zukunft liegen' )
%element-flight_date = if_abap_behv=>mk-on
) TO reported-flightbooking.
" Entity als fehlerhaft markieren
APPEND VALUE #( %tky = booking-%tky ) TO failed-flightbooking.
ENDIF.
ENDLOOP.
ENDMETHOD.

Wichtige Elemente:

  • %msg: Die Nachricht mit Severity
  • %element-<feldname>: Verknüpft die Nachricht mit einem Feld (für Inline-Anzeige)
  • failed-<entity>: Markiert die Entität als ungültig (verhindert Speichern bei Error)

Nachrichten in Actions

Actions können Success-Nachrichten zurückgeben, um dem Benutzer die erfolgreiche Ausführung zu bestätigen:

METHOD confirmBooking.
" Buchungen aktualisieren
MODIFY ENTITIES OF zi_flightbooking IN LOCAL MODE
ENTITY FlightBooking
UPDATE FIELDS ( booking_status )
WITH VALUE #( FOR key IN keys
( %tky = key-%tky
booking_status = 'C' ) ).
" Ergebnis lesen
READ ENTITIES OF zi_flightbooking IN LOCAL MODE
ENTITY FlightBooking
ALL FIELDS WITH CORRESPONDING #( keys )
RESULT DATA(bookings).
" Ergebnis zurückgeben
result = VALUE #( FOR booking IN bookings
( %tky = booking-%tky
%param = booking ) ).
" SUCCESS-Nachricht
APPEND VALUE #(
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-success
text = |{ lines( bookings ) } Buchung(en) bestätigt| )
) TO reported-flightbooking.
ENDMETHOD.

Die Success-Nachricht erscheint als Toast am unteren Bildschirmrand und verschwindet automatisch.

Nachrichten mit Nachrichtenklasse

Für mehrsprachige Anwendungen und konsistente Texte sollten Sie Nachrichtenklassen verwenden:

" Nachrichtenklasse ZFLIGHTBOOK mit Nachricht 001:
" "Flugdatum & muss in der Zukunft liegen"
APPEND VALUE #(
%tky = booking-%tky
%msg = new_message(
id = 'ZFLIGHTBOOK'
number = '001'
severity = if_abap_behv_message=>severity-error
v1 = |{ booking-flight_date DATE = USER }| )
%element-flight_date = if_abap_behv=>mk-on
) TO reported-flightbooking.

Vorteile von Nachrichtenklassen:

  • Automatische Übersetzung über SE91
  • Konsistente Fehlertexte im gesamten System
  • Platzhalter für dynamische Werte (&1, &2, etc.)

Warning-Nachrichten: Fortfahren möglich

Warnings blockieren das Speichern nicht, informieren aber über potenzielle Probleme:

METHOD validatePrice.
READ ENTITIES OF zi_flightbooking IN LOCAL MODE
ENTITY FlightBooking
FIELDS ( flight_price )
WITH CORRESPONDING #( keys )
RESULT DATA(bookings).
LOOP AT bookings INTO DATA(booking).
" Warnung bei ungewöhnlich hohem Preis
IF booking-flight_price > 5000.
APPEND VALUE #(
%tky = booking-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-warning
text = 'Preis über 5.000 EUR - bitte prüfen' )
%element-flight_price = if_abap_behv=>mk-on
) TO reported-flightbooking.
" KEIN Eintrag in failed- bei Warning!
ENDIF.
ENDLOOP.
ENDMETHOD.

Wichtig: Bei Warnings kein Eintrag in failed-, sonst wird das Speichern blockiert.

Info-Nachrichten: Reine Hinweise

Info-Nachrichten geben dem Benutzer zusätzliche Informationen ohne Handlungsbedarf:

METHOD calculateDiscount.
" ... Rabattberechnung ...
" Info: Rabatt wurde angewendet
APPEND VALUE #(
%tky = booking-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-information
text = |Stammkundenrabatt von { discount }% angewendet| )
) TO reported-flightbooking.
ENDMETHOD.

UI-Verhalten im Detail

Error-Nachrichten

┌──────────────────────────────────────────────────────┐
│ ✖ Fehler [X] │
├──────────────────────────────────────────────────────┤
│ │
│ Die folgenden Fehler müssen behoben werden: │
│ │
│ • Flugdatum muss in der Zukunft liegen │
│ • Kunde muss angegeben werden │
│ │
│ [ Schließen ] │
└──────────────────────────────────────────────────────┘

Eigenschaften:

  • Popup blockiert weitere Interaktion
  • Benutzer muss explizit schließen
  • Speichern ist deaktiviert
  • Felder mit %element werden rot markiert

Warning-Nachrichten

┌──────────────────────────────────────────────────────┐
│ ⚠ Warnung [X] │
├──────────────────────────────────────────────────────┤
│ │
│ Bitte beachten Sie: │
│ │
│ • Preis über 5.000 EUR - bitte prüfen │
│ │
│ [ Abbrechen ] [ Trotzdem speichern ]│
└──────────────────────────────────────────────────────┘

Eigenschaften:

  • Popup mit Wahlmöglichkeit
  • Benutzer kann fortfahren oder abbrechen
  • Felder werden orange markiert

Success-Nachrichten

┌────────────────────────────────────────┐
│ ✓ 3 Buchung(en) bestätigt │
└────────────────────────────────────────┘
↓ Verschwindet nach ~3 Sekunden

Eigenschaften:

  • Toast-Nachricht am unteren Bildschirmrand
  • Verschwindet automatisch
  • Keine Benutzerinteraktion erforderlich

Mehrere Nachrichten kombinieren

Eine Validierung kann mehrere Fehler gleichzeitig melden:

METHOD validateBooking.
READ ENTITIES OF zi_flightbooking IN LOCAL MODE
ENTITY FlightBooking
ALL FIELDS
WITH CORRESPONDING #( keys )
RESULT DATA(bookings).
LOOP AT bookings INTO DATA(booking).
" Fehler 1: Flugdatum
IF booking-flight_date < cl_abap_context_info=>get_system_date( ).
APPEND VALUE #(
%tky = booking-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-error
text = 'Flugdatum muss in der Zukunft liegen' )
%element-flight_date = if_abap_behv=>mk-on
) TO reported-flightbooking.
APPEND VALUE #( %tky = booking-%tky ) TO failed-flightbooking.
ENDIF.
" Fehler 2: Kunde
IF booking-customer_id IS INITIAL.
APPEND VALUE #(
%tky = booking-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-error
text = 'Kunde muss angegeben werden' )
%element-customer_id = if_abap_behv=>mk-on
) TO reported-flightbooking.
APPEND VALUE #( %tky = booking-%tky ) TO failed-flightbooking.
ENDIF.
" Warnung: Preis
IF booking-flight_price > 5000.
APPEND VALUE #(
%tky = booking-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-warning
text = 'Ungewöhnlich hoher Preis' )
%element-flight_price = if_abap_behv=>mk-on
) TO reported-flightbooking.
ENDIF.
ENDLOOP.
ENDMETHOD.

Fiori Elements gruppiert die Nachrichten automatisch nach Severity im Fehlerdialog.

Best Practices für User Experience

1. Spezifische Fehlermeldungen

" ❌ Schlecht: Unspezifisch
text = 'Ungültige Eingabe'
" ✅ Gut: Erklärt das Problem
text = 'Flugdatum muss mindestens 24 Stunden in der Zukunft liegen'

2. Feld-Verknüpfung nutzen

" ✅ Verknüpft Fehler mit Feld für Inline-Anzeige
%element-flight_date = if_abap_behv=>mk-on

3. Nachrichten mit Kontext

" ✅ Enthält relevante Daten
text = |Buchung { booking-booking_id } kann nicht storniert werden - Status: { booking-booking_status }|

4. Success-Nachrichten bei Actions

" ✅ Bestätigung der Aktion mit Anzahl
text = |{ lines( bookings ) } Buchung(en) erfolgreich storniert|

5. Warnings sparsam einsetzen

Zu viele Warnings führen dazu, dass Benutzer sie ignorieren. Reservieren Sie Warnings für echte Ausnahmesituationen.

Nachrichten ohne Feld-Referenz

Nicht jede Nachricht bezieht sich auf ein spezifisches Feld:

" Allgemeine Nachricht ohne Feldbezug
APPEND VALUE #(
%tky = booking-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-error
text = 'Dieser Flug ist bereits ausgebucht' )
" Kein %element - Nachricht erscheint nur im Dialog
) TO reported-flightbooking.

Diese Nachrichten erscheinen im Fehlerdialog, aber nicht inline am Feld.

Zusammenfassung

TypSeverityFAILED?UI-Verhalten
Errorseverity-errorJaPopup + Inline, blockiert Speichern
Warningseverity-warningNeinPopup mit Wahlmöglichkeit
Infoseverity-informationNeinDialog oder Toast
Successseverity-successNeinToast (verschwindet automatisch)

Weiterführende Artikel: RAP Determinations und Validations für die Implementierung von Geschäftslogik, RAP Actions und Functions für eigene Operationen, RAP CDS Pattern für vereinfachte Architektur und Fiori Elements UI für weitere UI-Konfiguration.