Structure ITAB en ABAP #
Structure #
Objectifs #
- Comprendre ce qu’est une
STRUCTUREet à quoi elle sert - Savoir déclarer une
STRUCTUREavecTYPESetDATA - Savoir remplir les champs d’une
STRUCTURE - Accéder aux valeurs des champs pour lecture ou affichage
- Appliquer des structures pour organiser des données hétérogènes
Définition #
Une
STRUCTUREest un regroupement de plusieursVARIABLESde types différents sous un même nom.
Elle peut être vue comme une ligne de table où chaque champ correspond à une colonne.
Cela permet de manipuler des ensembles de données logiquement liés, sans avoir à gérer chaque variable individuellement.
Pensez à une
STRUCTUREcomme une fiche d’identité d’une personne
- nom
- prénom
- date de naissance
- adresse
Chaque information est un champ, et l’ensemble constitue une
STRUCTUREunique représentant la personne.
Les champs d’une
STRUCTUREpeuvent être de types différents : caractères, entiers, dates, etc.
Déclaration #
Pour créer une STRUCTURE, on utilise TYPES :
TYPES: BEGIN OF ty_person,
nom TYPE char20,
prenom TYPE char20,
age TYPE i,
ville TYPE char20,
END OF ty_person.
Puis on déclare une variable de structure avec DATA :
DATA: ls_person TYPE ty_person.
Ici,
ls_personest une fiche vide prête à être remplie avec les informations d’une personne.
Le
BEGIN OF ... END OFencadre la définition des champs. Chaque champ a un nom et unTYPE.
Alimentation des champs #
Chaque champ de la STRUCTURE est accessible avec le séparateur - :
ls_person-nom = 'Dupont'.
ls_person-prenom = 'Jean'.
ls_person-age = 35.
ls_person-ville = 'Paris'.
Pour afficher les valeurs :
WRITE: / ls_person-nom, ls_person-prenom, ls_person-age, ls_person-ville.
Résultat : Dupont Jean 35 Paris
On remplit la fiche d’identité avec les informations correspondantes.
Chaque champ est indépendant mais appartient à la mêmeSTRUCTURE.
Exercices #
1 – Créer une structure pour un livre #
Définir une
STRUCTURE ty_livreavec les champs
- titre (CHAR30)
- auteur (CHAR30)
- annee (I)
- genre (CHAR20)
Déclarer une
VARIABLE ls_livreet remplir les champs avec vos informations.
SOLUTION
TYPES: BEGIN OF ty_livre,
titre TYPE char30,
auteur TYPE char30,
annee TYPE i,
genre TYPE char20,
END OF ty_livre.
DATA: ls_livre TYPE ty_livre.
ls_livre-titre = '1984'.
ls_livre-auteur = 'George Orwell'.
ls_livre-annee = 1949.
ls_livre-genre = 'Dystopie'.
WRITE: / ls_livre-titre, ls_livre-auteur, ls_livre-annee, ls_livre-genre.
2 – Accéder à un champ #
Afficher uniquement l’auteur du livre précédemment déclaré.
SOLUTION
WRITE: / ls_livre-auteur.
Résultat : George Orwell
3 – Modifier un champ #
Modifier l’année de publication à 1950 et afficher la nouvelle valeur.
SOLUTION
ls_livre-annee = 1950.
WRITE: / ls_livre-annee.
Résultat : 1950
Résumé #
- Une
STRUCTUREregroupe plusieurs champs hétérogènes sous un même nom.- Chaque champ est accessible avec
structure-champ.- Permet d’organiser les données de manière logique et claire.
[!TIP] fiche d’identité pour une structure, carnet d’adresses pour une table de structures.
[!TIP] pour manipuler des données liées, éviter de déclarer des variables individuelles pour chaque information.
Move corresponding (structures) #
Objectifs #
- Copier uniquement les champs correspondants entre deux structures
- Comprendre comment fonctionne la correspondance par nom de champ
- Savoir ignorer les champs non communs
- Comprendre la différence entre
MOVEetMOVE-CORRESPONDING - Utiliser
MOVE-CORRESPONDINGavec des structures dynamiques
Définition #
MOVE-CORRESPONDING struc_source TO struc_target.
L’instruction
MOVE-CORRESPONDINGpermet de copier uniquement les champs de même nom entre deux structures.
- Les champs doivent avoir le même nom (la casse n’a pas d’importance).
- Les champs non présents dans la destination sont ignorés.
- Les champs non présents dans la source restent inchangés dans la destination.
Imaginez deux fiches administratives
- La première contient Nom, Prénom, Pays, Âge
- La seconde contient Nom, Pays, Code postal
→MOVE-CORRESPONDINGne copiera que Nom et Pays.
Exemple 1 – Structures avec champs communs #
TYPES: BEGIN OF ty_person_src,
name TYPE char20,
country TYPE char3,
age TYPE i,
END OF ty_person_src.
TYPES: BEGIN OF ty_person_dest,
country TYPE char3,
name TYPE char20,
zipcode TYPE char5,
END OF ty_person_dest.
DATA: ls_person_src TYPE ty_person_src,
ls_person_dest TYPE ty_person_dest.
" --- INITIALISATION DE LA STRUCTURE SOURCE ---
ls_person_src-name = 'Luis'.
ls_person_src-country = 'ES'.
ls_person_src-age = 32.
" --- INITIALISATION DE LA STRUCTURE DESTINATION ---
ls_person_dest-zipcode = '75000'.
" --- COPIE DES CHAMPS CORRESPONDANTS ---
MOVE-CORRESPONDING ls_person_src TO ls_person_dest.
" --- AFFICHAGE DU RESULTAT ---
WRITE:/ 'Nom :', ls_person_dest-name.
WRITE:/ 'Pays :', ls_person_dest-country.
WRITE:/ 'CodeZip :', ls_person_dest-zipcode.
nameetcountrysont copiés car ils existent dans les deux structures.zipcodereste inchangé, car il n’existe pas dans la source.agen’est pas transféré car il n’existe pas dans la destination.
Le
MOVE-CORRESPONDINGn’émet pas d’erreur même si les structures ne sont pas identiques – il copie uniquement ce qu’il peut.
Exemple 2 – Différence entre move et move-corresponding #
TYPES: BEGIN OF ty_employee_src,
id TYPE i,
name TYPE char20,
position TYPE char10,
END OF ty_employee_src.
TYPES: BEGIN OF ty_employee_dest,
name TYPE char20,
id TYPE i,
END OF ty_employee_dest.
DATA: ls_emp_src TYPE ty_employee_src,
ls_emp_dest TYPE ty_employee_dest.
ls_emp_src-id = 100.
ls_emp_src-name = 'Claire'.
ls_emp_src-position = 'DEV'.
" --- COPIE SIMPLE ---
MOVE ls_emp_src TO ls_emp_dest.
WRITE:/ 'MOVE simple -> Nom:', ls_emp_dest-name,
'ID:', ls_emp_dest-id.
" --- REMISE A ZERO ---
CLEAR ls_emp_dest.
" --- COPIE AVEC MOVE-CORRESPONDING ---
MOVE-CORRESPONDING ls_emp_src TO ls_emp_dest.
WRITE:/ 'MOVE-CORRESPONDING -> Nom:', ls_emp_dest-name,
'ID:', ls_emp_dest-id.
MOVEcopie les valeurs champ par champ dans l’ordre de déclaration → erreur si structures incompatibles.MOVE-CORRESPONDINGcopie par nom → plus sûr et plus souple.
Le
MOVEpeut produire des erreurs ou des incohérences si l’ordre ou le type des champs diffère.
Exemple 3 – Structures dynamiques avec field-symbols #
FIELD-SYMBOLS: <fs_src> TYPE any,
<fs_dest> TYPE any.
DATA: ls_src TYPE ty_person_src,
ls_dest TYPE ty_person_dest.
ASSIGN ls_src TO <fs_src>.
ASSIGN ls_dest TO <fs_dest>.
ls_src-name = 'Renata'.
ls_src-country = 'BR'.
ls_src-age = 29.
IF <fs_src> IS ASSIGNED AND <fs_dest> IS ASSIGNED.
MOVE-CORRESPONDING <fs_src> TO <fs_dest>.
ENDIF.
WRITE:/ 'Nom:', ls_dest-name, 'Pays:', ls_dest-country.
Utile dans les programmes génériques où les structures sont connues à l’exécution seulement.
Utile quand on manipule des structures définies dynamiquement (par exemple via un dictionnaire de données ou une sélection utilisateur).
Bonnes pratiques #
| Bonne pratique | Explication |
|---|---|
| Vérifier les noms de champs | Le transfert dépend uniquement du nom du champ |
| Préférer MOVE-CORRESPONDING pour structures proches | Permet d’éviter les erreurs de type ou d’ordre |
| Initialiser la destination avant transfert | Évite les valeurs résiduelles dans les champs non copiés |
| Ne pas abuser du MOVE simple | MOVE ne gère pas les différences de structure |
| Utiliser FIELD-SYMBOLS pour programmes génériques | Rend le code réutilisable et plus flexible |
Exercices #
1 – Copier les champs communs entre deux structures #
Copier uniquement les champs
nameetcountrydels_person_srcversls_person_dest.
SOLUTION
MOVE-CORRESPONDING ls_person_src TO ls_person_dest.
WRITE:/ 'Nom:', ls_person_dest-name, 'Pays:', ls_person_dest-country.
2 – Structures avec champ inexistant #
Ajouter un champ
zipcodedans la destination et observer que sa valeur reste inchangée.
SOLUTION
TYPES: BEGIN OF ty_person_dest_zip,
name TYPE char20,
country TYPE char3,
zipcode TYPE char5,
END OF ty_person_dest_zip.
DATA: ls_person_dest_zip TYPE ty_person_dest_zip.
MOVE-CORRESPONDING ls_person_src TO ls_person_dest_zip.
WRITE:/ 'Nom:', ls_person_dest_zip-name,
'Pays:', ls_person_dest_zip-country,
'ZipCode:', ls_person_dest_zip-zipcode.
3 – Utiliser des field-symbols dynamiques #
Copier le contenu d’une structure vers une autre via des FIELD-SYMBOLS.
SOLUTION
FIELD-SYMBOLS: <fs_src> TYPE any,
<fs_dest> TYPE any.
ASSIGN ls_person_src TO <fs_src>.
ASSIGN ls_person_dest TO <fs_dest>.
IF <fs_src> IS ASSIGNED AND <fs_dest> IS ASSIGNED.
MOVE-CORRESPONDING <fs_src> TO <fs_dest>.
ENDIF.
Résumé #
MOVE-CORRESPONDINGentre structures permet de transférer uniquement les champs portant le même nom.
- Ignore les champs non communs
- Copie sûre, sans erreur de type
- Compatible avec structures dynamiques via FIELD-SYMBOLS
- Alternative plus flexible à
MOVE[!TIP] Copier les informations communes entre deux formulaires différents, sans toucher à ce qui ne correspond pas.