Messages dans RAP et Fiori Elements : Success, Info, Warning, Error

Catégorie
RAP
Publié
Auteur
Johannes

Les messages sont le pont entre la logique backend et l’interface utilisateur. Dans RAP, ils sont générés via l’interface IF_ABAP_BEHV_MESSAGE et automatiquement visualisés par le framework Fiori Elements. Cet article présente les quatre types de messages et leur comportement UI.

Les quatre types de messages

RAP connaît quatre niveaux de gravité, chacun affiché différemment dans Fiori Elements :

SeverityConstanteAffichage UIUtilisation
Successseverity-successToast (disparaît automatiquement)Opération réussie
Infoseverity-informationDialogue info ou ToastInformations ne nécessitant pas d’action
Warningseverity-warningPopup jauneAvertissement, continuer possible
Errorseverity-errorPopup rouge + InlineBloque la sauvegarde
┌─────────────────────────────────────────────────────────────┐
│ 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 │
└─────────────────────────────────────────────────────────────┘

Messages dans les validations

L’utilisation la plus courante des messages est dans les validations. Ici, les données invalides sont détectées et communiquées à l’utilisateur :

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.

Éléments importants :

  • %msg : Le message avec Severity
  • %element-<feldname> : Lie le message à un champ (pour affichage inline)
  • failed-<entity> : Marque l’entité comme invalide (empêche la sauvegarde en cas d’Error)

Messages dans les Actions

Les Actions peuvent retourner des messages Success pour confirmer l’exécution réussie à l’utilisateur :

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.

Le message Success apparaît comme Toast en bas de l’écran et disparaît automatiquement.

Messages avec classe de messages

Pour les applications multilingues et des textes cohérents, vous devriez utiliser des classes de messages :

" 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.

Avantages des classes de messages :

  • Traduction automatique via SE91
  • Textes d’erreur cohérents dans tout le système
  • Variables de substitution pour valeurs dynamiques (&1, &2, etc.)

Messages Warning : Continuer possible

Les Warnings ne bloquent pas la sauvegarde, mais informent des problèmes potentiels :

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.

Important : Avec les Warnings, aucune entrée dans failed-, sinon la sauvegarde sera bloquée.

Messages Info : Pures informations

Les messages Info donnent à l’utilisateur des informations supplémentaires sans besoin d’action :

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.

Comportement UI en détail

Messages Error

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

Propriétés :

  • Popup bloque l’interaction supplémentaire
  • L’utilisateur doit fermer explicitement
  • La sauvegarde est désactivée
  • Les champs avec %element sont marqués en rouge

Messages Warning

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

Propriétés :

  • Popup avec choix
  • L’utilisateur peut continuer ou annuler
  • Les champs sont marqués en orange

Messages Success

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

Propriétés :

  • Message Toast en bas de l’écran
  • Disparaît automatiquement
  • Aucune interaction utilisateur nécessaire

Combiner plusieurs messages

Une validation peut signaler plusieurs erreurs simultanément :

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 regroupe automatiquement les messages par Severity dans le dialogue d’erreur.

Bonnes pratiques pour l’expérience utilisateur

1. Messages d’erreur spécifiques

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

2. Utiliser la liaison de champ

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

3. Messages avec contexte

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

4. Messages Success pour les Actions

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

5. Utiliser les Warnings avec parcimonie

Trop de Warnings conduisent les utilisateurs à les ignorer. Réservez les Warnings pour les situations exceptionnelles réelles.

Messages sans référence de champ

Tous les messages ne se réfèrent pas à un champ spécifique :

" 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.

Ces messages apparaissent dans le dialogue d’erreur, mais pas inline au champ.

Résumé

TypeSeverityFAILED?Comportement UI
Errorseverity-errorOuiPopup + Inline, bloque la sauvegarde
Warningseverity-warningNonPopup avec choix
Infoseverity-informationNonDialogue ou Toast
Successseverity-successNonToast (disparaît automatiquement)

Articles complémentaires : RAP Determinations et Validations pour l’implémentation de la logique métier, RAP Actions et Functions pour les opérations personnalisées, RAP CDS Pattern pour l’architecture simplifiée et Fiori Elements UI pour la configuration UI supplémentaire.