L’instruction CONTINUE est une instruction de contrôle qui est utilisée exclusivement à l’intérieur de constructions de boucle (DO, WHILE, LOOP AT, et la boucle obsolète SELECT...ENDSELECT).
Son but est d’interrompre immédiatement l’exécution de l’itération de boucle en cours et de passer directement au début de l’itération suivante. Toutes les instructions qui se trouveraient dans le bloc de boucle après la commande CONTINUE sont sautées pour cette itération spécifique.
Important : CONTINUE ne termine pas toute la boucle (c’est ce que fait EXIT), mais fait seulement en sorte que l’itération en cours ne soit pas terminée et que la suivante commence à la place (si la condition de boucle le permet encore).
Syntaxe
La syntaxe est très simple :
CONTINUE.Fonctionnement et comportement
Lorsque l’exécution du programme rencontre CONTINUE à l’intérieur d’une boucle :
- Toutes les instructions suivantes dans l’itération de boucle en cours sont ignorées.
- Le contrôle saute directement à la fin de l’itération en cours et initie le début de l’itération suivante. Cela signifie concrètement :
- Pour
DO ... ENDDO: Le compteur de boucle (sy-index) est incrémenté et la condition de boucle (par ex.TIMES) est vérifiée pour l’itération suivante. - Pour
WHILE ... ENDWHILE: Le contrôle retourne à la ligneWHILE <condition>et la condition est réévaluée. - Pour
LOOP AT ... ENDLOOP: Le système tente de traiter la ligne suivante de la table interne (met à joursy-tabix, lit éventuellement dans la zone de travail/le symbole de champ). - Pour
SELECT ... ENDSELECT(obsolète) : L’entrée de base de données correspondante suivante est récupérée.
- Pour
Contexte
CONTINUE n’est valide et significatif qu’à l’intérieur des types de boucle mentionnés. En dehors d’une boucle, CONTINUE entraîne une erreur de syntaxe.
Distinction avec EXIT et CHECK
EXIT: Termine toute la boucle immédiatement. L’exécution continue après leENDDO/ENDWHILE/ENDLOOP.CHECK <condition>.: Est conditionnel. Seulement si<condition>est fausse, le reste de l’itération en cours est sauté (se comporte alors commeCONTINUE).CONTINUE: Saute le reste de l’itération en cours inconditionnellement lorsque l’instruction est atteinte. La boucle continue cependant en principe.
Exemples
1. CONTINUE dans LOOP AT (Sauter certaines lignes)
TYPES: BEGIN OF ty_task, id TYPE i, description TYPE string, status TYPE c LENGTH 1, " O=Ouvert, C=Fermé END OF ty_task.DATA: lt_tasks TYPE STANDARD TABLE OF ty_task, ls_task TYPE ty_task.
APPEND VALUE #( id = 1 description = 'Tâche A' status = 'O' ) TO lt_tasks.APPEND VALUE #( id = 2 description = 'Tâche B' status = 'C' ) TO lt_tasks.APPEND VALUE #( id = 3 description = 'Tâche C' status = 'O' ) TO lt_tasks.APPEND VALUE #( id = 4 description = 'Tâche D' status = 'C' ) TO lt_tasks.
WRITE: / 'Traitement des tâches ouvertes :'.LOOP AT lt_tasks INTO ls_task. IF ls_task-status = 'C'. " Si la tâche est fermée... WRITE: / '-> Tâche', ls_task-id, 'est fermée, sautée (CONTINUE).'. CONTINUE. " ... sauter le reste et prendre la tâche suivante ENDIF.
" Ce code n'est exécuté que pour les tâches ouvertes ('O') WRITE: / '--> Traitement tâche :', ls_task-id, ls_task-description. " ... traitement réel ...ENDLOOP.Sortie :
Traitement des tâches ouvertes :--> Traitement tâche : 1 Tâche A-> Tâche 2 est fermée, sautée (CONTINUE).--> Traitement tâche : 3 Tâche C-> Tâche 4 est fermée, sautée (CONTINUE).2. CONTINUE dans DO (Sauter certaines valeurs de compteur)
DO 10 TIMES. DATA(lv_index) = sy-index.
IF lv_index > 3 AND lv_index < 7. " Sauter les itérations 4, 5, 6 WRITE: / 'Itération', lv_index, 'est sautée.'. CONTINUE. ENDIF.
WRITE: / 'Itération', lv_index, 'est traitée normalement.'.ENDDO.Sortie :
Itération 1 est traitée normalement.Itération 2 est traitée normalement.Itération 3 est traitée normalement.Itération 4 est sautée.Itération 5 est sautée.Itération 6 est sautée.Itération 7 est traitée normalement.Itération 8 est traitée normalement.Itération 9 est traitée normalement.Itération 10 est traitée normalement.3. CONTINUE dans WHILE
DATA counter TYPE i VALUE 0.
WHILE counter < 20. counter = counter + 1.
" Exemple : Exécuter une action supplémentaire seulement tous les 5 pas IF counter MOD 5 <> 0. " Si le compteur N'EST PAS divisible par 5... CONTINUE. " ... sauter le reste de cette itération ENDIF.
" Cette action n'est exécutée que si counter est 5, 10, 15, 20 WRITE: / 'Action supplémentaire à la valeur du compteur :', counter.
ENDWHILE.Sortie :
Action supplémentaire à la valeur du compteur : 5Action supplémentaire à la valeur du compteur : 10Action supplémentaire à la valeur du compteur : 15Action supplémentaire à la valeur du compteur : 20Notes importantes / Bonnes pratiques
CONTINUEest un outil utile pour rendre le code à l’intérieur des boucles plus clair en traitant et sautant certains cas de manière anticipée.- Il est presque toujours utilisé à l’intérieur d’une structure
IFpour rendre le saut dépendant d’une condition (IF <Condition> THEN CONTINUE. ENDIF.). - Assurez-vous que l’utilisation de
CONTINUEn’affecte pas la lisibilité du code. Parfois, une restructuration de la logiqueIFsansCONTINUEpeut être plus claire. - Veillez à ce que les variables de boucle (comme les compteurs dans les boucles
WHILE) soient correctement modifiées même lorsqueCONTINUEest utilisé, pour éviter les boucles infinies.