Control de bucles en ABAP: La instrucción CONTINUE en DO, WHILE y LOOP AT

Kategorie
ABAP-Statements
Veröffentlicht
Autor
Johannes

La instrucción CONTINUE es una instrucción de control que se utiliza exclusivamente dentro de estructuras de bucle (DO, WHILE, LOOP AT, y el obsoleto bucle SELECT...ENDSELECT).

Su propósito es interrumpir inmediatamente la ejecución de la iteración actual del bucle y continuar directamente con el inicio de la siguiente iteración. Todas las instrucciones que estarían después del comando CONTINUE en el bloque del bucle se omiten para esa iteración específica.

Importante: CONTINUE no termina todo el bucle (eso lo hace EXIT), sino que solo asegura que la iteración actual no se complete y en su lugar comience la siguiente (siempre que la condición del bucle lo permita).

Sintaxis

La sintaxis es muy simple:

CONTINUE.

Funcionamiento y comportamiento

Cuando la ejecución del programa encuentra CONTINUE dentro de un bucle:

  1. Todas las instrucciones siguientes dentro de la iteración actual del bucle son ignoradas.
  2. El control salta directamente al final de la iteración actual e inicia el comienzo de la siguiente iteración. Esto significa concretamente:
    • En DO ... ENDDO: El contador del bucle (sy-index) se incrementa y la condición del bucle (p.ej. TIMES) se verifica para la siguiente iteración.
    • En WHILE ... ENDWHILE: El control regresa a la línea WHILE <condicion> y la condición se evalúa nuevamente.
    • En LOOP AT ... ENDLOOP: El sistema intenta procesar la siguiente fila de la tabla interna (actualiza sy-tabix, lee en el área de trabajo/field symbol si corresponde).
    • En SELECT ... ENDSELECT (obsoleto): Se obtiene el siguiente registro de base de datos coincidente.

Contexto

CONTINUE solo es válido y tiene sentido dentro de los tipos de bucle mencionados. Fuera de un bucle, CONTINUE produce un error de sintaxis.

Diferencia con EXIT y CHECK

  • EXIT: Termina todo el bucle inmediatamente. La ejecución continúa después del ENDDO/ENDWHILE/ENDLOOP.
  • CHECK <condicion>.: Es condicional. Solo si <condicion> es falsa, se salta el resto de la iteración actual (entonces se comporta como CONTINUE).
  • CONTINUE: Salta el resto de la iteración actual incondicionalmente cuando se alcanza la instrucción. Sin embargo, el bucle continúa en principio.

Ejemplos

1. CONTINUE en LOOP AT (Saltar filas específicas)

TYPES: BEGIN OF ty_task,
id TYPE i,
description TYPE string,
status TYPE c LENGTH 1, " O=Open, C=Closed
END OF ty_task.
DATA: lt_tasks TYPE STANDARD TABLE OF ty_task,
ls_task TYPE ty_task.
APPEND VALUE #( id = 1 description = 'Tarea A' status = 'O' ) TO lt_tasks.
APPEND VALUE #( id = 2 description = 'Tarea B' status = 'C' ) TO lt_tasks.
APPEND VALUE #( id = 3 description = 'Tarea C' status = 'O' ) TO lt_tasks.
APPEND VALUE #( id = 4 description = 'Tarea D' status = 'C' ) TO lt_tasks.
WRITE: / 'Procesando tareas abiertas:'.
LOOP AT lt_tasks INTO ls_task.
IF ls_task-status = 'C'. " Si la tarea está cerrada...
WRITE: / '-> Tarea', ls_task-id, 'está cerrada, se omite (CONTINUE).'.
CONTINUE. " ... salta el resto y toma la siguiente tarea
ENDIF.
" Este código solo se ejecuta para tareas abiertas ('O')
WRITE: / '--> Procesando Tarea:', ls_task-id, ls_task-description.
" ... procesamiento real ...
ENDLOOP.

Salida:

Procesando tareas abiertas:
--> Procesando Tarea: 1 Tarea A
-> Tarea 2 está cerrada, se omite (CONTINUE).
--> Procesando Tarea: 3 Tarea C
-> Tarea 4 está cerrada, se omite (CONTINUE).

2. CONTINUE en DO (Saltar valores específicos del contador)

DO 10 TIMES.
DATA(lv_index) = sy-index.
IF lv_index > 3 AND lv_index < 7. " Saltar iteraciones 4, 5, 6
WRITE: / 'Iteración', lv_index, 'se omite.'.
CONTINUE.
ENDIF.
WRITE: / 'Iteración', lv_index, 'se procesa normalmente.'.
ENDDO.

Salida:

Iteración 1 se procesa normalmente.
Iteración 2 se procesa normalmente.
Iteración 3 se procesa normalmente.
Iteración 4 se omite.
Iteración 5 se omite.
Iteración 6 se omite.
Iteración 7 se procesa normalmente.
Iteración 8 se procesa normalmente.
Iteración 9 se procesa normalmente.
Iteración 10 se procesa normalmente.

3. CONTINUE en WHILE

DATA counter TYPE i VALUE 0.
WHILE counter < 20.
counter = counter + 1.
" Ejemplo: Ejecutar una acción adicional solo cada 5 pasos
IF counter MOD 5 <> 0. " Si el contador NO es divisible por 5...
CONTINUE. " ... salta el resto de esta iteración
ENDIF.
" Esta acción solo se ejecuta cuando counter es 5, 10, 15, 20
WRITE: / 'Acción adicional en contador:', counter.
ENDWHILE.

Salida:

Acción adicional en contador: 5
Acción adicional en contador: 10
Acción adicional en contador: 15
Acción adicional en contador: 20

Notas importantes / Mejores prácticas

  • CONTINUE es una herramienta útil para mantener el código dentro de bucles más claro, manejando ciertos casos tempranamente y saltándolos.
  • Casi siempre se usa dentro de una estructura IF para hacer que el salto dependa de una condición (IF <Condicion> THEN CONTINUE. ENDIF.).
  • Asegúrese de que el uso de CONTINUE no afecte la legibilidad del código. A veces una reestructuración de la lógica IF sin CONTINUE puede ser más clara.
  • Tenga cuidado de que las variables del bucle (como contadores en bucles WHILE) se modifiquen correctamente incluso cuando se usa CONTINUE, para evitar bucles infinitos.