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:
| Severity | Constante | Representación UI | Uso |
|---|---|---|---|
| Success | severity-success | Toast (desaparece automáticamente) | Operación exitosa |
| Info | severity-information | Diálogo Info o Toast | Avisos que no requieren acción |
| Warning | severity-warning | Popup amarillo | Advertencia, continuar posible |
| Error | severity-error | Popup rojo + Inline | Bloquea 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
%elementse 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 segundosPropiedades:
- 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íficotext = 'Entrada inválida'
" Bueno: Explica el problematext = '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-on3. Mensajes con contexto
" Contiene datos relevantestext = |La reserva { booking-booking_id } no puede cancelarse - Estado: { booking-booking_status }|4. Mensajes Success en Actions
" Confirmación de acción con cantidadtext = |{ 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 campoAPPEND 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
| Tipo | Severity | ¿FAILED? | Comportamiento UI |
|---|---|---|---|
| Error | severity-error | Sí | Popup + Inline, bloquea guardar |
| Warning | severity-warning | No | Popup con opción de elección |
| Info | severity-information | No | Diálogo o Toast |
| Success | severity-success | No | Toast (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.