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:
- Todas las instrucciones siguientes dentro de la iteración actual del bucle son ignoradas.
- 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íneaWHILE <condicion>y la condición se evalúa nuevamente. - En
LOOP AT ... ENDLOOP: El sistema intenta procesar la siguiente fila de la tabla interna (actualizasy-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.
- En
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 delENDDO/ENDWHILE/ENDLOOP.CHECK <condicion>.: Es condicional. Solo si<condicion>es falsa, se salta el resto de la iteración actual (entonces se comporta comoCONTINUE).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: 5Acción adicional en contador: 10Acción adicional en contador: 15Acción adicional en contador: 20Notas importantes / Mejores prácticas
CONTINUEes 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
IFpara hacer que el salto dependa de una condición (IF <Condicion> THEN CONTINUE. ENDIF.). - Asegúrese de que el uso de
CONTINUEno afecte la legibilidad del código. A veces una reestructuración de la lógicaIFsinCONTINUEpuede ser más clara. - Tenga cuidado de que las variables del bucle (como contadores en bucles
WHILE) se modifiquen correctamente incluso cuando se usaCONTINUE, para evitar bucles infinitos.