Cuando empiezas a trabajar con dynpros en ABAP, uno de los puntos más confusos es el control de navegación entre pantallas.
El stack de pantallas (Pila de navegación)
Antes de ver las sentencias, necesitas entender que SAP mantiene una pila (stack) de pantallas por la que el usuario ha navegado. Cada vez que navegas a una nueva pantalla, esta se añade al stack se elimina del stack cuando vuelves atrás.
¿Por qué es importante? Porque LEAVE TO SCREEN 0 y LEAVE PROGRAM se comportan de forma diferente respecto a este stack.
Sentencias de Navegación
LEAVE PROGRAM
LEAVE PROGRAM finaliza completamente el programa actual y vuelve al menú principal de SAP (o a la pantalla que llamó al programa).
LEAVE PROGRAM ignora completamente el stack y termina la ejecución. No vuelve a la pantalla anterior, simplemente sale.
MODULE user_command_0100 INPUT.
CASE sy-ucomm.
WHEN 'EXIT'.
LEAVE PROGRAM. " Termina todo, vuelve al menú SAP
ENDCASE.
ENDMODULE.
Cuándo usar LEAVE PROGRAM
| Situación | Ejemplo |
|---|---|
| Botón Exit (salida total) | El usuario quiere cerrar la aplicación por completo |
| Finalización normal del programa | El proceso ha terminado y no hay más que hacer |
| Salida por error irrecuperable | No se puede continuar, mejor salir |
LEAVE TO SCREEN 0
LEAVE TO SCREEN 0 vuelve a la pantalla anterior en el stack de navegación. Equivalente a pulsar el botón ‘Back’ (Atrás)
LEAVE TO SCREEN 0 respeta el stack y elimina la pantalla actual, mostrando la anterior.
MODULE user_command_0100 INPUT.
CASE sy-ucomm.
WHEN 'BACK'.
LEAVE TO SCREEN 0. " Vuelve a la pantalla anterior
ENDCASE.
ENDMODULE.
Cuándo usar LEAVE TO SCREEN 0
| Situación | Ejemplo |
|---|---|
| Botón Back (volver atrás) | El usuario quiere retroceder un paso |
| Navegación natural hacia atrás | Después de mostrar un detalle, volver al listado |
| Cancelar operación actual | El usuario decide no continuar con la acción actual |
💡 LEAVE TO SCREEN 0 es la forma correcta y profesional de implementar un botón «Back». Nunca uses LEAVE PROGRAM para volver atrás.
LEAVE TO SCREEN n (número específico)
LEAVE TO SCREEN n navega directamente a una pantalla específica, sin pasar por el stack. Voy directamente a la pantalla X, sin importar por dónde he llegado
LEAVE TO SCREEN n añade la nueva pantalla al stack (no reemplaza la actual). Esto es importante porque significa que si luego pulsas «Back», volverás a la pantalla desde la que viniste.
MODULE user_command_0100 INPUT.
CASE sy-ucomm.
WHEN 'TO_DETAIL'.
LEAVE TO SCREEN 200. " Navega directamente a la pantalla 200
ENDCASE.
ENDMODULE.
Cuándo usar LEAVE TO SCREEN n
| Situación | Ejemplo |
|---|---|
| Navegación directa a otra pantalla | Desde un menú principal a una pantalla de detalle |
| Flujos controlados | Asistentes (wizards) con pasos predefinidos |
| Saltar pantallas intermedias | Ir directamente a la pantalla de resultados |
SET SCREEN + LEAVE SCREEN
SET SCREEN n define cuál será la próxima pantalla (no navega inmediatamente), mientras que LEAVE SCREEN sale de la pantalla actual y continúa el flujo hacia la pantalla definida.
SET SCREEN 200. LEAVE SCREEN.
SET SCREEN es útil cuando quieres definir la siguiente pantalla pero no salir inmediatamente. Por ejemplo, si necesitas hacer más cosas antes de salir:
MODULE user_command_0100 INPUT.
CASE sy-ucomm.
WHEN 'NEXT'.
SET SCREEN 200. " Defino que la siguiente es la 200
" Aquí puedo hacer más cosas...
PERFORM validar_datos.
PERFORM guardar_log.
LEAVE SCREEN. " Ahora sí, salgo hacia la 200
ENDCASE.
ENDMODULE.
Cuándo usarlo
- En módulos PAI (es el uso más común)
- Cuando necesitas lógica adicional antes de salir
- En flujos de asistente (wizard) paso a paso
CALL SCREEN n
CALL SCREEN n llama a otra pantalla y la ejecuta de forma independiente. Cuando esa pantalla termina (con LEAVE SCREEN), la ejecución vuelve al punto donde se llamó.
" Pantalla 100
MODULE user_command_0100 INPUT.
CASE sy-ucomm.
WHEN 'CALL_OTHER'.
CALL SCREEN 200. " Llama a la pantalla 200
" Cuando la pantalla 200 termine, la ejecución continúa aquí
MESSAGE 'He vuelto de la pantalla 200' TYPE 'I'.
ENDCASE.
ENDMODULE.
Usa CALL SCREEN cuando…
Quieres llamar a una pantalla como «sub-diálogo» o «popup», y quieres volver a la pantalla actual después.
| Escenario | Ejemplo |
|---|---|
| Ventana de búsqueda (F4 help) | Desde una pantalla, abres un buscador y al seleccionar un valor, vuelves |
| Popup de selección | El usuario elige una opción y vuelve a la pantalla anterior |
| Sub-pantalla de configuración | Abres una ventana de ajustes y al cerrar vuelves al mismo punto |
| Asistente (wizard) con retorno | Quieres volver exactamente donde estabas |
Tabla comparativa
| Sentencia | Afecta stack | Comportamiento | Uso típico |
|---|---|---|---|
LEAVE PROGRAM | No (limpia) | Termina el programa | Exit |
LEAVE TO SCREEN 0 | Sí (pop) | Vuelve a pantalla anterior | Back |
LEAVE TO SCREEN n | Sí (push) | Navega a n, guardando la actual | Navegación con historial |
SET SCREEN n + LEAVE SCREEN | Sí (push) | Define y navega (equivale a LEAVE TO SCREEN) | Flujo controlado |
CALL SCREEN n | Sí (sub-stack) | Llama a otra pantalla, vuelve al finalizar | Sub-diálogos, popups |
📌 Si estás trabajando con reportes clásicos que usan WRITE para generar listas, LEAVE LIST-PROCESSING te permite volver al dynpro que llamó al reporte. No es común en aplicaciones modernas, pero es bueno saber que existe.

