L’instruction DATA est l’instruction fondamentale en ABAP pour declarer des variables. Les variables sont des objets de donnees nommes (zones memoire) dont le contenu ou la valeur peut etre modifiee pendant l’execution du programme. Elles sont au coeur du traitement des donnees en ABAP, car elles permettent de stocker, lire, calculer et manipuler des informations.
Contrairement aux constantes (declarees avec CONSTANTS), dont la valeur est fixe apres la declaration, les variables sont flexibles. Chaque variable possede un type de donnees qui determine quel type de donnees elle peut stocker (par exemple, texte, nombre, date) et combien d’espace memoire elle necessite.
Syntaxe
La declaration de variables avec DATA peut se faire de differentes manieres :
1. Declaration d’une variable unique
DATA <nom_variable> TYPE <type_donnees> [LENGTH <longueur>] [DECIMALS <decimales>] [VALUE <valeur_initiale> | IS INITIAL].<nom_variable>: le nom de la variable (doit respecter les conventions de nommage ABAP).TYPE <type_donnees>: methode preferee. Indique le type de donnees (par exemple,I,P,C,STRING,D,T,F,XSTRING, un type du dictionnaire commeMARA-MATNR, un type global de la SE11 ou un type local).LIKE <autre_objet_donnees>: ancienne methode, devrait etre remplacee parTYPEdans le nouveau code. La variable herite du type de donnees et des proprietes d’un autre objet de donnees deja declare (par exemple, une autre variable, un composant de structure, un champ du dictionnaire commeMARA-MATNR).LENGTH <longueur>: indication explicite optionnelle de la longueur pour certains types (C,N,X,P).DECIMALS <decimales>: necessaire pour le typeP(nombre compacte), pour definir le nombre de decimales.VALUE <valeur_initiale>: optionnel. Attribue une valeur initiale a la variable lors de la declaration.VALUE IS INITIAL: optionnel. Attribue explicitement la valeur initiale specifique au type. C’est le comportement par defaut siVALUEest absent.
2. Declaration de plusieurs variables (instruction chainee)
DATA: <var1> TYPE <typ1> [VALUE <valeur1>], <var2> LIKE <champ2>, <var3> TYPE <typ3>, ... .Avec un deux-points apres DATA, plusieurs variables peuvent etre declarees, separees par des virgules. L’instruction se termine par un point.
3. Declaration d’une variable structure
DATA: BEGIN OF <nom_structure>, <composant1> TYPE <typ1> [VALUE <valeur1>], <composant2> LIKE <champ2>, ... END OF <nom_structure>.Definit une variable qui contient un groupe de composants (champs).
4. Declaration d’une table interne
DATA <table> TYPE [STANDARD | SORTED | HASHED] TABLE OF <type_ligne> [WITH <definition_cle>] [INITIAL SIZE <n>].Definit une table interne, une structure de donnees dynamique pour contenir plusieurs lignes du meme type (<type_ligne>).
5. Declaration d’une variable reference
DATA <variable_ref> TYPE REF TO <typ> | <classe> | <interface> | DATA.Definit une variable qui ne contient pas directement de donnees, mais qui pointe vers d’autres objets de donnees ou instances de classes/interfaces (similaire a un pointeur).
Initialisation / Valeurs par defaut
Si aucun ajout VALUE n’est specifie lors de la declaration avec DATA, la variable est automatiquement initialisee avec la valeur initiale specifique au type :
- Types numeriques (
I,P,F) :0 - Types caractere (
C,N,STRING) : espaces (C,N) ou chaine vide (STRING) - Date/Heure (
D,T) :'00000000'ou'000000' - Types octet (
X,XSTRING) : hexadecimal 0 (X'00') ou chaine d’octets vide (XSTRING) - References (
REF TO) : referenceNULL(ne pointe vers rien)
Declaration inline (style ABAP moderne >= 7.40)
Une alternative tres courante et moderne est la declaration inline. La variable est declaree directement a l’endroit ou une valeur lui est attribuee pour la premiere fois :
DATA(<nouvelle_variable>) = <expression>.
" Exemples :DATA(lv_date) = sy-datum. " lv_date obtient automatiquement le type DDATA(lo_instance) = NEW zcl_ma_classe( ). " lo_instance obtient le type REF TO zcl_ma_classeSELECT SINGLE * FROM t001 WHERE bukrs = '0001' INTO @DATA(ls_t001). " ls_t001 obtient le type T001Le type de la variable est automatiquement deduit par le compilateur a partir du contexte (par exemple, le resultat de l’expression a droite ou l’instruction SELECT). Cela reduit l’effort de declaration et garde la declaration proche de l’utilisation.
Portee (Scope)
L’emplacement de la declaration DATA determine ou la variable est valide (visible et utilisable) :
- Global : declaration dans la partie de declaration globale d’un programme (REPORT, FUNCTION-POOL, CLASS-POOL). La variable est valide dans tout le programme/objet.
- Local : declaration dans une procedure (METHOD, FUNCTION, FORM). La variable n’est valide qu’a l’interieur de cette procedure.
Exemples
1. Variables simples
DATA counter TYPE i. " Integer, valeur initiale 0DATA message TYPE string VALUE `Bonjour`. " String avec valeur initialeDATA customer_id TYPE n LENGTH 10. " Texte numerique, 10 positions, valeur initiale '0000000000"DATA valid_until TYPE d. " Date, valeur initiale '00000000"DATA company_name TYPE name1. " Type du dictionnaire (par ex. de KNA1)DATA total_amount LIKE bseg-wrbtr. " Type du champ WRBTR de la structure BSEG (ancienne syntaxe)2. Instruction chainee
DATA: first_name TYPE string, last_name TYPE string, age TYPE i VALUE 30, city TYPE string.3. Variable structure
DATA: BEGIN OF person, name TYPE string, geb_dat TYPE d, " Date de naissance plz TYPE ad_pstcd1, " Code postal (type du dictionnaire) ort TYPE string, END OF person.
person-name = 'Dupont'.person-geb_dat = '19900101'.4. Table interne
TYPES: BEGIN OF ty_material_s, matnr TYPE matnr, maktx TYPE maktx, END OF ty_material_s.
DATA materials TYPE STANDARD TABLE OF ty_material_s WITH EMPTY KEY.DATA user_list TYPE HASHED TABLE OF syuname WITH UNIQUE KEY table_line.5. Variable reference
DATA alv_grid TYPE REF TO cl_gui_alv_grid.DATA data_ref TYPE REF TO data.6. Declaration inline en action
DATA(lv_user) = sy-uname.WRITE: / 'Utilisateur actuel:', lv_user.
LOOP AT materials INTO DATA(ls_material). " ls_material est declare inline (Type : ty_material_s) WRITE: / ls_material-matnr, ls_material-maktx.ENDLOOP.
TRY. DATA(lo_calculator) = NEW zcl_simple_calculator( ). " lo_calculator est REF TO zcl_simple_calculator DATA(lv_result) = lo_calculator->add( val1 = 5 val2 = 10 ). " lv_result est I (si la methode retourne I) WRITE: / 'Resultat:', lv_result. CATCH cx_root INTO DATA(lx_error). " lx_error est REF TO cx_root WRITE: / 'Erreur:', lx_error->get_text( ).ENDTRY.En resume : l’instruction DATA est indispensable pour travailler avec des donnees modifiables en ABAP. La declaration inline moderne DATA(...) simplifie considerablement la definition des variables et est aujourd’hui standard dans de nombreux scenarios de developpement.