ABAP Bucle DO: Sintaxis, variantes y uso de sy-index

Kategorie
ABAP-Statements
Veröffentlicht
Autor
Johannes

La sentencia DO en ABAP es una construccion de bucle que se utiliza para ejecutar un bloque de sentencias repetidamente. Se presenta principalmente en dos variantes:

  1. Numero fijo de iteraciones: Ejecuta el bloque del bucle exactamente <n> veces.
  2. Terminacion condicional desde dentro: Ejecuta el bloque del bucle potencialmente infinitas veces hasta que el bucle se abandona explicitamente mediante una sentencia como EXIT.

Un campo del sistema util dentro de bucles DO es sy-index, que cuenta automaticamente la iteracion actual del bucle (comenzando en 1).

Sintaxis

1. Numero fijo de iteraciones (DO n TIMES)

DO <n> TIMES.
" Bloque de sentencias
[Sentencia1].
[Sentencia2].
...
" Sentencias de control como CONTINUE, EXIT, CHECK son posibles aqui
ENDDO.
  • <n>: Una expresion numerica (literal, variable, constante - normalmente de tipo I) que indica el numero de iteraciones deseadas. Si <n> es menor o igual a cero, el bloque de sentencias no se ejecuta en absoluto.
  • sy-index: Contiene en cada iteracion el numero de iteracion actual (1, 2, 3, …, n).

2. Bucle con terminacion desde dentro (DO.)

DO.
" Bloque de sentencias
[Sentencia1].
...
IF <condicion_salida>.
EXIT. " Absolutamente necesario!
ENDIF.
...
ENDDO.
  • Esta variante no tiene condicion de salida incorporada. Teoricamente se ejecuta infinitamente.
  • Es obligatorio incluir dentro del bloque de sentencias una condicion (IF) con una sentencia EXIT (o RETURN en procedimientos) para abandonar el bucle y prevenir un bucle infinito.
  • sy-index: Tambien cuenta aqui las iteraciones (1, 2, 3, …).

Funcionamiento y flujo

DO <n> TIMES.

  1. Se determina el valor de <n>.
  2. sy-index se establece a 1.
  3. Mientras sy-index sea menor o igual a <n>: a. Se ejecuta el bloque de sentencias. b. sy-index se incrementa automaticamente en 1.
  4. Cuando sy-index es mayor que <n>, el bucle termina y la ejecucion continua despues de ENDDO.

DO.

  1. sy-index se establece a 1.
  2. Se ejecuta el bloque de sentencias.
  3. sy-index se incrementa automaticamente en 1.
  4. El control siempre salta de vuelta al inicio del bloque de sentencias (despues de DO.).
  5. El bucle solo se abandona mediante una sentencia EXIT explicita (o RETURN etc.).

Sentencias de control dentro de DO

  • EXIT: Termina el bucle DO completo (sin importar si es DO n TIMES o DO.) inmediatamente. La ejecucion continua despues de ENDDO.
  • CONTINUE: Salta el resto de la iteracion actual y salta al inicio de la siguiente iteracion (incrementa sy-index, verifica la condicion TIMES si aplica).
  • CHECK <condicion>: Si <condicion> es falsa, se salta el resto de la iteracion actual (se comporta como CONTINUE).

Delimitacion frente a WHILE y LOOP AT

  • WHILE <condicion>: Verifica la condicion antes de cada iteracion (controlado por cabecera). Adecuado cuando el numero de iteraciones no es fijo, sino que depende de una condicion.
  • LOOP AT: Especificamente concebido para iterar sobre las filas de una tabla interna.
  • DO <n> TIMES: Ideal cuando el numero de repeticiones es conocido de antemano (bucle contador).
  • DO.: Mas raro; para casos donde la condicion de salida es compleja y se verifica mejor dentro del bucle o existen multiples puntos de salida.

Ejemplos

1. DO n TIMES - Repeticion simple con sy-index

DATA message TYPE string VALUE 'Hola'.
DO 4 TIMES.
WRITE: / sy-index, '. Repeticion:', message.
ENDDO.

Salida:

1 . Repeticion: Hola
2 . Repeticion: Hola
3 . Repeticion: Hola
4 . Repeticion: Hola

2. DO. con EXIT (Suma hasta un limite)

DATA suma TYPE i VALUE 0.
DATA sumando TYPE i VALUE 0.
DATA maximo TYPE i VALUE 50.
DO.
sumando = sumando + 5.
suma = suma + sumando.
WRITE: / 'Iteracion:', sy-index, ' | Sumar:', sumando, ' | Suma:', suma.
IF suma >= maximo.
WRITE: / '-> Maximo alcanzado o superado. EXIT.'.
EXIT. " Abandonar bucle
ENDIF.
IF sy-index > 10. " Salida de seguridad
WRITE: / '-> Limite de seguridad (10 iteraciones) alcanzado. EXIT.'.
EXIT.
ENDIF.
ENDDO.
WRITE: / 'Bucle terminado. Suma final:', suma.

Posible salida:

Iteracion: 1 | Sumar: 5 | Suma: 5
Iteracion: 2 | Sumar: 10 | Suma: 15
Iteracion: 3 | Sumar: 15 | Suma: 30
Iteracion: 4 | Sumar: 20 | Suma: 50
-> Maximo alcanzado o superado. EXIT.
Bucle terminado. Suma final: 50

3. DO n TIMES con CONTINUE (Saltar ciertas iteraciones)

DO 6 TIMES.
IF sy-index MOD 2 = 0. " Si sy-index es par...
WRITE: / 'Iteracion', sy-index, 'saltada (numero par).'.
CONTINUE. " ...ir a la siguiente iteracion
ENDIF.
WRITE: / 'Iteracion', sy-index, 'procesada (numero impar).'.
ENDDO.

Salida:

Iteracion 1 procesada (numero impar).
Iteracion 2 saltada (numero par).
Iteracion 3 procesada (numero impar).
Iteracion 4 saltada (numero par).
Iteracion 5 procesada (numero impar).
Iteracion 6 saltada (numero par).

Notas importantes / Mejores practicas

  • Usa DO <n> TIMES cuando sepas exactamente cuantas veces debe repetirse una accion.
  • Se extremadamente cuidadoso con la sintaxis DO. sin TIMES. Asegurate absolutamente de que existe una condicion EXIT alcanzable, de lo contrario crearas un bucle infinito!
  • sy-index es tu aliado dentro de bucles DO para rastrear la iteracion actual.
  • Elige la construccion de bucle (DO, WHILE, LOOP AT) que represente la logica de tu problema de manera mas clara y eficiente.