Instruction ABAP APPEND expliquee : Ajouter des lignes aux tables internes

Catégorie
ABAP-Statements
Publié
Auteur
Johannes

L’instruction APPEND est utilisee en ABAP pour ajouter une ou plusieurs nouvelles lignes toujours a la fin physique d’une table interne. Elle augmente ainsi le nombre de lignes dans la table.

Distinction importante avec INSERT

  • APPEND : Ajoute toujours a la fin. Principalement concu pour les tables standard.
  • INSERT : Peut inserer a une position d’index specifique (pour les tables standard avec INDEX) ou insere selon la cle triee ou hashee (pour les tables triees/hashees avec INTO TABLE).

Syntaxe

Il existe trois variantes principales :

  1. Ajouter une ligne unique a partir d’une zone de travail (<wa>) :
    APPEND <wa> TO <table_interne> [ASSIGNING <symbole_champ> | REFERENCE INTO <reference_donnees>].
    " L'ajout [SORTED BY <composant>] est obsolete et ne doit pas etre utilise.
  2. Ajouter une ligne initiale unique :
    APPEND INITIAL LINE TO <table_interne> [ASSIGNING <symbole_champ> | REFERENCE INTO <reference_donnees>].
  3. Ajouter plusieurs lignes a partir d’une autre table (<table_source>) :
    APPEND LINES OF <table_source> [FROM <index1>] [TO <index2>] TO <table_interne>
    [KEEPING DUPLICATES | DELETING DUPLICATES]. " Pertinent pour Sorted/Hashed

Composants

  • <wa> : Une zone de travail (structure) qui doit etre compatible avec le type de ligne de <table_interne>. Son contenu est copie dans la nouvelle ligne.
  • INITIAL LINE : Ajoute une ligne dans laquelle tous les composants ont leur valeur initiale specifique au type (par ex. 0 pour les nombres, espace pour le type C, chaine vide pour le type STRING).
  • LINES OF <table_source> : Copie les lignes de la <table_source> et les ajoute a la fin de <table_interne>. Optionnellement, avec FROM <index1> et TO <index2>, la plage des lignes a copier dans la table source peut etre limitee.
  • TO <table_interne> : La table cible a laquelle on ajoute.
  • ASSIGNING <symbole_champ> / REFERENCE INTO <reference_donnees> : (Uniquement avec APPEND <wa> / INITIAL LINE) Tres utile ! Definit un symbole de champ ou une reference de donnees qui pointe directement sur la ligne qui vient d’etre ajoutee. Cela evite un READ TABLE ulterieur si vous voulez modifier directement la nouvelle ligne.
  • KEEPING DUPLICATES / DELETING DUPLICATES : (Uniquement avec APPEND LINES OF) Ces ajouts influencent le comportement lorsque vous essayez d’ajouter des lignes a une table triee ou hashee (ce qui est generalement problematique, voir ci-dessous). Ils se referent a l’unicite de la cle de table. Pour les tables standard, ils n’ont aucun effet sur les doublons dans le contenu.

Fonctionnement / Comportement selon le type de table

Le comportement et l’admissibilite de APPEND dependent fortement du type de table interne :

1. Tables standard (STANDARD TABLE)

  • APPEND ajoute la ou les lignes toujours a la fin physique de la table. L’ordre des lignes deja existantes n’est pas modifie.
  • C’est le cas d’utilisation typique et recommande pour APPEND.
  • Le champ systeme sy-tabix contient apres l’operation l’index de la (derniere) ligne ajoutee. sy-subrc est generalement 0.

2. Tables triees (SORTED TABLE)

  • APPEND <wa> ou APPEND INITIAL LINE est ici fondamentalement interdit, car l’ajout a la fin violerait l’ordre de tri garanti de la table. Une tentative conduit a une erreur d’execution (dump).
  • Exception : APPEND LINES OF peut fonctionner dans certaines circonstances, si les lignes a ajouter ne violent pas par hasard l’ordre de tri ou si les doublons sont traites selon la cle (avec KEEPING/DELETING DUPLICATES). Cependant, ce n’est pas la bonne methode pour ajouter des donnees aux tables triees.
  • Instruction correcte pour les tables triees : INSERT <wa> INTO TABLE <table>.

