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:
- Numero fijo de iteraciones: Ejecuta el bloque del bucle exactamente
<n>veces. - 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 aquiENDDO.<n>: Una expresion numerica (literal, variable, constante - normalmente de tipoI) 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 sentenciaEXIT(oRETURNen 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.
- Se determina el valor de
<n>. sy-indexse establece a 1.- Mientras
sy-indexsea menor o igual a<n>: a. Se ejecuta el bloque de sentencias. b.sy-indexse incrementa automaticamente en 1. - Cuando
sy-indexes mayor que<n>, el bucle termina y la ejecucion continua despues deENDDO.
DO.
sy-indexse establece a 1.- Se ejecuta el bloque de sentencias.
sy-indexse incrementa automaticamente en 1.- El control siempre salta de vuelta al inicio del bloque de sentencias (despues de
DO.). - El bucle solo se abandona mediante una sentencia
EXITexplicita (oRETURNetc.).
Sentencias de control dentro de DO
EXIT: Termina el bucleDOcompleto (sin importar si esDO n TIMESoDO.) inmediatamente. La ejecucion continua despues deENDDO.CONTINUE: Salta el resto de la iteracion actual y salta al inicio de la siguiente iteracion (incrementasy-index, verifica la condicionTIMESsi aplica).CHECK <condicion>: Si<condicion>es falsa, se salta el resto de la iteracion actual (se comporta comoCONTINUE).
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: Hola2. 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: 5Iteracion: 2 | Sumar: 10 | Suma: 15Iteracion: 3 | Sumar: 15 | Suma: 30Iteracion: 4 | Sumar: 20 | Suma: 50-> Maximo alcanzado o superado. EXIT.Bucle terminado. Suma final: 503. 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> TIMEScuando sepas exactamente cuantas veces debe repetirse una accion. - Se extremadamente cuidadoso con la sintaxis
DO.sinTIMES. Asegurate absolutamente de que existe una condicionEXITalcanzable, de lo contrario crearas un bucle infinito! sy-indexes tu aliado dentro de buclesDOpara 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.