"Boucle ABAP à contrôle en entrée : l

Catégorie
ABAP-Statements
Publié
Auteur
Johannes

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 ici
ENDWHILE.
  • WHILE : Le mot-clé qui introduit la boucle.
  • <expression_logique> : Une expression qui peut être évaluée à abap_true ou abap_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

  1. Vérification de condition : D’abord, l’<expression_logique> est évaluée.
  2. Entrée/Exécution : Si le résultat est abap_true, le bloc d’instructions entre WHILE et ENDWHILE est exécuté.
  3. Répétition : Après avoir atteint ENDWHILE (ou si un CONTINUE est exécuté dans le bloc), le contrôle revient à l’instruction WHILE, et l’<expression_logique> est à nouveau évaluée.
  4. Continuation : Tant que la condition donne abap_true, les étapes 2 et 3 sont répétées.
  5. 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ès ENDWHILE.
  6. Aucune exécution : Si la condition est déjà abap_false lors 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 boucle WHILE immédiatement et saute à l’instruction après ENDWHILE.
  • CONTINUE : Saute le reste du passage de boucle actuel et revient directement à la vérification de la condition WHILE pour le prochain passage possible.
  • CHECK <condition> : Si <condition> est fausse, le reste du passage actuel est sauté (se comporte comme CONTINUE).

Distinction par rapport à DO et LOOP AT

  • DO N TIMES : Exécute un bloc exactement N fois (boucle compteur).
  • DO. (sans TIMES) : Peut être une boucle infinie ; la condition d’arrêt doit être implémentée explicitement dans le corps de boucle avec EXIT.
  • 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 AT est 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 : 1
Compteur actuel : 2
Compteur actuel : 3
Compteur actuel : 4
Compteur actuel : 5
Boucle 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 summand
ENDWHILE.
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 WHILE est 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.
  • WHILE est 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 WHILE avec DO et LOOP AT pour choisir la construction de boucle la plus appropriée et la plus lisible pour le cas d’utilisation respectif.