Mensajes en RAP y Fiori Elements: Success, Info, Warning, Error

Kategorie
RAP
Veröffentlicht
Autor
Johannes

Los mensajes son el puente entre la lógica del backend y la interfaz de usuario. En RAP se generan a través del interfaz IF_ABAP_BEHV_MESSAGE y el framework Fiori Elements los visualiza automáticamente. Este artículo muestra los cuatro tipos de mensajes y su comportamiento en la UI.

Los cuatro tipos de mensajes

RAP conoce cuatro niveles de severity, que se representan de forma diferente en Fiori Elements:

SeverityConstanteRepresentación UIUso
Successseverity-successToast (desaparece automáticamente)Operación exitosa
Infoseverity-informationDiálogo Info o ToastAvisos que no requieren acción
Warningseverity-warningPopup amarilloAdvertencia, continuar posible
Errorseverity-errorPopup rojo + InlineBloquea guardar
┌─────────────────────────────────────────────────────────────┐
│ SUCCESS (Toast) │
│ ┌─────────────────────────────────────┐ │
│ │ ✓ Reserva guardada exitosamente │ → Desaparece │
│ └─────────────────────────────────────┘ después de 3 seg│
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ ERROR (Popup + Inline) │
│ ┌─────────────────────────────────────┐ │
│ │ ✖ No se puede guardar │ ← Permanece │
│ │ - Fecha de vuelo en el pasado │ │
│ │ - Cliente no encontrado │ │
│ └─────────────────────────────────────┘ │
│ │
│ Fecha de vuelo: [ 01.01.2020 ] ← Marcado en rojo │
│ ↑ La fecha debe ser futura │
└─────────────────────────────────────────────────────────────┘

Mensajes en Validaciones

El uso más común de mensajes es en validaciones. Aquí se detectan datos inválidos y se comunican al usuario:

METHOD validateFlightDate.
" Leer datos
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).
" Verificación: ¿Fecha de vuelo en el pasado?
IF booking-flight_date < cl_abap_context_info=>get_system_date( ).
" Generar mensaje ERROR
APPEND VALUE #(
%tky = booking-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-error
text = 'La fecha de vuelo debe ser futura' )
%element-flight_date = if_abap_behv=>mk-on
) TO reported-flightbooking.
" Marcar entity como errónea
APPEND VALUE #( %tky = booking-%tky ) TO failed-flightbooking.
ENDIF.
ENDLOOP.
ENDMETHOD.

Elementos importantes:

  • %msg: El mensaje con Severity
  • %element-<nombre_campo>: Vincula el mensaje con un campo (para visualización inline)
  • failed-<entity>: Marca la entidad como inválida (previene guardar en Error)

Mensajes en Actions

Las Actions pueden devolver mensajes Success para confirmar al usuario la ejecución exitosa:

METHOD confirmBooking.
" Actualizar reservas
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' ) ).
" Leer resultado
READ ENTITIES OF zi_flightbooking IN LOCAL MODE
ENTITY FlightBooking
ALL FIELDS WITH CORRESPONDING #( keys )
RESULT DATA(bookings).
" Devolver resultado
result = VALUE #( FOR booking IN bookings
( %tky = booking-%tky
%param = booking ) ).
" Mensaje SUCCESS
APPEND VALUE #(
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-success
text = |{ lines( bookings ) } reserva(s) confirmada(s)| )
) TO reported-flightbooking.
ENDMETHOD.

El mensaje Success aparece como Toast en la parte inferior de la pantalla y desaparece automáticamente.

Mensajes con clase de mensajes

Para aplicaciones multilingües y textos consistentes, deberías usar clases de mensajes:

" Clase de mensajes ZFLIGHTBOOK con mensaje 001:
" "La fecha de vuelo & debe ser futura"
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.

Ventajas de clases de mensajes:

  • Traducción automática vía SE91
  • Textos de error consistentes en todo el sistema
  • Placeholders para valores dinámicos (&1, &2, etc.)

Mensajes Warning: Continuar posible

Los Warnings no bloquean guardar, pero informan sobre problemas potenciales:

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).
" Advertencia para precio inusualmente alto
IF booking-flight_price > 5000.
APPEND VALUE #(
%tky = booking-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-warning
text = 'Precio superior a 5.000 EUR - por favor verificar' )
%element-flight_price = if_abap_behv=>mk-on
) TO reported-flightbooking.
" ¡NO entrada en failed- para Warning!
ENDIF.
ENDLOOP.
ENDMETHOD.

Importante: En Warnings no entrada en failed-, sino guardar se bloquea.

Mensajes Info: Solo avisos

Los mensajes Info dan al usuario información adicional sin necesidad de acción:

