Les types de données
Le système de types ABAP est un élément fondamental du langage déterminant comment les données sont entreposées, manipulées et converties. Une bonne compréhension des types de données est essentielle pour développer des applications ABAP efficaces et éviter les erreurs de conversion ou de perte de précision.
ABAP distingue deux grandes catégories de types de données :
- Les types élémentaires (scalaires) : types de base pour entreposer des valeurs simples comme des nombres, des chaînes de caractères, des dates ou des heures.
- Les types complexes : structures et tables internes permettant de regrouper plusieurs valeurs sous un même identificateur.
Le typage en ABAP est statique : le type d'une variable est défini à la compilation et ne peut pas changer pendant l'exécution. Cependant, ABAP effectue automatiquement des conversions implicites entre types compatibles, ce qui peut parfois entraîner des résultats inattendus si le programmeur n'est pas vigilant.
Vue d'ensemble des types élémentaires
Voici un tableau récapitulatif des principaux types élémentaires ABAP :
| Type | Description | Taille | Valeur initiale |
|---|---|---|---|
| I | Entier 32 bits signe | 4 octets | 0 |
| INT8 | Entier 64 bits signe | 8 octets | 0 |
| F | Nombre a virgule flottante | 8 octets | 0.0 |
| DECFLOAT16 | Décimal flottant 16 chiffres | 8 octets | 0.0 |
| DECFLOAT34 | Décimal flottant 34 chiffres | 16 octets | 0.0 |
| C | Chaîne de caractères fixe | n octets | espaces |
| N | Chaîne numérique | n octets | '0...0' |
| D | Date (AAAAMMJJ) | 8 octets | '00000000' |
| T | Heure (HHMMSS) | 6 octets | '000000' |
| P | Décimal compacte (BCD) | 1-16 octets | 0 |
| STRING | Chaîne longueur variable | variable | '' (vide) |
| XSTRING | Chaîne binaire variable | variable | '' (vide) |
| X | Chaîne hexadécimale fixe | n octets | '00...00' |
Chaque type possède des caractéristiques spécifiques le rendant adapté à certains usages. Le choix du type approprié est crucial pour la performance et l'intégrité des données dans les applications SAP.
Type I - Entiers
Le type I représente un entier signe sur 32 bits. C'est le type numérique le plus couramment utilise pour les compteurs, les indices de boucles et les calculs avec des nombres entiers.
Caractéristiques :
- Entreposage : 4 octets (32 bits)
- Valeur minimale : -2 147 483 648 (-2^31)
- Valeur maximale : 2 147 483 647 (2^31 - 1)
- Valeur initiale : 0
- Précision : exacte (pas d'erreur d'arrondi)
Le type I est adapte pour :
- Les compteurs et indices de boucles
- Les calculs arithmétiques entiers
- L'entreposage de quantités discrètes
- Les références a des numéros de ligne ou d'enregistrement
Exemples de déclarations :
- DATA gv_compteur TYPE I.
- DATA gv_index TYPE I VALUE 1.
- DATA gv_quantite TYPE I VALUE 100.
Attention : les dépassements de capacité (overflow) ne sont pas détectés automatiquement en ABAP standard. Un calcul dépassant les limites du type I peut produire des résultats incorrects sans lever d'exception.
Depuis ABAP 7.40, le type INT8 (entier 64 bits) est disponible pour les besoins de très grands nombres entiers, avec un intervalle allant de -9 223 372 036 854 775 808 a 9 223 372 036 854 775 807.
Type F - Nombres a virgule flottante
Le type F représente un nombre à virgule flottante en double précision selon la norme IEEE 754. Il est utilise pour les calculs scientifiques ou les situations nécessitant une grande intervalle de valeurs.
Caractéristiques :
- Entreposage : 8 octets (64 bits)
- Précision : environ 15-16 chiffres significatifs
- Plage : de 2.2E-308 a 1.8E+308 (en valeur absolue)
- Valeur initiale : 0.0
- Notation : décimale ou scientifique (1.5E10)
Le type F est adapte pour :
- Les calculs scientifiques
- Les applications nécessitant une très grande plage de valeurs
- Les calculs ou une précision approximative est acceptable
Exemples de déclarations :
- DATA gv_pi TYPE F VALUE '3.14159265358979'.
- DATA gv_vitesse_lumiere TYPE F VALUE '2.998E8'.
- DATA gv_masse TYPE F.
Attention importante : le type F utilise une représentation binaire ne pouvant pas représenter exactement certains nombres décimaux. Par exemple, 0.1 en base 10 ne peut pas être représenté exactement en virgule flottante binaire. Pour les calculs financiers ou les montants monétaires, il faut absolument utiliser le type P (décimal compacte) garantissant une précision décimale exacte.
- " Exemple de perte de precision avec F
- DATA: gv_f TYPE F,
- gv_p TYPE P DECIMALS 2.
- gv_f = '0.1'.
- gv_p = '0.1'.
- " gv_f peut contenir 0.09999999999... au lieu de 0.1 exactement
- " gv_p contient exactement 0.10
Types DECFLOAT16 et DECFLOAT34 - Décimaux flottants
Introduits dans les versions récentes d'ABAP, les types DECFLOAT16 et DECFLOAT34 offrent une représentation décimale flottante selon la norme IEEE 754-2008. Contrairement au type F (binaire flottant), ces types représentent exactement les nombres décimaux.
Caractéristiques de DECFLOAT16 :
- Entreposage : 8 octets
- Précision : 16 chiffres décimaux significatifs
- Intervalle : de 10^-383 a 10^384
Caractéristiques de DECFLOAT34 :
- Entreposage : 16 octets
- Précision : 34 chiffres décimaux significatifs
- Intervalle : de 10^-6143 a 10^6144
Ces types sont particulièrement adaptés pour :
- Les calculs financiers de haute précision
- Les applications scientifiques nécessitant une précision décimale
- L'entreposage de montants monétaires avec une grande précision
Exemple :
- DATA gv_montant_precise TYPE DECFLOAT34.
- gv_montant_precise = '123456789012345678901234.5678901234'.
Type C - Chaînes de caractères à longueur fixe
Le type C représente une chaîne de caractères à longueur fixe. C'est l'un des types les plus utilises en ABAP, notamment pour les champs de base de données et les zones d'écran.
Caractéristiques :
- Longueur : de 1 a 262 143 caractères
- Entreposage : 1 octet par caractère (en code page simple)
- Valeur initiale : espaces (blancs)
- Remplissage : espaces a droite si la valeur est plus courte
Le type C est adapte pour :
- Les champs de base de données
- Les noms, descriptions et libelles
- Les codes et identifiants de longueur fixe
- L'interaction avec les écrans dynpro
Syntaxes de déclaration :
- " Syntaxe standard avec LENGTH
- DATA gv_nom TYPE C LENGTH 30.
- DATA gv_code TYPE C LENGTH 10.
-
- " Syntaxe courte avec parentheses
- DATA gv_nom(30) TYPE C.
- DATA gv_code(10). " TYPE C est implicite
-
- " Avec valeur initiale
- DATA gv_pays TYPE C LENGTH 3 VALUE 'FRA'.
Comportement important : les comparaisons de chaînes de type C ignorent les espaces de fin (trailing spaces). Ainsi, 'ABC' et 'ABC ' sont considérés comme égaux lors d'une comparaison.
Le type C ne gère pas les caractères Unicode multi-octets de manière native. Pour les applications Unicode, le nombre de caractères peut différer du nombre d'octets utilises.
Type N - Chaînes numériques
Le type N représente une chaîne de caractères contenant uniquement des chiffres (0-9). Il est utilise pour les codes numériques devant conserver les zéros en tête, comme les numéros de document, les codes postaux ou les numéros de compte.
Caractéristiques :
- Longueur : de 1 a 262 143 caractères
- Caractères autorisés : uniquement 0-9
- Valeur initiale : '0...0' (zeros)
- Remplissage : zéros a gauche (padding)
Le type N est adapte pour :
- Les numéros de document SAP (VBELN, EBELN,...)
- Les codes postaux
- Les numéros de compte bancaire
- Tout code numérique devant conserver ses zéros
Exemples de déclarations :
- DATA gv_numero_doc TYPE N LENGTH 10.
- DATA gv_code_postal TYPE N LENGTH 5 VALUE '75001'.
- DATA gv_matricule(8) TYPE N.
Comportement spécifique : lors d'une affectation numérique a un champ de type N, la valeur est automatiquement convertie en chaîne et complétée par des zéros a gauche.
- DATA gv_doc TYPE N LENGTH 10.
- gv_doc = 123.
- " gv_doc contient '0000000123'
Le type N peut être utilise dans des opérations arithmétiques, mais il est converti implicitement en entier pour le calcul, puis le résultat est reconverti en chaîne numérique.
Type D - Dates
Le type D représente une date au format AAAAMMJJ (année sur 4 chiffres, mois sur 2 chiffres, jour sur 2 chiffres). C'est le type standard pour manipuler les dates dans les applications SAP.
Caractéristiques :
- Longueur fixe : 8 caractères
- Format : AAAAMMJJ (ex: '20240315' pour le 15 mars 2024)
- Valeur initiale : '00000000'
- Entreposage : 8 octets
Le type D est adapte pour :
- Les dates de documents (date de facture, de livraison,...)
- Les dates d'échéance et de validité
- Les calculs de durée en jours
- La comparaison de dates
Exemples de déclarations :
- DATA gv_date_jour TYPE D.
- DATA gv_date_debut TYPE D VALUE '20240101'.
- DATA gv_date_fin TYPE D.
-
- " Initialisation avec la date systeme
- gv_date_jour = sy-datum.
Calculs sur les dates : ABAP permet d'effectuer des opérations arithmétiques sur les dates. L'addition ou la soustraction de nombres entiers ajoute ou retire des jours.
- DATA: gv_date TYPE D,
- gv_jours_delta TYPE I.
- gv_date = sy-datum.
- gv_date = gv_date + 30. " Date dans 30 jours
- gv_jours_delta = gv_date_fin - gv_date_debut. " Nombre de jours
La variable système sy-datum contient toujours la date du jour au format D. D'autres variables système liées aux dates incluent :
- sy-datlo : date locale du système
- sy-datfm : format d'affichage des dates configure pour l'utilisateur
Type T - Heures
Le type T représente une heure au format HHMMSS (heures sur 2 chiffres, minutes sur 2 chiffres, secondes sur 2 chiffres). Il complément le type D pour la gestion complète des horodatages.
Caractéristiques :
- Longueur fixe : 6 caractères
- Format : HHMMSS (ex: '143055' pour 14:30:55)
- Plage : de '000000' a '235959'
- Valeur initiale : '000000'
- Entreposage : 6 octets
Le type T est adapte pour :
- Les heures de début et fin de processus
- L'horodatage des documents
- Le calcul de durées en secondes
- La planification d'événements
Exemples de déclarations :
- DATA gv_heure TYPE T.
- DATA gv_heure_debut TYPE T VALUE '080000'.
- DATA gv_heure_fin TYPE T.
-
- " Initialisation avec l'heure systeme
- gv_heure = sy-uzeit.
Calculs sur les heures : comme pour les dates, on peut effectuer des opérations arithmétiques sur les heures. L'addition ou soustraction de nombres entiers ajoute ou retire des secondes.
- DATA: gv_heure TYPE T,
- gv_secondes TYPE I.
- gv_heure = sy-uzeit.
- gv_heure = gv_heure + 3600. " Heure + 1 heure (3600 secondes)
- gv_secondes = gv_heure_fin - gv_heure_debut. " Duree en secondes
La variable système sy-uzeit contient toujours l'heure courante au format T. La variable sy-timlo contient l'heure locale du système.
Type P - Nombres décimaux compactes (BCD)
Le type P représente un nombre décimal a précision fixe en format BCD (Binary Coded Decimal). C'est le type recommande pour tous les calculs financiers et monétaires car il garantit une précision décimale exacte, sans erreur d'arrondi.
Caractéristiques :
- Longueur : de 1 a 16 octets (1 a 31 chiffres)
- Décimales : de 0 a 14
- Valeur initiale : 0
- Stockage : chaque octet contient 2 chiffres décimaux
Le type P est adapte pour :
- Les montants financiers et monétaires
- Les prix et quantités
- Les pourcentages et taux
- Tout calcul nécessitant une précision décimale exacte
Syntaxe de déclaration :
| DATA variable TYPE P [LENGTH longueur] DECIMALS nb_decimales. |
Exemples :
- DATA gv_montant TYPE P DECIMALS 2.
- DATA gv_prix TYPE P LENGTH 8 DECIMALS 2.
- DATA gv_quantite TYPE P DECIMALS 3 VALUE '123.456'.
- DATA gv_pourcentage TYPE P LENGTH 4 DECIMALS 2.
Relation entre longueur et nombre de chiffres :
- Longueur 1 octet : 1 chiffre + signe
- Longueur 2 octets : 3 chiffres
- Longueur 4 octets : 7 chiffres
- Longueur 8 octets : 15 chiffres
- Longueur 16 octets : 31 chiffres
La précision décimale est garantie dans les limites de la longueur déclarée. Les calculs internes utilisent une précision intermédiaire plus élevée pour éviter les pertes de précision.
- " Comparaison F vs P pour calcul financier
- DATA: gv_f TYPE F,
- gv_p TYPE P DECIMALS 2.
- gv_f = '0.1' * 3.
- gv_p = '0.1' * 3.
- " gv_p = 0.30 exactement
- " gv_f peut contenir 0.30000000000000004...
Types STRING et XSTRING - Chaînes a longueur variable
Les types STRING et XSTRING représentent des chaînes de caractères et des données binaires a longueur variable. Contrairement aux types C et X a longueur fixe, ces types ajustent dynamiquement leur taille en fonction du contenu.
Type STRING :
- Longueur : variable, jusqu'à 2 Go théorique
- Contenu : caractères texte
- Valeur initiale : chaîne vide ''
- Entreposage : référence + données
Le type STRING est adapte pour :
- Les textes de longueur variable ou inconnue
- Le contenu de fichiers texte
- Les messages et journaux de bord
- La manipulation de texte dynamique
Type XSTRING :
- Longueur : variable, jusqu'à 2 Go théorique
- Contenu : données binaires (octets)
- Valeur initiale : chaîne vide ''
- Entreposage : référence + données
Le type XSTRING est adapte pour :
- Les fichiers binaires (images, PDF, etc.)
- Les données cryptées
- Les flux de communication
- Tout contenu non-textuel
Exemples de déclarations :
- DATA gv_texte TYPE STRING.
- DATA gv_message TYPE STRING VALUE 'Bonjour le monde'.
- DATA gv_fichier TYPE XSTRING.
Manipulation de STRING :
- DATA: gv_str1 TYPE STRING VALUE 'Hello',
- gv_str2 TYPE STRING VALUE 'World',
- gv_result TYPE STRING.
-
- " Concatenation avec &&
- gv_result = gv_str1 && ' ' && gv_str2. " 'Hello World'
-
- " Longueur avec strlen()
- DATA lv_len TYPE I.
- lv_len = strlen( gv_result ). " 11
-
- " Recherche avec find()
- DATA lv_pos TYPE I.
- lv_pos = find( val = gv_result sub = 'World' ). " 6
Contrairement au type C, le type STRING ne contient pas d'espaces de remplissage (padding). La longueur correspond exactement au contenu réel de la chaîne.
Type X - Chaînes hexadécimales a longueur fixe
Le type X représente une chaîne de données binaires (hexadécimales) à longueur fixe. Chaque octet est représenté par deux caractères hexadécimaux (0-9, A-F).
Caractéristiques :
- Longueur : de 1 a 65 535 octets
- Contenu : octets bruts
- Valeur initiale : '00...00' (zéros)
- Notation : hexadécimale ('FF', '0A',...)
Le type X est adapte pour :
- Les tampons de données fixes
- Les masques binaires et drapeaux
- L'interaction avec des API bas niveau
- L'entreposage de données binaires de taille connue
Exemples :
- DATA gv_octet TYPE X LENGTH 1.
- DATA gv_buffer TYPE X LENGTH 256.
- DATA gv_header TYPE X LENGTH 4 VALUE 'DEADBEEF'.
Les opérations bit-a-bit peuvent être effectuées sur les types X :
- DATA: gv_a TYPE X LENGTH 1 VALUE 'F0',
- gv_b TYPE X LENGTH 1 VALUE '0F',
- gv_result TYPE X LENGTH 1.
-
- " Les operations bit-a-bit necessitent des fonctions specifiques
- " ou des traitements octet par octet
Conversions entre types
ABAP effectue automatiquement des conversions implicites entre types compatibles lors des affectations. Cependant, certaines conversions peuvent entraîner des pertes de données ou de précision.
Règles de conversion principales :
| De | Vers | Comportement |
|---|---|---|
| I | C/N | Conversion en chaîne numérique |
| C/N | I | Extraction de la valeur numérique |
| I | P | Conversion exacte (si capacité suffisante) |
| P | I | Troncature des décimales |
| F | P | Arrondi aux décimales de P |
| P | F | Conversion (possible perte de précision) |
| D | C | Copie directe de la représentation AAAAMMJJ |
| C | D | Interprétation comme date (doit être valide) |
| T | C | Copie directe de la représentation HHMMSS |
| C | T | Interprétation comme heure (doit être valide) |
Exemples de conversions :
- DATA: gv_i TYPE I,
- gv_c TYPE C LENGTH 10,
- gv_n TYPE N LENGTH 10,
- gv_p TYPE P DECIMALS 2,
- gv_f TYPE F.
-
- " Entier vers chaine
- gv_i = 42.
- gv_c = gv_i. " gv_c = ' 42'
- gv_n = gv_i. " gv_n = '0000000042'
-
- " Chaine vers entier
- gv_c = '123'.
- gv_i = gv_c. " gv_i = 123
-
- " Decimal vers entier (troncature)
- gv_p = '3.75'.
- gv_i = gv_p. " gv_i = 3 (pas d'arrondi)
-
- " Flottant vers decimal (arrondi)
- gv_f = '3.456789'.
- gv_p = gv_f. " gv_p = 3.46 (arrondi a 2 decimales)
Pour les conversions explicites et un meilleur contrôle, utiliser l'opérateur CONV introduit dans ABAP 7.40 :
- DATA(lv_string) = CONV string( gv_i ).
- DATA(lv_int) = CONV i( '123' ).
Types de référence et types complexes
Au-delà des types élémentaires, ABAP supporte des types plus complexes pour structurer les données :
Types structures :
- Les structures regroupent plusieurs champs de types différents sous un même identificateur. Elles sont définies avec TYPES...BEGIN OF ou DATA...BEGIN OF.
Tables internes :
- Les tables internes sont des tableaux dynamiques pouvant contenir plusieurs lignes du même type. Elles sont essentielles pour le traitement de collections de données en ABAP.
Types référence :
Les types référence pointent vers des objets ou des données entreposés ailleurs en mémoire. Ils incluent :
- REF TO data : référence a des données
- REF TO class : référence a des objets
Bonnes pratiques pour le choix des types
Le choix du type de données approprié est crucial pour la performance, la précision et la maintenabilité du code ABAP :
Pour les nombres entiers :
- Utiliser I pour les compteurs, indices et petits nombres
- Utiliser INT8 pour les très grands nombres entiers
Pour les nombres décimaux :
- Toujours utiliser P pour les montants financiers
- Utiliser F uniquement pour les calculs scientifiques
- Considérer DECFLOAT pour une haute précision décimale
Pour les chaînes de caractères :
- Utiliser C pour les champs de longueur fixe connue
- Utiliser STRING pour les textes de longueur variable
- Utiliser N pour les codes numériques avec zéros en tête
Pour les dates et heures :
- Utiliser D et T pour les dates et heures séparées
- Combiner D et T pour les horodatages complets
- Considérer les types TIMESTAMP pour les besoins de précision
Pour les données binaires :
- Utiliser X pour les tampons de taille fixe
- Utiliser XSTRING pour les données binaires de taille variable