L’instruction DO en ABAP est une construction de boucle utilisee pour executer un bloc d’instructions de maniere repetee. Elle existe principalement en deux variantes :
- Nombre fixe d’iterations : execute le bloc de boucle exactement
<n>fois. - Sortie conditionnelle de l’interieur : execute le bloc de boucle potentiellement indefiniment, jusqu’a ce que la boucle soit explicitement quittee par une instruction comme
EXIT.
Un champ systeme utile dans les boucles DO est sy-index, qui compte automatiquement l’iteration de boucle actuelle (en commencant par 1).
Syntaxe
1. Nombre fixe d’iterations (DO n TIMES)
DO <n> TIMES. " Bloc d'instructions [Instruction1]. [Instruction2]. ... " Les instructions de controle comme CONTINUE, EXIT, CHECK sont possibles iciENDDO.<n>: une expression numerique (literal, variable, constante - generalement de typeI), qui indique le nombre d’iterations souhaitees. Si<n>est inferieur ou egal a zero, le bloc d’instructions n’est pas du tout execute.sy-index: contient dans chaque iteration le numero d’iteration actuel (1, 2, 3, …, n).
2. Boucle avec sortie de l’interieur (DO.)
DO. " Bloc d'instructions [Instruction1]. ... IF <condition_sortie>. EXIT. " Absolument necessaire ! ENDIF. ...ENDDO.- Cette variante n’a pas de condition de sortie integree. Elle s’execute theoriquement indefiniment.
- Il est obligatoire d’inclure dans le bloc d’instructions une condition (
IF) avec une instructionEXIT(ouRETURNdans les procedures) pour quitter la boucle et eviter une boucle infinie. sy-index: compte aussi les iterations ici (1, 2, 3, …).
Fonctionnement et deroulement
DO <n> TIMES.
- La valeur de
<n>est determinee. sy-indexest mis a 1.- Tant que
sy-indexest inferieur ou egal a<n>: a. Le bloc d’instructions est execute. b.sy-indexest automatiquement incremente de 1. - Si
sy-indexest superieur a<n>, la boucle se termine et l’execution continue apresENDDO.
DO.
sy-indexest mis a 1.- Le bloc d’instructions est execute.
sy-indexest automatiquement incremente de 1.- Le controle revient toujours au debut du bloc d’instructions (apres
DO.). - La boucle n’est quittee que par une instruction
EXITexplicite (ouRETURNetc.).
Instructions de controle dans DO
EXIT: termine toute la boucleDO(que ce soitDO n TIMESouDO.) immediatement. L’execution continue apresENDDO.CONTINUE: saute le reste de l’iteration actuelle et passe au debut de l’iteration suivante (incrementesy-index, verifie eventuellement la conditionTIMES).CHECK <condition>: si<condition>est fausse, le reste de l’iteration actuelle est saute (se comporte commeCONTINUE).
Distinction avec WHILE et LOOP AT
WHILE <condition>: verifie la condition avant chaque iteration (controle en tete). Adapte quand le nombre d’iterations n’est pas fixe mais depend d’une condition.LOOP AT: concu specifiquement pour l’iteration sur les lignes d’une table interne.DO <n> TIMES: ideal quand le nombre de repetitions est connu a l’avance (boucle de comptage).DO.: plus rare ; pour les cas ou la condition de sortie est complexe et mieux verifiee a l’interieur de la boucle ou plusieurs points de sortie existent.
Exemples
1. DO n TIMES - Repetition simple avec sy-index
DATA message TYPE string VALUE 'Bonjour'.
DO 4 TIMES. WRITE: / sy-index, '. Repetition:', message.ENDDO.Sortie :
1 . Repetition: Bonjour 2 . Repetition: Bonjour 3 . Repetition: Bonjour 4 . Repetition: Bonjour2. DO. avec EXIT (sommation jusqu’a une limite)
DATA somme TYPE i VALUE 0.DATA ajout TYPE i VALUE 0.DATA maximum TYPE i VALUE 50.
DO. ajout = ajout + 5. somme = somme + ajout. WRITE: / 'Iteration:', sy-index, ' | Ajoute:', ajout, ' | Somme:', somme.
IF somme >= maximum. WRITE: / '-> Maximum atteint ou depasse. EXIT.'. EXIT. " Quitter la boucle ENDIF.
IF sy-index > 10. " Sortie de securite WRITE: / '-> Limite de securite (10 iterations) atteinte. EXIT.'. EXIT. ENDIF.
ENDDO.
WRITE: / 'Boucle terminee. Somme finale:', somme.Sortie possible :
Iteration: 1 | Ajoute: 5 | Somme: 5Iteration: 2 | Ajoute: 10 | Somme: 15Iteration: 3 | Ajoute: 15 | Somme: 30Iteration: 4 | Ajoute: 20 | Somme: 50-> Maximum atteint ou depasse. EXIT.Boucle terminee. Somme finale: 503. DO n TIMES avec CONTINUE (sauter certaines iterations)
DO 6 TIMES. IF sy-index MOD 2 = 0. " Si sy-index est pair... WRITE: / 'Iteration', sy-index, 'sautee (nombre pair).'. CONTINUE. " ...passer a l'iteration suivante ENDIF. WRITE: / 'Iteration', sy-index, 'traitee (nombre impair).'.ENDDO.Sortie :
Iteration 1 traitee (nombre impair).Iteration 2 sautee (nombre pair).Iteration 3 traitee (nombre impair).Iteration 4 sautee (nombre pair).Iteration 5 traitee (nombre impair).Iteration 6 sautee (nombre pair).Remarques importantes / Bonnes pratiques
- Utilisez
DO <n> TIMESquand vous savez exactement combien de fois une action doit etre repetee. - Soyez extremement prudent avec la syntaxe
DO.sansTIMES. Assurez-vous absolument qu’il existe une conditionEXITatteignable, sinon vous creez une boucle infinie ! sy-indexest votre allie dans les bouclesDOpour suivre l’iteration actuelle.- Choisissez la construction de boucle (
DO,WHILE,LOOP AT) qui represente le plus clairement et efficacement la logique de votre probleme.