Aller au contenu
  1. Documentation/

Structure ITAB en ABAP

··6 mins· loading · loading · · ·
ERP SAP Back-End
Adrien D'acunto
Auteur
Adrien D’acunto
Sommaire

Structure ITAB en ABAP
#

Structure
#

Objectifs
#

  • Comprendre ce qu’est une STRUCTURE et à quoi elle sert
  • Savoir déclarer une STRUCTURE avec TYPES et DATA
  • 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 STRUCTURE est un regroupement de plusieurs VARIABLES de 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 STRUCTURE comme une fiche d’identité d’une personne

  • nom
  • prénom
  • date de naissance
  • adresse

Chaque information est un champ, et l’ensemble constitue une STRUCTURE unique représentant la personne.

Les champs d’une STRUCTURE peuvent ê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_person est une fiche vide prête à être remplie avec les informations d’une personne.

Le BEGIN OF ... END OF encadre la définition des champs. Chaque champ a un nom et un TYPE.

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ême STRUCTURE.

Exercices
#

1 – Créer une structure pour un livre
#

Définir une STRUCTURE ty_livre avec les champs

  • titre (CHAR30)
  • auteur (CHAR30)
  • annee (I)
  • genre (CHAR20)

Déclarer une VARIABLE ls_livre et 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 STRUCTURE regroupe 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 MOVE et MOVE-CORRESPONDING
  • Utiliser MOVE-CORRESPONDING avec des structures dynamiques

Définition
#

MOVE-CORRESPONDING struc_source TO struc_target.

L’instruction MOVE-CORRESPONDING permet 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-CORRESPONDING ne 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.
  • name et country sont copiés car ils existent dans les deux structures.
  • zipcode reste inchangé, car il n’existe pas dans la source.
  • age n’est pas transféré car il n’existe pas dans la destination.

Le MOVE-CORRESPONDING n’é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.
  • MOVE copie les valeurs champ par champ dans l’ordre de déclaration → erreur si structures incompatibles.
  • MOVE-CORRESPONDING copie par nom → plus sûr et plus souple.

Le MOVE peut 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 name et country de ls_person_src vers ls_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 zipcode dans 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-CORRESPONDING entre 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.

Articles connexes

Les conditions en ABAP
··19 mins· loading · loading
SAP ERP Back-End
Introduction ABAP
·16 mins· loading · loading
SAP ERP Back-End
Structure d'un programme ABAP
··14 mins· loading · loading
SAP ERP Back-End
Les instructions en ABAP
··24 mins· loading · loading
SAP ERP Back-End
Variables & Déclarations en ABAP
··11 mins· loading · loading
SAP ERP Back-End
Boucles en ABAP
··11 mins· loading · loading
SAP ERP Back-End