La sentencia MESSAGE sirve para:
- Mostrar mensajes: Comunicar al usuario informaciones, mensajes de exito, advertencias o mensajes de error (generalmente en la barra de estado, una ventana emergente o en el protocolo).
- Influir en el flujo del programa: Dependiendo del tipo de mensaje (ver abajo), la sentencia puede interrumpir el paso de procesamiento actual, abortar toda la transaccion o incluso provocar un error de tiempo de ejecucion (dump).
Los mensajes por defecto no se almacenan directamente como texto en el codigo, sino que se mantienen centralmente en clases de mensaje (transaccion SE91). Esto permite una traduccion y mantenimiento sencillos.
Sintaxis
La forma mas comun se ve asi:
MESSAGE <tipo><nr>(<clase>) [WITH <valor1> <valor2> <valor3> <valor4>] " Rellenar marcadores [RAISING <clase_excepcion>] " Lanzar excepcion (en FuBas/metodos) [INTO <variable>]. " Guardar texto del mensaje en variable (en lugar de mostrar)Tambien existe una forma (menos recomendada) para literales de texto ad-hoc:
MESSAGE <texto_literal> TYPE <tipo>.Componentes
-
<tipo>(Tipo de mensaje): Una sola letra que determina el comportamiento. Esta es la parte mas importante!I: Information - Muestra el mensaje (frecuentemente emergente). El programa espera confirmacion (Enter/OK) y luego continua.S: Success (Exito) - Muestra el mensaje en la linea de estado de la siguiente pantalla. El programa continua inmediatamente.W: Warning (Advertencia) - Muestra una advertencia (frecuentemente emergente o barra de estado). Los campos de entrada a menudo permanecen listos. El programa espera confirmacion y luego continua. Depende del contexto.E: Error - Muestra un mensaje de error. Interrumpe generalmente el paso de procesamiento actual (por ejemplo, modulo PAI,START-OF-SELECTION). A menudo los campos de entrada vuelven a estar listos para entrada. No termina todo el programa.A: Abend (Abortar) - Muestra el mensaje y aborta toda la transaccion inmediatamente! Realiza un rollback de base de datos. Usar con mucho cuidado!X: eXit (Dump) - Causa un error de tiempo de ejecucion (dump corto). El mensaje se muestra en el dump. Para errores graves e inesperados del programa.
-
<nr>: El numero de mensaje de tres digitos (como literal o variable) de la clase de mensaje (000-999). -
(<clase>): El ID de la clase de mensaje (literal o variable, por ejemplo'ZMYMSG') de la transaccionSE91, en la que esta definido el mensaje<nr>. Esta parte puede omitirse si se ha declarado globalmente una clase de mensaje estandar en el programa conREPORT ... MESSAGE-ID .... -
WITH <valor1> ... <valor4>(Opcional): Con esto pasas hasta cuatro valores (variables, literales) que reemplazan los marcadores&1,&2,&3,&4en el texto del mensaje. Un simple&se rellena secuencialmente con los valores.- Texto de ejemplo en SE91:
Material &1 para centro &2 no encontrado. - Llamada:
MESSAGE E005(ZMAT) WITH lv_matnr lv_werks.
- Texto de ejemplo en SE91:
-
RAISING <clase_excepcion>(Opcional): Solo tiene sentido en modulos de funcion y metodos. Lanza adicionalmente al mensaje una excepcion basada en clase que el llamador puede capturar conTRY ... CATCH. Permite manejo de errores estructurado. -
INTO <variable>(Opcional): El mensaje no se muestra. En su lugar, el texto del mensaje formateado se escribe en la<variable>de tipo caracter. El programa continua inmediatamente. Util para protocolos.
Clases de mensaje (SE91)
El uso de clases de mensaje es estandar y ofrece ventajas:
- Traduccion: Los mensajes pueden traducirse centralmente.
- Mantenimiento: Los textos se pueden modificar en un solo lugar.
- Reutilizacion: Los mismos mensajes pueden ser usados por diferentes programas.
- Contexto: Uso de marcadores (
&,&1…).
Campos del sistema
Despues de mostrar un mensaje (no con INTO) se rellenan campos del sistema como sy-msgid (clase), sy-msgty (tipo), sy-msgno (numero) y sy-msgv1 hasta sy-msgv4 (valores de WITH). Atencion: sy-subrc no se establece de forma fiable por MESSAGE mismo para indicar exito/fracaso - la logica resulta principalmente del tipo de mensaje (E, A, X).
Ejemplos
" Suposicion: Clase de mensaje ZMSG existe" NNr | Texto" ----|--------------------------------------" 001 | Procesamiento completado con exito." 002 | Material &1 no pudo ser bloqueado." 003 | Por favor ingrese un numero de pedido." 004 | Fecha &1 esta en el pasado. Continuar?" 005 | Error interno (&1) en rutina &2 ocurrido! Abortar!
DATA lv_matnr TYPE matnr VALUE 'M-01'.DATA lv_date TYPE d VALUE sy-datum - 1.DATA lv_text TYPE string.
" Mensaje de exito (Tipo S - aparece en linea de estado de siguiente pantalla)MESSAGE s001(ZMSG).
" Mensaje de error (Tipo E - generalmente detiene el bloque actual)IF lv_matnr IS INITIAL. MESSAGE e003(ZMSG). RETURN. " Salida explicita necesaria si no esta en PAI, etc.ENDIF.
" Advertencia (Tipo W - usuario debe confirmar)IF lv_date < sy-datum. MESSAGE w004(ZMSG) WITH lv_date. " El programa se detiene aqui hasta que el usuario confirme.ENDIF.
" Informacion (Tipo I - usuario debe confirmar)MESSAGE i002(ZMSG) WITH lv_matnr.
" Abortar (Tipo A - la transaccion termina!) - USAR CON MUCHO CUIDADO* MESSAGE a005(ZMSG) WITH sy-subrc 'MI_RUTINA'.
" Escribir mensaje en variable (Tipo S - no se muestra)MESSAGE s001(ZMSG) INTO lv_text.WRITE: / 'Mensaje en variable:', lv_text.Notas importantes / Mejores practicas
- Usa clases de mensaje para todos los mensajes que deben traducirse o que aparecen multiples veces.
- Elige el tipo de mensaje (
I,S,W,E,A,X) conscientemente, segun como debe reaccionar el programa. - Se extremadamente prudente con los tipos
A(abortar) yX(dump). Estan pensados para errores graves e irrecuperables. - Usa la adicion
WITHpara dar al usuario informacion especifica del contexto (valores, nombres de campo, etc.) en el mensaje. - En modulos de funcion y metodos, prefiere
RAISINGcon clases de excepcion sobreMESSAGE E...para una comunicacion limpia de errores al llamador.