EXIT es una sentencia de control que interrumpe la ejecucion del bucle o subrutina actual. El comportamiento depende del contexto en que se usa.
Comportamiento por contexto
| Contexto | Efecto de EXIT |
|---|
DO / WHILE / LOOP AT | Termina el bucle inmediatamente |
FORM (Subrutina) | Termina la subrutina |
| Fuera de bucle/subrutina | No permitido |
Sintaxis
Ejemplos
1. EXIT en bucle DO
EXIT. " Termina el bucle cuando contador = 5
WRITE: / 'Iteracion:', lv_counter.
WRITE: / 'Despues del bucle, contador =', lv_counter.
" Despues del bucle, contador = 5
2. EXIT en bucle WHILE
DATA: lv_sum TYPE i VALUE 0.
EXIT. " Salir si suma supera 500
WRITE: / 'Suma actual:', lv_sum.
WRITE: / 'Suma final:', lv_sum.
3. EXIT en LOOP AT
DATA: lt_numbers TYPE TABLE OF i,
lt_numbers = VALUE #( ( 10 ) ( 20 ) ( 30 ) ( 40 ) ( 50 ) ).
LOOP AT lt_numbers INTO lv_number.
EXIT. " Salir cuando se encuentra 30
WRITE: / 'Numero:', lv_number.
WRITE: / 'Ultimo numero procesado:', lv_number.
" Ultimo numero procesado: 30
4. EXIT en bucles anidados
DATA: lv_found TYPE abap_bool VALUE abap_false.
DATA(lv_outer) = sy-index.
DATA(lv_inner) = sy-index.
IF lv_outer = 3 AND lv_inner = 2.
EXIT. " Sale SOLO del bucle interno!
EXIT. " Ahora sale del bucle externo
WRITE: / 'Bucle externo:', lv_outer.
WRITE: / 'Despues de PERFORM'.
WRITE: / 'Inicio del procesamiento'.
IF sy-datum < '20240101'.
WRITE: / 'Fecha invalida'.
EXIT. " Sale de la subrutina
WRITE: / 'Procesando datos...'.
WRITE: / 'Fin del procesamiento'.
6. Buscar en tabla con EXIT
TYPES: BEGIN OF ty_customer,
DATA: lt_customers TYPE TABLE OF ty_customer,
ls_found TYPE ty_customer.
( id = 1 name = 'Muller' city = 'Berlin' )
( id = 2 name = 'Schmidt' city = 'Munich' )
( id = 3 name = 'Weber' city = 'Hamburg' )
" Buscar cliente de Munich
LOOP AT lt_customers INTO DATA(ls_customer).
IF ls_customer-city = 'Munich'.
EXIT. " Encontrado, salir del bucle
IF ls_found IS NOT INITIAL.
WRITE: / 'Encontrado:', ls_found-name.
7. EXIT vs. CHECK vs. CONTINUE vs. RETURN
" EXIT - termina el bucle completamente
EXIT. " Sale del bucle, no ejecuta mas iteraciones
" CHECK - salta la iteracion actual si condicion es falsa
CHECK sy-index MOD 2 = 0. " Solo numeros pares
WRITE: / sy-index. " 2, 4, 6, 8, 10
" CONTINUE - salta al siguiente ciclo
CONTINUE. " Salta solo la iteracion 5
WRITE: / sy-index. " 1,2,3,4,6,7,8,9,10
" RETURN - sale del metodo/procedimiento completo
RETURN. " Sale del metodo, no solo del bucle
" Este codigo no se ejecuta si RETURN ocurrio
8. Patron de busqueda con variable de control
DATA: lv_found TYPE abap_bool VALUE abap_false,
LOOP AT lt_items INTO DATA(ls_item).
IF ls_item-status = 'ERROR'.
WRITE: / 'Error encontrado en posicion:', lv_idx.
WRITE: / 'No se encontraron errores'.
9. EXIT en SELECT…ENDSELECT
EXIT. " Detener despues de 10 registros
WRITE: / ls_flight-carrid, ls_flight-connid.
10. Pattern: Salida temprana con validacion
" Validaciones con salida temprana usando IF
IF iv_order_id IS INITIAL.
ev_error = 'ID de pedido requerido'.
ev_error = 'Cantidad debe ser positiva'.
" Procesamiento principal (solo si validaciones pasaron)
Comparacion
| Sentencia | En bucle | En FORM | En METHOD |
|---|
EXIT | Termina bucle | Termina FORM | Termina bucle |
RETURN | Termina metodo | Termina FORM | Termina metodo |
CONTINUE | Siguiente iteracion | N/A | Siguiente iteracion |
CHECK cond | Siguiente si falso | Termina si falso | Siguiente si falso |
Notas importantes / Mejores practicas
EXIT solo afecta al bucle mas interno en bucles anidados.
- En
FORM, EXIT funciona como RETURN (termina la subrutina).
- Usar
EXIT para busquedas - no procesar mas cuando se encuentra.
- Preferir expresiones de tabla o
READ TABLE sobre LOOP + EXIT para busquedas simples.
EXIT fuera de bucle o subrutina causa error de sintaxis.
- Para salir de multiples bucles anidados, usar variables de control o reestructurar.
- En codigo moderno, considerar
RETURN en metodos en lugar de EXIT.