Exemple d’un code ABAP avec variables, constantes et types de données #
Vue d’ensemble #
Ce programme est un guide complet et pédagogique sur les variables, constantes et types de données en ABAP. Il couvre tous les types fondamentaux du langage ABAP avec des exemples pratiques et des exercices.
Structure du Programme #
| Fichier | Rôle | Contenu |
|---|---|---|
| ZADA_PROG_UNIT_03.txt | Programme principal | Orchestre l’appel de toutes les routines |
| ZADA_PROG_UNIT_03_TOP.txt | Déclarations globales | Variable globale gv_birthdate |
| ZADA_PROG_UNIT_03_SCR.txt | Écran de sélection | Vide (non utilisé) |
| ZADA_PROG_UNIT_03_F01.txt | Sous-programmes | 24 FORM routines pédagogiques |
Variables en ABAP #
Déclaration Simple #
FORM variable_declaration_simple.
" Déclaration individuelle
DATA lv_prenom TYPE string.
DATA lv_nom TYPE char40.
" Affectation
lv_prenom = 'adrien'.
lv_nom = 'dacunto'.
ENDFORM.
Points clés :
DATA: mot-clé pour déclarer une variableTYPE: spécifie le type de données- Chaque variable doit être déclarée avant utilisation
Déclaration Successive (Recommandée) #
FORM variable_declaration_succes.
DATA: lv_age TYPE i,
lv_code_p TYPE i.
lv_age = 10.
ENDFORM.
Avantages :
- Déclaration groupée avec
DATA: - Meilleure lisibilité
- Pratique standard en ABAP
Convention de Nommage #
FORM variable_convention_nommage.
DATA: lv_prix TYPE i, " Correct : lv_ pour local variable
prix TYPE i. " Mauvais : pas de préfixe
ENDFORM.
Préfixes standards :
lv_: Local Variable (variable locale)gv_: Global Variable (variable globale)lt_: Local Table (table interne locale)gt_: Global Table (table interne globale)ls_: Local Structure (structure locale)gs_: Global Structure (structure globale)
TYPE vs LIKE #
FORM variable_type_vs_like.
DATA: lv_variable4 TYPE string,
lv_variable5 LIKE lv_variable4, " Copie le type de lv_variable4
lv_variable6 LIKE lv_variable5. " Copie le type de lv_variable5
ENDFORM.
Différences :
| Mot-clé | Usage | Exemple |
|---|---|---|
| TYPE | Référence un type prédéfini | DATA lv_nom TYPE string |
| LIKE | Copie le type d’une variable existante | DATA lv_nom2 LIKE lv_nom |
Constantes en ABAP #
Déclaration Simple #
FORM constant_declaration_simple.
" Obligation de définir la valeur à la déclaration
CONSTANTS lc_an_0 TYPE i VALUE 0000.
DATA lv_an_sup LIKE lc_an_0.
lv_an_sup = lc_an_0 + 0001.
ENDFORM.
Points clés :
CONSTANTS: mot-clé pour déclarer une constanteVALUE: obligatoire à la déclarationlc_: préfixe pour Local Constant- Immuable : la valeur ne peut pas être modifiée après déclaration
Déclaration Successive #
FORM constant_declaration_succes.
CONSTANTS: lc_birthdate TYPE string VALUE 'Seoul',
lc_birthcountry TYPE string VALUE 'South Korea'.
ENDFORM.
Types de Données ABAP #
Type Caractère (C) #
FORM type_c.
" Deux manières de déclarer un TYPE char
DATA lv_char1 TYPE char10. " Méthode 1
DATA lv_char2(10) TYPE c. " Méthode 2 (Recommandée)
ENDFORM.
Caractéristiques :
- Chaîne de caractères de longueur fixe
- Utilisé pour limiter la taille
- Complété par des espaces à droite
Type String #
DATA lv_prenom TYPE string.
lv_prenom = 'adrien'.
Caractéristiques :
- Longueur dynamique
- Pas de limite de taille
- Type recommandé pour les textes
Types Numériques #
FORM type_numeric.
" Type Integer (i) : nombres entiers signés
DATA lv_integer TYPE i.
lv_integer = 1000.
" Type Numeric (n) : chaîne numérique
DATA lv_n TYPE n.
lv_n = 1000.
" Type NUMC : numérique avec longueur fixe
DATA lv_numc TYPE numc5.
lv_numc = 31000. " Code postal Toulouse
ENDFORM.
Comparaison :
| Type | Description | Exemple | Usage |
|---|---|---|---|
| i | Entier signé (-2³¹ à 2³¹-1) | 1000 |
Calculs mathématiques |
| n | Chaîne numérique | '0100' |
Codes, identifiants |
| numc | Numérique longueur fixe | 31000 |
Codes postaux, matricules |
Type Date (D) #
FORM type_date.
" Format AAAAMMJJ (YYYYMMDD)
DATA lv_date TYPE d.
lv_date = sy-datum. " Date système
lv_date = '19801104'. " Date fixe
DATA lv_datum TYPE datum.
lv_datum = sy-datum.
ENDFORM.
Points clés :
- Format obligatoire : AAAAMMJJ (8 caractères)
sy-datum: variable système contenant la date du jourTYPE douTYPE datum: équivalents
Type Heure (T) #
FORM type_heure.
DATA lv_heure TYPE uzeit.
DATA lv_heure2 TYPE t.
lv_heure = sy-uzeit. " Heure système
lv_heure2 = sy-uzeit.
ENDFORM.
Points clés :
- Format : HHMMSS (6 caractères)
sy-uzeit: variable système contenant l’heure actuelleTYPE touTYPE uzeit: équivalents
Type Float (F) #
FORM type_float.
DATA: lv_f TYPE f,
lv_float TYPE float.
lv_f = '123455.12'.
lv_float = '123455.12'.
ENDFORM.
Caractéristiques :
- Virgule flottante
- Précision : environ 15-17 chiffres significatifs
- Attention : peut avoir des problèmes d’arrondi
Type Decimal Float (DECFLOAT) #
FORM type_decfloat.
" Précision jusqu'à 34 chiffres significatifs
" Utilisé pour les calculs financiers
DATA lv_decfloat TYPE decfloat34.
lv_decfloat = '12345.67890123456789012345678901234'.
ENDFORM.
Avantages :
- Haute précision (34 chiffres)
- Idéal pour calculs financiers
- Évite les erreurs d’arrondi
Type Packed Decimal (P) #
FORM type_packed_decimal.
" Type numérique compact, idéal pour montants financiers
DATA lv_pack TYPE p DECIMALS 2.
lv_pack = '1234.56'.
ENDFORM.
Caractéristiques :
- Format compact (économie mémoire)
DECIMALS: nombre de décimales- Type recommandé pour les montants
Type Boolean #
FORM type_boolean.
DATA: lv_check TYPE boolean,
lv_check2 TYPE abap_bool.
lv_check = abap_true.
lv_check2 = abap_false.
ENDFORM.
Valeurs possibles :
abap_true: vrai (valeur ‘X’)abap_false: faux (valeur ’ ‘)abap_undefined: indéfini
Type XFELD #
FORM type_xfeld.
DATA: lv_xfeld1 TYPE xfeld,
lv_xfeld2 TYPE xfeld.
lv_xfeld1 = 'X'. " Actif / Vrai
lv_xfeld2 = ''. " Inactif / Faux
" IMPORTANT : Le 'X' doit être en MAJUSCULE !
ENDFORM.
Points clés :
- Caractère unique (1 caractère)
'X'= Vrai (case cochée)''(vide) = Faux (case non cochée)- Sensible à la casse : utiliser
'X'et non'x'
Field-Symbols (Pointeurs) #
Concept #
Les Field-Symbols sont des pointeurs ABAP qui référencent une zone mémoire sans la copier.
Analogie :
C’est comme une flèche sur une carte :
- La flèche ne contient pas l’objet
- Elle indique simplement où il se trouve
- Modifier via le Field-Symbol modifie l’original
Déclaration et Utilisation #
FORM type_fieldsymbols.
" 1. DÉCLARATION
DATA lv_text TYPE string VALUE 'Bonjour'.
FIELD-SYMBOLS <lfs_string> TYPE string.
" 2. ASSIGNATION (obligatoire avant utilisation)
ASSIGN lv_text TO <lfs_string>.
" 3. UTILISATION
WRITE:/ <lfs_string>. " Affiche : Bonjour
<lfs_string> = 'Salut'. " Modifie lv_text via le pointeur
WRITE:/ <lfs_string>. " Affiche : Salut
WRITE:/ lv_text. " Affiche aussi : Salut
" 4. EXEMPLE AVEC NOMBRE
DATA lv_number TYPE i.
FIELD-SYMBOLS <lfs_num> TYPE i.
ASSIGN lv_number TO <lfs_num>.
<lfs_num> = 10. " Modifie directement lv_number
ENDFORM.
Syntaxe Field-Symbol #
FIELD-SYMBOLS <nom> TYPE type.
Convention de nommage :
- Toujours entre chevrons :
<lfs_xxx> - Préfixe
lfs_: Local Field-Symbol - Préfixe
gfs_: Global Field-Symbol
Déclaration Successive #
FORM fieldsymbols_succes.
FIELD-SYMBOLS: <lfs_field1> TYPE any,
<lfs_field2> TYPE any,
<lfs_field3> TYPE any.
" TYPE any : peut pointer vers n'importe quel type
" Nécessite d'ASSIGN avant utilisation
ENDFORM.
Vérification d’Assignation #
IF <lfs_prenom> IS ASSIGNED.
<lfs_prenom> = 'Adrien'.
ENDIF.
Importance :
- Un Field-Symbol non assigné provoque l’erreur
CX_SY_REF_IS_INITIAL - Toujours vérifier avec
IS ASSIGNEDavant utilisation
Avantages des Field-Symbols #
Performance : pas de copie de données
Modification directe : change l’original
Flexibilité : TYPE any accepte tous les types
Mémoire : économise la RAM sur grandes tables
Exercices Pratiques #
Exercice Carte d’Identité #
FORM exercice_carte_identite.
" Déclarations de constantes
CONSTANTS: lc_birthdate TYPE d VALUE '20000829',
lc_birthcountry TYPE string VALUE 'FRA',
lc_birthplace TYPE string VALUE 'Saint-Jean'.
" Déclarations de variables
DATA: lv_lastname TYPE string,
lv_firstname TYPE string,
lv_num_doc TYPE string,
lv_expiration_date TYPE d,
lv_sex TYPE c LENGTH 1,
lv_height TYPE float,
lv_date_delivery TYPE d,
lv_address TYPE string.
" Affectation de valeurs
lv_lastname = 'D''acunto'. " Double apostrophe pour échapper
lv_firstname = 'Adrien'.
lv_num_doc = 'BJZJXV8X9'.
lv_expiration_date = '20350818'.
lv_sex = 'M'.
lv_height = '1.67'.
lv_date_delivery = '20250819'.
lv_address = '1 RUE DES MARGUERITES 31140 AUCAMVILLE FRANCE'.
" Affichage
WRITE:/ 'LASTNAME : ', lv_lastname,
/ 'FIRSTNAME : ', lv_firstname,
/ 'BIRTHDATE : ', lc_birthdate,
/ 'BIRTHCOUNTRY : ', lc_birthcountry,
/ 'BIRTHPLACE : ', lc_birthplace,
/ 'DOCUMENT NUMBER : ', lv_num_doc,
/ 'EXPIRATION DATE : ', lv_expiration_date,
/ 'SEX : ', lv_sex,
/ 'HEIGHT : ', lv_height,
/ 'DELIVERY DATE : ', lv_date_delivery,
/ 'ADDRESS : ', lv_address.
ENDFORM.
Notions couvertes :
- Constantes pour données immuables
- Variables pour données modifiables
- Types variés (string, date, float, caractère)
- Échappement d’apostrophe :
'D''acunto'
Exercice Field-Symbols #
FORM exercice_fieldsymbols.
" Déclaration de variables de base
DATA: lv_nom TYPE string VALUE 'Dupont',
lv_prenom TYPE string VALUE 'Claire',
lv_age TYPE i VALUE 32.
" 1. Déclarer 3 field-symbols
FIELD-SYMBOLS: <lfs_nom> TYPE string,
<lfs_prenom> TYPE string,
<lfs_age> TYPE i.
" 2. Assigner chaque field-symbol
ASSIGN lv_nom TO <lfs_nom>.
ASSIGN lv_prenom TO <lfs_prenom>.
ASSIGN lv_age TO <lfs_age>.
" 3. Modifier via field-symbols avec vérification
IF <lfs_prenom> IS ASSIGNED.
<lfs_prenom> = 'Adrien'.
ENDIF.
IF <lfs_nom> IS ASSIGNED.
<lfs_nom> = 'D''acunto'.
ENDIF.
IF <lfs_age> IS ASSIGNED.
<lfs_age> = 25.
ENDIF.
" 4. Affichage des variables (modifiées via Field-Symbols)
WRITE:/ 'LASTNAME : ', lv_nom,
/ 'FIRSTNAME : ', lv_prenom,
/ 'AGE : ', lv_age.
ENDFORM.
Résultat attendu :
LASTNAME : D'acunto
FIRSTNAME : Adrien
AGE : 25
Concepts démontrés :
- Déclaration de Field-Symbols
- Assignation avec
ASSIGN...TO - Vérification avec
IS ASSIGNED - Modification indirecte des variables originales
Conventions de Nommage #
Préfixes pour Variables #
| Préfixe | Signification | Portée | Exemple |
|---|---|---|---|
lv_ |
Local Variable | Locale (FORM, méthode) | lv_nom |
gv_ |
Global Variable | Globale (programme) | gv_birthdate |
lc_ |
Local Constant | Locale | lc_an_0 |
gc_ |
Global Constant | Globale | gc_tva_rate |
Préfixes pour Structures et Tables #
| Préfixe | Signification | Exemple |
|---|---|---|
ls_ |
Local Structure | ls_material |
gs_ |
Global Structure | gs_customer |
lt_ |
Local Table | lt_invoices |
gt_ |
Global Table | gt_products |
Préfixes pour Field-Symbols #
| Préfixe | Signification | Exemple |
|---|---|---|
<lfs_> |
Local Field-Symbol | <lfs_item> |
<gfs_> |
Global Field-Symbol | <gfs_line> |
Règles Générales #
À FAIRE :
- Noms en minuscules avec underscores :
lv_first_name - Noms descriptifs et explicites
- Respecter les préfixes selon la portée
- Utiliser l’anglais pour cohérence (recommandé)
À ÉVITER :
- Noms ambigus :
lv_temp,lv_x - Pas de préfixe :
prixau lieu delv_prix - CamelCase :
lvFirstName(non standard ABAP) - Noms trop longs :
lv_variable_contenant_le_montant_total_avec_tva
Tableau Récapitulatif des Types #
Types Caractères #
| Type | Taille | Description | Exemple |
|---|---|---|---|
| C | Fixe (1-65535) | Caractères longueur fixe | DATA lv_char(10) TYPE c |
| STRING | Variable | Chaîne dynamique | DATA lv_text TYPE string |
| N | Fixe | Chaîne numérique | DATA lv_n(5) TYPE n |
Types Numériques #
| Type | Plage | Décimales | Usage | Exemple |
|---|---|---|---|---|
| I | -2³¹ à 2³¹-1 | Non | Entiers signés | DATA lv_count TYPE i |
| P | Variable | Oui | Montants, calculs précis | DATA lv_amount TYPE p DECIMALS 2 |
| F | ±10⁻³⁰⁷ à ±10³⁰⁸ | Oui | Calculs scientifiques | DATA lv_pi TYPE f |
| DECFLOAT16 | 16 chiffres | Oui | Calculs financiers précis | DATA lv_price TYPE decfloat16 |
| DECFLOAT34 | 34 chiffres | Oui | Haute précision | DATA lv_exact TYPE decfloat34 |
Types Date et Heure #
| Type | Format | Description | Variable Système |
|---|---|---|---|
| D | AAAAMMJJ | Date | sy-datum |
| T | HHMMSS | Heure | sy-uzeit |
| DATUM | AAAAMMJJ | Date (alias de D) | sy-datum |
| UZEIT | HHMMSS | Heure (alias de T) | sy-uzeit |
Types Logiques #
| Type | Valeurs | Description |
|---|---|---|
| BOOLEAN | abap_true, abap_false, abap_undefined |
Booléen ABAP |
| ABAP_BOOL | abap_true, abap_false |
Booléen simplifié |
| XFELD | 'X' ou '' |
Case à cocher (1 caractère) |
Comparaison des Types pour Montants #
| Type | Avantages | Inconvénients | Recommandation |
|---|---|---|---|
| P (DECIMALS 2) | Compact, précis, standard SAP | Limité à 31 chiffres | ⭐ Recommandé pour montants |
| DECFLOAT34 | Très haute précision | Plus lourd en mémoire | Pour calculs complexes |
| F (Float) | Rapide | Erreurs d’arrondi | Éviter pour montants |
Astuces et Bonnes Pratiques #
Raccourcis Clavier (mentionnés dans le code) #
| Raccourci | Action |
|---|---|
| CTRL + D | Duplique la ligne sélectionnée |
| CTRL + Clic Gauche | Sélectionne le mot entier |
Bonnes Pratiques #
Variables #
Déclarer au plus près de l’utilisation
" Bon
START-OF-SELECTION.
DATA lv_count TYPE i.
lv_count = 10.
" Mauvais (déclaration trop éloignée)
DATA lv_count TYPE i.
" ... 100 lignes de code ...
START-OF-SELECTION.
lv_count = 10.
Constantes #
Utiliser pour les valeurs fixes
" Bon
CONSTANTS lc_tva_rate TYPE p DECIMALS 2 VALUE '20.00'.
DATA lv_prix_ttc TYPE p DECIMALS 2.
lv_prix_ttc = lv_prix_ht * ( 1 + lc_tva_rate / 100 ).
" Mauvais (valeur magique)
lv_prix_ttc = lv_prix_ht * 1.2. " D'où vient 1.2 ?
Types de Données #
Choisir le type approprié
| Cas d’usage | Type recommandé |
|---|---|
| Montant financier | TYPE p DECIMALS 2 |
| Compteur, index | TYPE i |
| Texte libre | TYPE string |
| Code postal | TYPE numc5 |
| Indicateur oui/non | TYPE xfeld ou TYPE abap_bool |
| Date | TYPE d |
| Heure | TYPE t |
Field-Symbols #
Vérifier l’assignation
" Bon
IF <lfs_data> IS ASSIGNED.
<lfs_data> = 'Nouvelle valeur'.
ENDIF.
" Mauvais (risque d'erreur runtime)
<lfs_data> = 'Nouvelle valeur'. " Crash si non assigné !
Erreurs Courantes à Éviter #
| Erreur | Problème | Solution |
|---|---|---|
'x' pour XFELD |
'x' minuscule n’est pas reconnu |
Utiliser 'X' majuscule |
| Field-Symbol non assigné | Erreur CX_SY_REF_IS_INITIAL |
Toujours vérifier avec IS ASSIGNED |
| Apostrophe dans chaîne | 'D'acunto' cause erreur syntaxe |
Doubler l’apostrophe : 'D''acunto' |
| Float pour montants | Erreurs d’arrondi | Utiliser TYPE p DECIMALS 2 |
| Date mauvais format | Date ‘01/01/2024’ invalide | Format AAAAMMJJ : ‘20240101’ |
Variables Système Utiles #
| Variable | Type | Description | Exemple |
|---|---|---|---|
sy-datum |
D | Date du jour | lv_date = sy-datum |
sy-uzeit |
T | Heure actuelle | lv_time = sy-uzeit |
sy-uname |
CHAR12 | Nom utilisateur | lv_user = sy-uname |
sy-langu |
LANG | Langue connexion | lv_lang = sy-langu |
sy-mandt |
CLNT | Mandant | lv_client = sy-mandt |
sy-subrc |
I | Code retour | Après SELECT, CALL, etc. |
Programme Principal #
REPORT ZADA_PROG_UNIT_03.
INCLUDE ZADA_PROG_UNIT_03_TOP. " Variable globale gv_birthdate
INCLUDE ZADA_PROG_UNIT_03_SCR. " Écran (vide)
INCLUDE ZADA_PROG_UNIT_03_F01. " 24 FORM routines
START-OF-SELECTION.
" VARIABLES
PERFORM variable_declaration_simple.
PERFORM variable_declaration_succes.
PERFORM variable_convention_nommage.
PERFORM variable_type_vs_like.
" CONSTANTES
PERFORM constant_declaration_simple.
PERFORM constant_declaration_succes.
" EXERCICES
PERFORM exercice_carte_identite.
PERFORM exercice_fieldsymbols.
" TYPES
PERFORM type_c.
PERFORM type_numeric.
PERFORM type_date.
PERFORM type_heure.
PERFORM type_float.
PERFORM type_decfloat.
PERFORM type_packed_decimal.
PERFORM type_boolean.
PERFORM type_xfeld.
" FIELD-SYMBOLS
PERFORM type_fieldsymbols.
PERFORM fieldsymbols_succes.
Résumé des Concepts Clés #
Variables #
- Déclaration avec
DATA - Utiliser les préfixes (
lv_,gv_) - Choisir le type approprié
Constantes #
- Déclaration avec
CONSTANTS VALUEobligatoire- Pour valeurs immuables
Types #
- Texte :
stringouc - Nombres :
i,p,f,decfloat - Date/Heure :
d,t - Logique :
boolean,xfeld
Field-Symbols #
- Pointeurs ABAP
ASSIGN...TOpour lier- Vérifier avec
IS ASSIGNED - Modifie l’original
Conclusion #
Ce programme constitue une référence complète sur les fondamentaux d’ABAP :
- Tous les types de données courants
- Conventions de nommage professionnelles
- Field-Symbols et pointeurs
- Exercices pratiques
- Bonnes pratiques et erreurs à éviter
Il sert de guide de référence pour tout développeur ABAP débutant ou intermédiaire souhaitant maîtriser les bases de la déclaration et manipulation de données en ABAP.