L’instruction INSERT pour les tables internes insere une ou plusieurs lignes a une position specifique ou selon la cle de table. Contrairement a APPEND, qui ajoute toujours a la fin, INSERT permet un controle precis sur la position d’insertion.
Syntaxe
1. Inserer une ligne par index
INSERT <ligne> INTO <table_interne> INDEX <index>.2. Inserer une ligne selon la cle
INSERT <ligne> INTO TABLE <table_interne>.3. Inserer plusieurs lignes
INSERT LINES OF <table_source> INTO TABLE <table_cible>.INSERT LINES OF <table_source> FROM <de> TO <a> INTO <table_cible> INDEX <index>.4. Inserer une ligne initiale
INSERT INITIAL LINE INTO <table_interne> INDEX <index>.INSERT INITIAL LINE INTO TABLE <table_interne>.Champs systeme
Apres INSERT :
-
sy-subrc:0: Ligne inseree avec succes4: Ligne non inseree (ex. doublon avec UNIQUE KEY)
-
sy-tabix: Index de la ligne inseree (variante INDEX)
Exemples
1. Inserer une ligne par index
DATA: lt_names TYPE TABLE OF string.
lt_names = VALUE #( ( `Anna` ) ( `Clara` ) ( `David` ) ).
" Inserer Bernd a la position 2INSERT `Bernd` INTO lt_names INDEX 2.
" Resultat : Anna, Bernd, Clara, DavidLOOP AT lt_names INTO DATA(lv_name). WRITE: / sy-tabix, lv_name.ENDLOOP.2. Inserer au debut
DATA: lt_numbers TYPE TABLE OF i.
lt_numbers = VALUE #( ( 2 ) ( 3 ) ( 4 ) ).
" Inserer 1 au debutINSERT 1 INTO lt_numbers INDEX 1.
" Resultat : 1, 2, 3, 43. Inserer une structure
TYPES: BEGIN OF ty_customer, id TYPE i, name TYPE string, city TYPE string, END OF ty_customer.
DATA: lt_customers TYPE TABLE OF ty_customer, ls_customer TYPE ty_customer.
lt_customers = VALUE #( ( id = 1 name = 'Muller' city = 'Berlin' ) ( id = 3 name = 'Weber' city = 'Hamburg' )).
" Inserer un nouveau client a la position 2ls_customer = VALUE #( id = 2 name = 'Schmidt' city = 'Munich' ).INSERT ls_customer INTO lt_customers INDEX 2.
" Resultat : Muller (1), Schmidt (2), Weber (3)4. INSERT INTO TABLE (selon la cle)
DATA: lt_sorted TYPE SORTED TABLE OF ty_customer WITH UNIQUE KEY id.
lt_sorted = VALUE #( ( id = 1 name = 'Muller' city = 'Berlin' ) ( id = 3 name = 'Weber' city = 'Hamburg' )).
" Insere automatiquement a la bonne position (trie par cle)ls_customer = VALUE #( id = 2 name = 'Schmidt' city = 'Munich' ).INSERT ls_customer INTO TABLE lt_sorted.
IF sy-subrc = 0. WRITE: / 'Insere avec succes a la position :', sy-tabix.ENDIF.
" Resultat : Automatiquement trie entre ID 1 et 35. Empecher les doublons (UNIQUE KEY)
DATA: lt_unique TYPE SORTED TABLE OF ty_customer WITH UNIQUE KEY id.
lt_unique = VALUE #( ( id = 1 name = 'Muller' city = 'Berlin' ) ).
" Tentative d'inserer un doublonls_customer = VALUE #( id = 1 name = 'Nouveau' city = 'Cologne' ).INSERT ls_customer INTO TABLE lt_unique.
IF sy-subrc = 4. WRITE: / 'Doublon ! Ligne non inseree.'.ENDIF.6. HASHED TABLE
DATA: lt_hashed TYPE HASHED TABLE OF ty_customer WITH UNIQUE KEY id.
" Pour HASHED TABLE : Toujours INSERT INTO TABLE (pas d'INDEX !)ls_customer = VALUE #( id = 5 name = 'Bauer' city = 'Dresden' ).INSERT ls_customer INTO TABLE lt_hashed.
IF sy-subrc = 0. WRITE: / 'Insere dans la table de hachage.'.ENDIF.7. Inserer plusieurs lignes (LINES OF)
DATA: lt_source TYPE TABLE OF string, lt_target TYPE TABLE OF string.
lt_source = VALUE #( ( `Nouveau1` ) ( `Nouveau2` ) ( `Nouveau3` ) ).lt_target = VALUE #( ( `Ancien1` ) ( `Ancien2` ) ).
" Inserer toutes les lignes de source dans target (a la fin)INSERT LINES OF lt_source INTO TABLE lt_target.
" Resultat : Ancien1, Ancien2, Nouveau1, Nouveau2, Nouveau38. LINES OF avec INDEX
DATA: lt_source TYPE TABLE OF string, lt_target TYPE TABLE OF string.
lt_source = VALUE #( ( `X` ) ( `Y` ) ( `Z` ) ).lt_target = VALUE #( ( `A` ) ( `B` ) ( `C` ) ).
" Inserer les lignes a la position 2INSERT LINES OF lt_source INTO lt_target INDEX 2.
" Resultat : A, X, Y, Z, B, C9. LINES OF avec FROM…TO
DATA: lt_source TYPE TABLE OF i, lt_target TYPE TABLE OF i.
lt_source = VALUE #( ( 10 ) ( 20 ) ( 30 ) ( 40 ) ( 50 ) ).lt_target = VALUE #( ( 1 ) ( 2 ) ( 3 ) ).
" Inserer uniquement les lignes 2-4 de sourceINSERT LINES OF lt_source FROM 2 TO 4 INTO TABLE lt_target.
" Resultat : 1, 2, 3, 20, 30, 4010. Inserer une INITIAL LINE
DATA: lt_customers TYPE TABLE OF ty_customer.
lt_customers = VALUE #( ( id = 1 name = 'Muller' city = 'Berlin' )).
" Inserer une ligne vide a la position 1INSERT INITIAL LINE INTO lt_customers INDEX 1.
" Resultat : (vide), MullerLOOP AT lt_customers INTO DATA(ls_cust). WRITE: / ls_cust-id, ls_cust-name.ENDLOOP.11. INSERT avec ASSIGNING
DATA: lt_customers TYPE TABLE OF ty_customer.
" Inserer une ligne et l'editer directementINSERT VALUE #( id = 99 ) INTO TABLE lt_customers ASSIGNING FIELD-SYMBOL(<ls_new>).
IF sy-subrc = 0. <ls_new>-name = 'Nouvellement cree'. <ls_new>-city = 'Inconnu'.ENDIF.12. INSERT avec REFERENCE INTO
DATA: lt_data TYPE TABLE OF ty_customer, lr_line TYPE REF TO ty_customer.
INSERT VALUE #( id = 100 name = 'Test' ) INTO TABLE lt_data REFERENCE INTO lr_line.
IF sy-subrc = 0. lr_line->city = 'Mise a jour par reference'.ENDIF.13. INSERT dans LOOP (Attention !)
" ATTENTION : INSERT dans LOOP peut causer des boucles infinies !DATA: lt_numbers TYPE TABLE OF i.
lt_numbers = VALUE #( ( 1 ) ( 2 ) ( 3 ) ).
" FAUX - Peut causer une boucle infinie !" LOOP AT lt_numbers INTO DATA(lv_num)." IF lv_num = 2." INSERT 99 INTO lt_numbers INDEX sy-tabix." ENDIF." ENDLOOP.
" CORRECT : Collecter les modifications et inserer apresDATA: lt_to_insert TYPE TABLE OF i.LOOP AT lt_numbers INTO DATA(lv_num). IF lv_num = 2. APPEND 99 TO lt_to_insert. ENDIF.ENDLOOP.INSERT LINES OF lt_to_insert INTO lt_numbers INDEX 2.14. INSERT pour differents types de table
| Type de table | INSERT … INDEX | INSERT INTO TABLE |
|---|---|---|
| STANDARD | Oui | Oui (a la fin) |
| SORTED | Non (erreur syntaxe) | Oui (tri automatique) |
| HASHED | Non (erreur syntaxe) | Oui (par hash) |
" STANDARD TABLE : Les deux variantes possiblesDATA: lt_standard TYPE STANDARD TABLE OF ty_customer.INSERT ls_customer INTO lt_standard INDEX 1. " OKINSERT ls_customer INTO TABLE lt_standard. " OK (a la fin)
" SORTED TABLE : Uniquement INTO TABLEDATA: lt_sorted TYPE SORTED TABLE OF ty_customer WITH UNIQUE KEY id." INSERT ls INTO lt_sorted INDEX 1. " ERREUR SYNTAXE !INSERT ls_customer INTO TABLE lt_sorted. " OK (tri automatique)
" HASHED TABLE : Uniquement INTO TABLEDATA: lt_hashed TYPE HASHED TABLE OF ty_customer WITH UNIQUE KEY id." INSERT ls INTO lt_hashed INDEX 1. " ERREUR SYNTAXE !INSERT ls_customer INTO TABLE lt_hashed. " OKINSERT vs. APPEND
| Aspect | INSERT | APPEND |
|---|---|---|
| Position | Quelconque (INDEX) ou selon cle | Toujours a la fin |
| SORTED TABLE | INTO TABLE (tri automatique) | Seulement si tri preserve |
| HASHED TABLE | INTO TABLE | Non possible |
| Detection doublon | sy-subrc = 4 avec UNIQUE KEY | Aucune (sauf SORTED) |
| Performance | Avec INDEX : O(n) | O(1) |
" APPEND : Toujours a la finAPPEND ls_customer TO lt_standard.
" INSERT INDEX : A une position specifiqueINSERT ls_customer INTO lt_standard INDEX 1.
" INSERT INTO TABLE : Selon le type de tableINSERT ls_customer INTO TABLE lt_sorted. " Tri automatiqueINSERT vs. MODIFY
" INSERT : Insere une nouvelle ligne (erreur si doublon)INSERT ls_customer INTO TABLE lt_unique.
" MODIFY : Insere OU met a jour l'existantMODIFY TABLE lt_unique FROM ls_customer.Conseils de performance
-
Insertion en masse avec LINES OF :
" LENT : INSERTs individuelsLOOP AT lt_source INTO ls_line.INSERT ls_line INTO TABLE lt_target.ENDLOOP." PLUS RAPIDE : LINES OFINSERT LINES OF lt_source INTO TABLE lt_target. -
SORTED vs. STANDARD pour insertions frequentes :
" Pour beaucoup d'insertions : Collecter dans STANDARD TABLE, puis trierDATA: lt_collect TYPE STANDARD TABLE OF ty_data.LOOP AT lt_input INTO ls_input.APPEND ls_input TO lt_collect.ENDLOOP.SORT lt_collect BY key_field.DELETE ADJACENT DUPLICATES FROM lt_collect COMPARING key_field. -
INDEX-Insert depuis la fin :
" Pour plusieurs Index-Inserts : De la fin vers le debut" pour minimiser les decalagesINSERT 'C' INTO lt_names INDEX 3.INSERT 'B' INTO lt_names INDEX 2.INSERT 'A' INTO lt_names INDEX 1.
Remarques importantes / Bonnes pratiques
INSERT ... INDEXuniquement pour STANDARD TABLE.INSERT INTO TABLErespecte la cle de table (tri pour SORTED, hash pour HASHED).- Avec
UNIQUE KEY: Verifiezsy-subrcpour la detection de doublons. - Evitez
INSERTdansLOOP AT- Risque de boucles infinies ! - Utilisez
LINES OFpour les insertions en masse (plus performant que les inserts individuels). ASSIGNINGetREFERENCE INTOpermettent un acces direct a la ligne inseree.- Pour les tables de base de donnees, utilisez
INSERT INTO dbtab. APPENDest plus rapide si la position n’a pas d’importance (a la fin).MODIFYcombine INSERT et UPDATE en une seule instruction.- Avec
SORTED TABLE, l’insertion se fait automatiquement a la position correcte.