Variables & Déclarations en ABAP #
Variables #
Objectifs #
- Comprendre ce qu’est une
VARIABLEen ABAP - Savoir déclarer et nommer correctement une
VARIABLE - Identifier les TYPES DE DONNEES disponibles
- Distinguer les syntaxes TYPE et LIKE
Definition #
Une
VARIABLEest un espace mémoire associé à un nom permettant de stocker une valeur temporaire.
Cette valeur peut changer durant l’exécution du programme.
Une
VARIABLEfonctionne comme une boîte étiquetée, un contenant nommé : tu peux y placer une donnée, la modifier ou la remplacer.
Declaration avec data #
Declaration simple #
WRITE:/ ’ - DECLARATION SIMPLE…'.
DATA lv_variable TYPE string.
DATAdéclare uneVARIABLE.lv_variableest son nom.TYPE stringindique qu’elle stocke une chaîne de caractères.
Declarations successives #
WRITE:/ ’ - DECLARATION SUCCESSIVE…'.
DATA: lv_variable1 TYPE string, lv_variable2 TYPE i, lv_variable3 TYPE c1.
DATA:déclare une succession deVARIABLES.lv_variable1→ texte (chaîne de caractères)lv_variable2→ entier (nombre)lv_variable3→ caractère fixe de 10 caractères
Grouper les déclarations rend le code plus lisible et facilite la maintenance.
Conventions de nommage #
| Règle | Exemple | Objectif |
|---|---|---|
| Noms clairs et descriptifs | lv_age, lv_total |
Faciliter la compréhension |
Préfixe lv_ pour VARIABLES locales |
lv_name |
Indique qu’elle est locale |
Préfixe gv_ pour VARIABLES globales |
gv_company |
Accessible dans tout le programme |
| Pas de mots-clés réservés | ✅ lv_count / ❌ DATA |
Éviter les erreurs de compilation |
| Déclarer en début de programme | — | Simplifie la relecture et les maintenances |
Nommer une
VARIABLE, c’est comme nommer un dossier sur ton ordinateur : un nom précis permet de retrouver facilement ce qu’il contient.
Type vs like #
Deux syntaxes existent pour déclarer une VARIABLE.
Type #
DATA lv_variable TYPE string.
Définit explicitement le type de données.
Like #
DATA lv_other_variable LIKE lv_variable.
Reprend le même type et la même longueur qu’une autre VARIABLE.
TYPE → référence à un type de données.
LIKE → référence à une autreVARIABLE.
WRITE:/ ’ - DECLARATION… LIKE…'.
DATA: lv_variable4 TYPE string, lv_variable5 LIKE lv_variable4, lv_variable6 LIKE lv_variable5.
Types de donnees de base #
Type c (character) #
WRITE:/ ’ - TYPE CHAR…'.
DATA: lv_firstname TYPE char255, lv_lastname(9) TYPE c. lv_firstname = 'John'. lv_lastname = 'Wick'.
Stocke des chaînes de texte fixes (noms, adresses, libellés, etc.).
Type i / n / numc (numerique) #
| Type | Description | Exemple d’usage |
|---|---|---|
I |
Nombre entier (arithmétique) | Calculs, boucles |
N |
Nombre stocké comme texte (sans signe) | Manipulation de chiffres en texte |
NUMC |
Caractères numériques | Codes postaux, numéros de compte |
WRITE:/ ’ - TYPE INTEGER…'.
DATA: lv_integer TYPE i, lv_year TYPE n, lv_numeric_string TYPE numc2. lv_integer = 10. lv_year = 2025. lv_numeric_string = 31000.
I= valeur numérique réelle, utilisée pour le calcul.
N/NUMC= texte contenant uniquement des chiffres.
Type d (date) et sy-datum #
WRITE:/ ’ - TYPE DATE…'.
DATA: lv_date TYPE d, lv_date2 TYPE datum. lv_date = sy-datum. lv_date2 = 19861102.
Format : AAAAMMJJ
Exemple : 20251029 → 29 octobre 2025.
Type t (time) et sy-uzeit #
WRITE:/ ’ - TYPE TIME…'.
DATA: lv_time TYPE t, lv_time2 TYPE uzeit. lv_time = sy-uzeit. lv_time2 = 183045.
Format : HHMMSS
Exemple : 183045 → 18h30min45s.
Type f (virgule flottante fixe) / float (precision variable) #
WRITE:/ ’ - TYPE FLOAT…'.
DATA: lv_f TYPE f, lv_float TYPE float. lv_f = '123455.12'. lv_float = '123455.12'.
Le TYPE F gère des valeurs décimales avec précision définie. Quant au type FLOAT, c’est une valeur réelle de précision variable, utile pour calculs scientifiques.
Type decfloat #
WRITE:/ ’ - TYPE DECFLOAT…'.
DATA: lv_decfloat TYPE decfloat34. lv_decfloat = '12345.67890123456789012345678901234'.
Précision jusqu’à 34 chiffres significatifs - utilisé pour les calculs financiers.
Type p (packed decimal) #
WRITE:/ ’ - TYPE PACKED DECIMAL…'.
DATA: lv_pack TYPE p DECIMALS 2. lv_pack = '1234.56'.
Type numérique compact, idéal pour montants financiers.
Type string #
WRITE:/ ’ - TYPE STRING…'.
DATA: lv_string TYPE string. lv_string = 'Hello World'.
Longueur variable, utile pour textes dynamiques.
Type boolean / abap_bool #
WRITE:/ ’ - TYPE BOOLEAN…'.
DATA: lv_bool TYPE boolean, lv_boolean TYPE abap_bool. lv_bool = abap_true. lv_boolean = abap_false.
Valeurs possibles : abap_true (vrai) / abap_false (faux)
Toujours initialiser explicitement :
DATA lv_flag TYPE boolean VALUE abap_true.
Type xfeld #
WRITE:/ ’ - TYPE XFELD…'.
DATA: lv_xfeld TYPE xfeld VALUE 'X'. lv_xfeld = 'X'. "Cocher lv_xfeld = ' '. "Décocher
Représente les cases à cocher SAP :
‘X’ = cochée, ’ ’ = décochée.
Préférer XFELD pour représenter visuellement des états binaires dans les écrans SAP.
Bonnes pratiques #
| Bonne pratique | Importance |
|---|---|
Déclarer toutes les VARIABLES au début |
Lisibilité et cohérence |
| Utiliser des noms explicites | Facilite la compréhension du rôle de chaque donnée |
| Grouper les déclarations par thème | Structure et clarté |
Toujours initialiser les VARIABLES |
Évite les comportements imprévus |
| Ne pas mélanger les types (ex: texte/num) | Prévient les erreurs de conversion |
Les noms clairs et la rigueur dans la déclaration permettent d’éviter 80% des erreurs de logique en ABAP.
Resume #
- Une VARIABLE stocke une valeur modifiable pendant le programme.
- On la déclare avec DATA et on suit des conventions strictes (lv*, gv*).
- TYPE et LIKE servent à définir ou copier une structure de type.
- Les types les plus utilisés : C, I, N, NUMC, D, T, F, STRING, BOOLEAN, XFELD.
- Toujours initialiser, documenter et nommer clairement les
VARIABLES.
Constantes #
Objectifs #
- Comprendre ce qu’est une CONSTANTE en ABAP
- Savoir déclarer une CONSTANTE avec
CONSTANTS - Appliquer les conventions de nommage
- Identifier les types de données possibles
- Différencier CONSTANTES et VARIABLES
Definition #
Une
CONSTANTEest une valeur fixe associée à un nom.
Contrairement à une variable, sa valeur ne change jamais pendant l’exécution du programme.
Une
CONSTANTE, c’est comme un repère fixé sur une carte : il ne bouge pas.
Une variable, elle, peut se déplacer.
Imagine une montre dont la pile est KO : la valeur reste figée.
Une variable serait un thermomètre normal, qui change avec la température.
Declaration avec constants #
Syntaxe simple #
WRITE:/ ’ - DECLARATION SIMPLE…’.
CONSTANTS: lc_valeur_const TYPE i VALUE 10.
CONSTANTS: mot-clé pour déclarer uneCONSTANTElc_valeur_const: nom de laCONSTANTETYPE i: type de données entierVALUE 10: valeur fixe attribuée à laCONSTANTE
C’est comme fixer plusieurs repères sur une même carte.
Le mot-clé
CONSTANTSaccepte la liste séparée par:pour déclarer plusieursCONSTANTESconsécutives.
Declarations successives #
WRITE:/ ’ - DECLARATION SUCCESSIVE…'.
CONSTANTS: lc_max_users TYPE i VALUE 100, lc_timeout TYPE i VALUE 30, lc_flag TYPE abap_bool VALUE abap_false.
- Utiliser la syntaxe
CONSTANTS:suivie d’une liste séparée par des virgules pour déclarer plusieursCONSTANTESen une seule instruction. - Chaque CONSTANTE doit préciser
TYPEetVALUEou utiliserLIKE+VALUE.
Regrouper les
CONSTANTESpar thème (paramètres, codes, formats) aide à la maintenance.
Conventions de nommage #
| Règle | Exemple | Objectif |
|---|---|---|
| Noms descriptifs | lc_max_value |
Comprendre rapidement le rôle de la CONSTANTE |
Préfixe lc_ pour locales |
lc_discount |
Indique qu’elle est locale au programme |
Préfixe gc_ pour globales |
gc_company |
Accessible depuis tout le programme |
| Pas de mots-clés réservés | ✅ lc_count / ❌ CONSTANTS |
Éviter les erreurs de compilation |
| Déclarer en début de programme | — | Facilite la lecture et la maintenance |
Une
CONSTANTE, c’est un panneau fixe : son étiquette doit être claire car elle ne changera jamais.
Type vs like #
Type #
CONSTANTS: lc_valeur_const TYPE i VALUE 10.
- Définit le type explicitement.
Like #
DATA: lv_variable TYPE i VALUE 5.
CONSTANTS: lc_valeur_const LIKE lv_variable VALUE 20.
- Copie le type d’une autre variable, mais reste immuable.
TYPE → tu choisis la forme de ta boîte.
LIKE → tu copies la boîte d’un autre, mais tu ne peux plus l’ouvrir.
Types de donnees pour constantes #
Integer / numeric / numc #
WRITE:/ ’ - TYPE INTEGER, N, NUMC…'.
CONSTANTS: lc_integer TYPE I VALUE 10, lc_max_value TYPE N VALUE 9999, lc_account_number TYPE NUMC10 VALUE 1234567890.
- I → nombres entiers pour calculs
- N / NUMC → texte numérique (ex: code postal)
Float / f #
WRITE:/ ’ - TYPE F, FLOAT…'.
CONSTANTS: lc_fixed_value TYPE F VALUE '1234.56', lc_float_value TYPE FLOAT VALUE '1234.567890123456789'.
- F → décimales fixes
- FLOAT → précision variable (scientifique)
Decfloat #
WRITE:/ ’ - TYPE DECFLOAT…'.
CONSTANTS: lc_decfloat TYPE DECFLOAT34 VALUE '12345.67890123456789012345678901234'.
- Haute précision, utile pour calculs financiers.
String #
WRITE:/ ’ - TYPE STRING…'.
CONSTANTS: lc_string TYPE STRING VALUE 'Hello, World!'.
- Texte de longueur variable, non modifiable.
Character #
WRITE:/ ’ - TYPE CHAR…'.
CONSTANTS: lc_char TYPE C LENGTH 1 VALUE 'F'.
- Caractère fixe (ex: initiale, statut).
Boolean / abap_bool #
WRITE:/ ’ - TYPE BOOLEAN…'.
CONSTANTS: lc_bool TYPE BOOLEAN VALUE ABAP_TRUE, lc_boolean TYPE ABAP_BOOL VALUE ABAP_FALSE.
- Valeurs logiques : vrai ou faux.
Date (d) et sy-datum #
WRITE:/ ’ - TYPE DATE…'.
CONSTANTS: lc_date1 TYPE D VALUE SY-DATUM, lc_date2 TYPE D VALUE 19861102.
- Format AAAAMMJJ.
Time (t) et sy-uzeit #
WRITE:/ ’ - TYPE TIME…'.
CONSTANTS: lc_time1 TYPE T VALUE SY-UZEIT, lc_time2 TYPE T VALUE 183045.
- Format HHMMSS.
Packed decimal (p) #
WRITE:/ ’ - TYPE PACKED…'.
CONSTANTS: lc_pi TYPE P DECIMALS 2 VALUE '3.14'.
- Valeur fixe pour montants ou calculs financiers.
Xfeld #
WRITE:/ ’ - TYPE XFELD…'.
CONSTANTS: lc_xfeld TYPE XFELD VALUE 'X'.
- ‘X’ = cochée / ’ ’ = décochée.
Bonnes pratiques #
| Bonne pratique | Explication |
|---|---|
| Toujours initialiser la CONSTANTE avec VALUE | Elle ne peut pas être modifiée ensuite |
| Utiliser des noms explicites et lisibles | Permet de comprendre rapidement le rôle du repère |
Grouper les CONSTANTES par thème |
Facilite la maintenance |
Préférer les CONSTANTES aux valeurs codées en dur |
Améliore la lisibilité et évite les erreurs |
Déclarer les CONSTANTES avant les variables |
Règle de bonne structure du code ABAP |
Remplace toujours les chiffres ou textes répétés par une
CONSTANTE: ton code sera plus clair et plus facile à maintenir.
Resume #
- Une
CONSTANTEgarde une valeur fixe pendant tout le programme.- Se déclare avec
CONSTANTS ... VALUE.TYPEetLIKEdéfinissent ou copient un type existant.- Types principaux : I, N, NUMC, F, DECFLOAT, STRING, C, BOOLEAN, D, T, P, XFELD.
- Toujours préférer une
CONSTANTEà une valeur “en dur”.- Les
CONSTANTESaméliorent la clarté, la sécurité et la maintenabilité du code ABAP.
Field-symbols #
Objectifs #
- Comprendre ce qu’est un
FIELD-SYMBOLen ABAP - Savoir déclarer un
FIELD-SYMBOLavecFIELD-SYMBOLS - Appliquer les conventions de nommage pour les
FIELD-SYMBOLS - Différencier
FIELD-SYMBOL, VARIABLE et CONSTANTE - Comprendre le principe d’assignation et pourquoi il est obligatoire
Definition #
Un
FIELD-SYMBOLest une variable spéciale qui agit comme un pointeur ou une référence vers une zone mémoire.
Modifier unFIELD-SYMBOLrevient à modifier directement la donnée pointée, pas leFIELD-SYMBOLlui-même.
Autrement dit, il ne contient pas de valeur propre, mais référence une autre variable, un champ de table ou un résultat d’expression.
Un
FIELD-SYMBOL, c’est comme une flèche sur une carte : la flèche ne contient pas l’objet, elle indique juste où il se trouve.Déplacer ou changer la flèche ne change pas l’objet ; mais utiliser la flèche pour modifier la zone, change directement l’objet.
Utilite #
- Parcourir des tables internes sans recopier les lignes.
- Travailler sur des structures dynamiques ou inconnues à l’avance.
- Gagner en performance et en flexibilité dans le code.
Principe #
- Un
FIELD-SYMBOLagit comme un alias temporaire. - On le déclare avec
FIELD-SYMBOLS, puis on le associe à une variable avecASSIGN. - Après l’association, toute modification via le
FIELD-SYMBOLmodifie directement la donnée d’origine.
Declaration avec field-symbols #
Syntaxe simple #
FIELD-SYMBOLS <lfs_> TYPE any.
ASSIGN <variable> TO <lfs_>.
IF <lfs_> IS ASSIGNED.
<lfs_> = 'Nouvelle valeur'.
ENDIF.
Exemple :
DATA lv_text TYPE string VALUE 'Bonjour'.
FIELD-SYMBOLS <lfs_string> TYPE string.
ASSIGN lv_text TO <lfs_string>.
<lfs_string> = 'Salut'.
WRITE:/ <lfs_string>.
Declaration multiple #
FIELD-SYMBOLS: <lfs_field1> TYPE any,
<lfs_field2> TYPE any,
<lfs_field3> TYPE any.
<lfs_integer>: nom duFIELD-SYMBOLentre chevrons< >TYPE: type de données pointé (i, string, any, etc.)- Astuce :
TYPE ANYpeut être utilisé si leFIELD-SYMBOLpointera sur différents types de données ou sur un objet ABAP.
TYPE ANYest très utile pour desFIELD-SYMBOLSqui pointeront sur différents types d’objets ou structures dynamiques.
Le principe d’assignation #
Un
FIELD-SYMBOLne contient pas de valeur avant d’être assigné.
Toute tentative d’écriture directe sans assignation provoque une erreurCX_SY_REF_IS_INITIAL.
Exemple non valide #
FIELD-SYMBOLS <lfs_num> TYPE i.
<lfs_num> = 10. "ERREUR ! Non assigné
Exemple correct #
DATA lv_number TYPE i.
FIELD-SYMBOLS <lfs_num> TYPE i.
ASSIGN lv_number TO <lfs_num>.
<lfs_num> = 10. "OK, modifie directement lv_number
ASSIGN: lie leFIELD-SYMBOLà une variable existante.- Ensuite, toute modification via le
FIELD-SYMBOLaffecte la variable cible. - Analogie : on pointe la flèche sur le panneau correct avant de pouvoir le modifier.
Exemple parfait #
DATA: lv_prenom2 TYPE string VALUE 'FRED'.
FIELD-SYMBOLS: <lfs_prenom> TYPE string.
ASSIGN lv_prenom2 TO <lfs_prenom>.
IF <lfs_prenom> IS ASSIGNED.
<lfs_prenom> = 'PIERRE'.
WRITE:/ <lfs_prenom>,
/ lv_prenom2.
ENDIF.
Pour être sûr qu’un Field-Symbol est assigné, vous pouvez controller l’assignation comme dans l’exemple ci-dessus via la condition
IF <lfs_> IS ASSIGNED. "Traitement ici en cas de condition true ENDIF.
Field-symbol et objet #
Pour info pour le module sur les CLASS
Pour un objet :
DATA lo_obj TYPE REF TO zcl_my_class.
FIELD-SYMBOLS <lfs_obj> TYPE zcl_my_class.
CREATE OBJECT lo_obj.
ASSIGN lo_obj->* TO <lfs_obj>. "Maintenant <lfs_obj> pointe sur l'objet
Conventions de nommage #
| Règle | Exemple | Objectif |
|---|---|---|
Préfixe <lfs_> pour locaux |
<lfs_customer> |
Indique FIELD-SYMBOL à une portée locale |
Préfixe <gfs_> pour globaux |
<gfs_order> |
Accessible globalement |
| Basé sur structure ou table | <lfs_customer_name> |
Clarifie la destination du pointeur |
| Basé sur type de données | <lfs_string> |
Indique le type pointé |
| Basé sur domaine | <lfs_amount> |
Facilite lecture pour données financières |
| Noms génériques | <lfs_generic> |
Utilisé quand la destination est non spécifique |
Utilisation #
- Toujours assigner avant utilisation :
ASSIGN lv_variable TO <lfs_integer>.
- Toute modification via
<lfs_integer>affectera directementlv_variable. - Ne jamais écrire sur un
FIELD-SYMBOLnon assigné.
Resume #
FIELD-SYMBOL= pointeur vers une zone mémoire, pas valeur directe- Déclarer avec
FIELD-SYMBOLS <nom> TYPE ...- Toujours assigner avec
ASSIGNavant toute utilisation- Préfixes
<lfs_>(local) ou<gfs_>(global) pour lisibilitéTYPE ANYutile pour objets ou types variables- Analogie générale : flèche sur une carte, elle pointe vers la cible, la modification se fait sur la cible, pas sur la flèche.