METHOD calculateDiscount.
" ... cálculo de descuento ...
" Info: Descuento aplicado
APPEND VALUE #(
%tky = booking-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-information
text = |Descuento de cliente frecuente del { discount }% aplicado| )
) TO reported-flightbooking.
ENDMETHOD.

Comportamiento UI en detalle

Mensajes Error

┌──────────────────────────────────────────────────────┐
│ ✖ Error [X] │
├──────────────────────────────────────────────────────┤
│ │
│ Se deben corregir los siguientes errores: │
│ │
│ • La fecha de vuelo debe ser futura │
│ • Se debe indicar un cliente │
│ │
│ [ Cerrar ] │
└──────────────────────────────────────────────────────┘

Propiedades:

  • Popup bloquea más interacción
  • Usuario debe cerrar explícitamente
  • Guardar está desactivado
  • Campos con %element se marcan en rojo

Mensajes Warning

┌──────────────────────────────────────────────────────┐
│ ⚠ Advertencia [X] │
├──────────────────────────────────────────────────────┤
│ │
│ Tenga en cuenta: │
│ │
│ • Precio superior a 5.000 EUR - por favor verificar│
│ │
│ [ Cancelar ] [ Guardar de todos modos ]│
└──────────────────────────────────────────────────────┘

Propiedades:

  • Popup con opción de elección
  • Usuario puede continuar o cancelar
  • Campos se marcan en naranja

Mensajes Success

┌────────────────────────────────────────┐
│ ✓ 3 reserva(s) confirmada(s) │
└────────────────────────────────────────┘
↓ Desaparece después de ~3 segundos

Propiedades:

  • Mensaje Toast en parte inferior de pantalla
  • Desaparece automáticamente
  • No requiere interacción del usuario

Combinar múltiples mensajes

Una validación puede reportar múltiples errores simultáneamente:

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).
" Error 1: Fecha de vuelo
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 = 'La fecha de vuelo debe ser futura' )
%element-flight_date = if_abap_behv=>mk-on
) TO reported-flightbooking.
APPEND VALUE #( %tky = booking-%tky ) TO failed-flightbooking.
ENDIF.
" Error 2: Cliente
IF booking-customer_id IS INITIAL.
APPEND VALUE #(
%tky = booking-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-error
text = 'Se debe indicar un cliente' )
%element-customer_id = if_abap_behv=>mk-on
) TO reported-flightbooking.
APPEND VALUE #( %tky = booking-%tky ) TO failed-flightbooking.
ENDIF.
" Warning: Precio
IF booking-flight_price > 5000.
APPEND VALUE #(
%tky = booking-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-warning
text = 'Precio inusualmente alto' )
%element-flight_price = if_abap_behv=>mk-on
) TO reported-flightbooking.
ENDIF.
ENDLOOP.
ENDMETHOD.

Fiori Elements agrupa automáticamente los mensajes por Severity en el diálogo de errores.

Mejores prácticas para experiencia de usuario

1. Mensajes de error específicos

" Malo: Inespecífico
text = 'Entrada inválida'
" Bueno: Explica el problema
text = 'La fecha de vuelo debe ser al menos 24 horas en el futuro'

2. Usar vinculación con campo

" Vincula error con campo para visualización inline
%element-flight_date = if_abap_behv=>mk-on

3. Mensajes con contexto

" Contiene datos relevantes
text = |La reserva { booking-booking_id } no puede cancelarse - Estado: { booking-booking_status }|

4. Mensajes Success en Actions

" Confirmación de acción con cantidad
text = |{ lines( bookings ) } reserva(s) cancelada(s) exitosamente|

5. Usar Warnings con moderación

Demasiados warnings llevan a que los usuarios los ignoren. Reserva warnings para situaciones verdaderamente excepcionales.

Mensajes sin referencia a campo

No todo mensaje se refiere a un campo específico:

" Mensaje general sin referencia a campo
APPEND VALUE #(
%tky = booking-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-error
text = 'Este vuelo ya está completo' )
" Sin %element - mensaje aparece solo en diálogo
) TO reported-flightbooking.

Estos mensajes aparecen en el diálogo de errores, pero no inline en el campo.

Resumen

TipoSeverity¿FAILED?Comportamiento UI
Errorseverity-errorPopup + Inline, bloquea guardar
Warningseverity-warningNoPopup con opción de elección
Infoseverity-informationNoDiálogo o Toast
Successseverity-successNoToast (desaparece automáticamente)

Artículos relacionados: RAP Determinations y Validations para implementación de lógica de negocio, RAP Actions y Functions para operaciones propias, RAP CDS Pattern para arquitectura simplificada y Fiori Elements UI para más configuración de UI.