Navegación en dynpros ABAP: LEAVE PROGRAM, LEAVE TO SCREEN y cómo volver atrás correctamente

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ónEjemplo
Botón Exit (salida total)El usuario quiere cerrar la aplicación por completo
Finalización normal del programaEl proceso ha terminado y no hay más que hacer
Salida por error irrecuperableNo 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ónEjemplo
Botón Back (volver atrás)El usuario quiere retroceder un paso
Navegación natural hacia atrásDespués de mostrar un detalle, volver al listado
Cancelar operación actualEl 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ónEjemplo
Navegación directa a otra pantallaDesde un menú principal a una pantalla de detalle
Flujos controladosAsistentes (wizards) con pasos predefinidos
Saltar pantallas intermediasIr 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.

EscenarioEjemplo
Ventana de búsqueda (F4 help)Desde una pantalla, abres un buscador y al seleccionar un valor, vuelves
Popup de selecciónEl usuario elige una opción y vuelve a la pantalla anterior
Sub-pantalla de configuraciónAbres una ventana de ajustes y al cerrar vuelves al mismo punto
Asistente (wizard) con retornoQuieres volver exactamente donde estabas

Tabla comparativa

SentenciaAfecta stackComportamientoUso típico
LEAVE PROGRAMNo (limpia)Termina el programaExit
LEAVE TO SCREEN 0Sí (pop)Vuelve a pantalla anteriorBack
LEAVE TO SCREEN nSí (push)Navega a n, guardando la actualNavegación con historial
SET SCREEN n + LEAVE SCREENSí (push)Define y navega (equivale a LEAVE TO SCREEN)Flujo controlado
CALL SCREEN nSí (sub-stack)Llama a otra pantalla, vuelve al finalizarSub-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.