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 avecINDEX) ou insere selon la cle triee ou hashee (pour les tables triees/hashees avecINTO TABLE).
Syntaxe
Il existe trois variantes principales :
- 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. - Ajouter une ligne initiale unique :
APPEND INITIAL LINE TO <table_interne> [ASSIGNING <symbole_champ> | REFERENCE INTO <reference_donnees>].
- 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, avecFROM <index1>etTO <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 avecAPPEND <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 unREAD TABLEulterieur si vous voulez modifier directement la nouvelle ligne.KEEPING DUPLICATES/DELETING DUPLICATES: (Uniquement avecAPPEND 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)
APPENDajoute 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-tabixcontient apres l’operation l’index de la (derniere) ligne ajoutee.sy-subrcest generalement0.
2. Tables triees (SORTED TABLE)
APPEND <wa>ouAPPEND INITIAL LINEest 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 OFpeut 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 (avecKEEPING/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>ouAPPEND INITIAL LINEest 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’APPENDconduit a une erreur d’execution.- Exception :
APPEND LINES OFpeut 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 queDELETING DUPLICATESa ete utilise, ce qui nettoie principalement la source). - Instruction correcte pour les tables hashees :
INSERT <wa> INTO TABLE <table>.
Champs systeme
sy-subrc: PourAPPENDsur les tables standard, generalement0. PourAPPEND LINES OFsur Sorted/Hashed,sy-subrcpeut etre defini sur4si 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: ApresAPPENDsur une table standard,sy-tabixcontient 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 travailgs_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 ASSIGNINGAPPEND 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 tableDATA 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 completecl_demo_output=>display( gt_components ).Remarques importantes / Bonnes pratiques
- Utilisez
APPENDpour 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>(ouREFERENCE INTO) avecAPPEND <wa>/INITIAL LINEest 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.