CLEAR en ABAP : Initialiser les variables, structures et tables – Syntaxe et utilisation

Catégorie
ABAP-Statements
Publié
Auteur
Johannes

L’instruction CLEAR est l’une des instructions les plus fondamentales et les plus fréquemment utilisées en ABAP. Son objectif est de réinitialiser le contenu d’un objet de données (une variable) à sa valeur initiale selon son type. Elle “efface” ou “vide” donc la valeur actuelle de la variable et rétablit l’état qu’aurait la variable directement après sa déclaration (sans clause VALUE).

CLEAR s’applique à presque tous les types d’objets de données :

  • Variables élémentaires (nombres, texte, date, heure, etc.)
  • Structures (Work Areas)
  • Tables internes
  • Variables de référence (références d’objets, références de données)
  • Symboles de champ (agit sur l’objet de données assigné)

Syntaxe

La syntaxe est très simple :

1. Réinitialisation d’un seul objet de données

CLEAR <objet_donnees>.
  • <objet_donnees> : Le nom de la variable, de la structure, de la table interne, etc., à réinitialiser.

2. Réinitialisation de plusieurs objets de données (instruction chaînée)

CLEAR: <objet_donnees1>, <objet_donnees2>, ..., <objet_donneesN>.

Avec un deux-points après CLEAR et des virgules entre les noms de variables, plusieurs objets de données peuvent être réinitialisés en une seule instruction.

Fonctionnement et effet sur différents types de données

La valeur initiale à laquelle CLEAR réinitialise dépend du type de données de l’objet :

Types élémentaires

  • Numérique (I, P, F, …) : 0
  • Chaîne de caractères de longueur fixe (C, N, D, T) : Remplie d’espaces (selon la longueur définie). Ex. C(5) devient ' '.
  • Chaîne de caractères de longueur variable (STRING) : Chaîne vide ('').
  • Chaîne d’octets de longueur fixe (X) : Remplie de 00 hexadécimal (selon la longueur définie). Ex. X(2) devient X'0000'.
  • Chaîne d’octets de longueur variable (XSTRING) : Chaîne d’octets vide.
  • Références (TYPE REF TO ...) : La référence devient NULL (elle ne pointe plus vers aucun objet ou zone de données).

Structures

CLEAR agit sur chaque composant de la structure individuellement, selon le type de données du composant respectif. Appliquer CLEAR à une structure signifie donc réinitialiser tous ses champs à leurs valeurs initiales.

Tables internes

CLEAR <table_interne>. supprime toutes les lignes du corps de la table. La table est ensuite vide (contient 0 lignes). La mémoire occupée par les lignes est libérée (à l’exception éventuelle d’une mémoire de base réservée par INITIAL SIZE).

  • Note sur les tables avec ligne d’en-tête (obsolète) : Pour les tables encore déclarées avec l’ancienne syntaxe DATA <table> TYPE <type> OCCURS n WITH HEADER LINE., CLEAR <table>. réinitialise à la fois le corps de la table et la ligne d’en-tête. CLEAR <table>[]. ne supprimerait que le corps. Pour les déclarations de tables modernes (DATA <table> TYPE TABLE OF ...), il n’y a pas de ligne d’en-tête, et CLEAR <table>. supprime toujours le corps.

Distinction avec FREE

Bien que CLEAR libère la mémoire des lignes pour les tables internes, il existe également l’instruction FREE.

  • CLEAR : Réinitialise la valeur. Pour les tables : supprime le contenu des lignes et libère la mémoire des lignes.
  • FREE : Est plus agressif dans la libération de mémoire, en particulier pour les tables internes et les objets comme les strings. FREE <table>. tente de restituer toute la mémoire de la table (y compris les informations de gestion) au système d’exploitation. FREE réinitialise également la variable à sa valeur initiale. On utilise FREE généralement lorsque de très grandes tables ou objets ne sont définitivement plus nécessaires et que la mémoire doit être libérée de toute urgence. Pour les variables élémentaires simples, FREE se comporte comme CLEAR.

Cas d’utilisation typiques de CLEAR

  • Initialiser une variable avant sa (ré)utilisation pour s’assurer qu’aucune ancienne valeur n’est présente.
  • Réinitialiser une structure de travail (Work Area) avant de lire les données d’une nouvelle ligne d’une table interne (important dans les boucles LOOP AT ... INTO wa.).
  • Vider une table interne avant de la remplir avec de nouvelles données.
  • Réinitialiser des compteurs, des sommes ou des indicateurs d’état.

Exemples

1. Variables élémentaires

DATA count TYPE i VALUE 55.
DATA description TYPE string VALUE 'Un texte'.
DATA is_valid TYPE abap_bool VALUE abap_true.
WRITE: / 'Avant:', count, description, is_valid.
CLEAR: count, description, is_valid.
WRITE: / 'Après:', count, description, is_valid.

Sortie :

Avant: 55 Un texte X
Après: 0 ' "

(Note : abap_false est affiché comme espace ’ ‘).

2. Structure

TYPES: BEGIN OF ty_person,
name TYPE string,
age TYPE i,
END OF ty_person.
DATA person TYPE ty_person.
person-name = 'Meier'.
person-age = 42.
WRITE: / 'Personne avant:', person-name, person-age.
CLEAR person.
WRITE: / 'Personne après:', person-name, person-age.

Sortie :

Personne avant: Meier 42
Personne après: 0

3. Table interne

DATA number_table TYPE STANDARD TABLE OF i WITH EMPTY KEY.
APPEND 1 TO number_table.
APPEND 2 TO number_table.
APPEND 3 TO number_table.
WRITE: / 'Lignes avant CLEAR:', lines( number_table ).
CLEAR number_table.
WRITE: / 'Lignes après CLEAR:', lines( number_table ).

Sortie :

Lignes avant CLEAR: 3
Lignes après CLEAR: 0

4. Zone de travail dans une boucle

TYPES: BEGIN OF ty_item,
id TYPE i,
END OF ty_item.
DATA: lt_items TYPE STANDARD TABLE OF ty_item,
ls_item TYPE ty_item.
APPEND VALUE #( id = 10 ) TO lt_items.
APPEND VALUE #( id = 20 ) TO lt_items.
LOOP AT lt_items INTO ls_item.
WRITE: / 'Traitement ID:', ls_item-id.
" ... Logique avec ls_item ...
" Bonne pratique : Vider la Work Area pour la prochaine itération ou utilisation ultérieure
CLEAR ls_item.
WRITE: ' | Work Area ID après CLEAR:', ls_item-id.
ENDLOOP.

Sortie :

Traitement ID: 10 | Work Area ID après CLEAR: 0
Traitement ID: 20 | Work Area ID après CLEAR: 0

En résumé : CLEAR est une instruction indispensable pour remettre de manière contrôlée les objets de données dans leur état initial défini. Elle est simple à utiliser et essentielle pour un traitement de données propre dans de nombreux scénarios de programmation ABAP.