3. Tables hashees (HASHED TABLE)

  • APPEND <wa> ou APPEND INITIAL LINE est ici strictement interdit. La position d’une ligne dans une table hashee est determinee par la valeur de hachage de la cle unique, pas par l’ordre d’insertion. Une tentative d’APPEND conduit a une erreur d’execution.
  • Exception : APPEND LINES OF peut theoriquement etre utilise, mais conduit a une erreur d’execution a chaque violation de la cle unique (sauf si la source contenait deja des doublons et que DELETING DUPLICATES a ete utilise, ce qui nettoie principalement la source).
  • Instruction correcte pour les tables hashees : INSERT <wa> INTO TABLE <table>.

Champs systeme

  • sy-subrc : Pour APPEND sur les tables standard, generalement 0. Pour APPEND LINES OF sur Sorted/Hashed, sy-subrc peut etre defini sur 4 si des doublons ont ete traites selon les ajouts, mais la plupart du temps les violations de cle entrainent ici des erreurs d’execution.
  • sy-tabix : Apres APPEND sur une table standard, sy-tabix contient l’index de ligne de la (derniere) ligne nouvellement ajoutee.

Exemples (Focus sur les tables standard)

TYPES: BEGIN OF ty_component,
comp_id TYPE i,
comp_text TYPE string,
END OF ty_component.
DATA: gt_components TYPE STANDARD TABLE OF ty_component WITH EMPTY KEY,
gs_component TYPE ty_component.
FIELD-SYMBOLS: <fs_component> LIKE LINE OF gt_components.
" 1. Ajouter une zone de travail
gs_component = VALUE #( comp_id = 10 comp_text = 'Component A' ).
APPEND gs_component TO gt_components.
gs_component = VALUE #( comp_id = 20 comp_text = 'Component B' ).
APPEND gs_component TO gt_components.
WRITE: / 'Apres APPEND <wa>: ', lines( gt_components ), 'lignes.'.
" 2. Ajouter une ligne initiale et la modifier directement avec ASSIGNING
APPEND INITIAL LINE TO gt_components ASSIGNING <fs_component>.
IF <fs_component> IS ASSIGNED.
<fs_component>-comp_id = 30.
<fs_component>-comp_text = 'Component C (initial)'.
WRITE: / 'Derniere ligne (ASSIGNING):', <fs_component>-comp_text.
ELSE.
WRITE: / 'Erreur lors de APPEND ASSIGNING'.
ENDIF.
" 3. Ajouter des lignes d'une autre table
DATA gt_source LIKE gt_components.
APPEND VALUE #( comp_id = 40 comp_text = 'Component D' ) TO gt_source.
APPEND VALUE #( comp_id = 50 comp_text = 'Component E' ) TO gt_source.
APPEND LINES OF gt_source TO gt_components.
WRITE: / 'Apres APPEND LINES OF: ', lines( gt_components ), 'lignes.'.
" Affichage de la table complete
cl_demo_output=>display( gt_components ).

Remarques importantes / Bonnes pratiques

  • Utilisez APPEND pour ajouter rapidement et simplement des lignes a la fin des tables standard.
  • Pour les tables triees et hashees, utilisez INSERT ... INTO TABLE ... pour garantir la coherence de la table et eviter les erreurs d’execution.
  • L’ajout ASSIGNING <symbole_champ> (ou REFERENCE INTO) avec APPEND <wa> / INITIAL LINE est tres performant si vous souhaitez modifier la ligne nouvellement ajoutee directement ensuite.
  • Pour parcourir toutes les lignes d’une table, utilisez LOOP AT.
  • Pour trier une table apres l’avoir remplie, utilisez SORT.