L’instruction WHILE en ABAP implémente une boucle à contrôle en entrée. Cela signifie qu’un bloc d”
instructions ABAP est exécuté de manière répétée tant que (anglais : while) une condition logique placée en tête de boucle est vraie (abap_true). La condition est vérifiée avant chaque passage potentiel du corps de boucle.
Syntaxe
WHILE <expression_logique>. " Bloc d'instructions qui est répété [Instruction1]. [Instruction2]. ... " Les instructions de contrôle comme CONTINUE, EXIT, CHECK sont possibles iciENDWHILE.WHILE: Le mot-clé qui introduit la boucle.<expression_logique>: Une expression qui peut être évaluée àabap_trueouabap_false. Cette expression contrôle si la boucle continue à s’exécuter. Exemples :compteur < 10,status = 'A',sy-subrc = 0,is_valid = abap_true.Bloc d'instructions: Une ou plusieurs instructions ABAP qui doivent être exécutées de manière répétée.ENDWHILE: Le mot-clé qui marque la fin du bloc de boucle.
Fonctionnement et déroulement
- Vérification de condition : D’abord, l’
<expression_logique>est évaluée. - Entrée/Exécution : Si le résultat est
abap_true, le bloc d’instructions entreWHILEetENDWHILEest exécuté. - Répétition : Après avoir atteint
ENDWHILE(ou si unCONTINUEest exécuté dans le bloc), le contrôle revient à l’instructionWHILE, et l’<expression_logique>est à nouveau évaluée. - Continuation : Tant que la condition donne
abap_true, les étapes 2 et 3 sont répétées. - Arrêt : Dès que la condition donne
abap_false, la boucle est terminée, et l’exécution du programme continue avec la première instruction aprèsENDWHILE. - Aucune exécution : Si la condition est déjà
abap_falselors de la toute première vérification, le bloc d’instructions de la boucle n’est pas du tout exécuté.
Condition de terminaison
Il est essentiel que les instructions au sein du bloc de boucle fassent en sorte que l’<expression_logique>
devienne abap_false à un moment donné. Si ce n’est pas le cas, une boucle infinie se crée, qui peut bloquer le programme. Typiquement, cela se fait en modifiant une variable qui fait partie de la condition (par ex. incrémenter un compteur, changer un statut).
Instructions de contrôle dans WHILE
On peut influencer le déroulement d’une boucle WHILE avec les instructions suivantes :
EXIT: Termine toute la boucleWHILEimmédiatement et saute à l’instruction aprèsENDWHILE.CONTINUE: Saute le reste du passage de boucle actuel et revient directement à la vérification de la conditionWHILEpour le prochain passage possible.CHECK <condition>: Si<condition>est fausse, le reste du passage actuel est sauté (se comporte commeCONTINUE).
Distinction par rapport à DO et LOOP AT
DON TIMES: Exécute un bloc exactement N fois (boucle compteur).DO.(sansTIMES) : Peut être une boucle infinie ; la condition d’arrêt doit être implémentée explicitement dans le corps de boucle avecEXIT.WHILE: Le nombre de passages n’est pas fixé à l’avance, mais dépend directement de la condition. Idéal quand quelque chose doit être répété jusqu’à ce qu’un certain état soit atteint.LOOP AT: Spécialement pour l’itération sur les tables internes. Si vous devez traiter des lignes de table,LOOP ATest le bon choix.
Exemples
1. Compteur simple
DATA count TYPE i VALUE 0.
WRITE: / 'La boucle démarre...'.
WHILE count < 5. count = count + 1. " Important : modifier le compteur ! WRITE: / 'Compteur actuel :', count.ENDWHILE.
WRITE: / 'Boucle terminée.'.Sortie :
La boucle démarre...Compteur actuel : 1Compteur actuel : 2Compteur actuel : 3Compteur actuel : 4Compteur actuel : 5Boucle terminée.2. Attente d’un statut
DATA status TYPE c LENGTH 1 VALUE 'N'. " N=Nouveau, P=En traitement, F=TerminéDATA max_retries TYPE i VALUE 5.DATA current_retry TYPE i VALUE 0.
WHILE status <> 'F' AND current_retry < max_retries. current_retry = current_retry + 1. WRITE: / 'Vérification du statut, tentative :', current_retry.
" Simuler une vérification ou un traitement externe IF current_retry = 3. status = 'F'. " Le statut change à la 3ème tentative WRITE: ' -> Le statut est maintenant Terminé (F)'. ELSE. WRITE: ' -> Le statut n\'est pas encore Terminé'. WAIT UP TO 1 SECONDS. " Uniquement pour démonstration ENDIF.ENDWHILE.
IF status = 'F'. WRITE: / 'Traitement terminé avec succès.'.ELSE. WRITE: / 'Traitement non terminé après', max_retries, 'tentatives.'.ENDIF.3. Sortir de la boucle avec EXIT
DATA somme TYPE i VALUE 0.DATA summand TYPE i VALUE 1.
WHILE somme < 50. somme = somme + summand. WRITE: / 'Ajouter', summand, '-> Nouvelle somme :', somme.
IF summand > 10. WRITE: ' -> Summand > 10, arrêt avec EXIT.'. EXIT. " Quitter immédiatement la boucle ENDIF.
summand = summand * 2. " Doubler le prochain summandENDWHILE.
WRITE: / 'Boucle terminée, somme finale :', somme.4. Boucle avec CONTINUE
DATA numero TYPE i VALUE 0.
WHILE numero < 8. numero = numero + 1.
IF numero = 3 OR numero = 6. WRITE: / numero, ': Sera sauté (CONTINUE).'. CONTINUE. " Sauter à la prochaine vérification de la condition WHILE ENDIF.
" Traitement uniquement pour les numéros non sautés WRITE: / numero, ': Sera traité.'.ENDWHILE.Sortie :
1 : Sera traité. 2 : Sera traité. 3 : Sera sauté (CONTINUE). 4 : Sera traité. 5 : Sera traité. 6 : Sera sauté (CONTINUE). 7 : Sera traité. 8 : Sera traité.Remarques importantes / Bonnes pratiques
- Le plus important avec les boucles
WHILEest d’assurer une condition d’arrêt valide pour éviter les boucles infinies. La condition doit pouvoir être influencée par des opérations à l’intérieur de la boucle. WHILEest particulièrement utile quand le nombre de répétitions nécessaires n’est pas connu à l’avance, mais dépend de l’atteinte d’un certain état ou d’une valeur.- Comparez
WHILEavecDOetLOOP ATpour choisir la construction de boucle la plus appropriée et la plus lisible pour le cas d’utilisation respectif.