Les tables internes
Caractéristiques
1. Définition
Une table interne est un objet dans un programme permettant de stocker des données le temps de l’exécution dudit programme.
Elle se déclare de la façon suivante :
TYPES: BEGIN OF ty_tab,
obj1 TYPE dtel1,
obj2 TYPE dtel2,
obj3 TYPE dtel3,
. . .
END OF ty_tab.
DATA: it_tab_types TYPE TABLE OF ty_tab,
wa_tab_types TYPE ty_tab.
Un type de structure est tout d’abord créé, c’est une sorte de squelette qui sera utilisé comme une référence par la table interne IT_TAB_TYPES avec l’instruction TYPE TABLE OF, et la structure WA_TAB_TYPES avec TYPE. L’instruction commence par la commande TYPES puis BEGIN OF indiquant qu’un type de structure va être créé. Les champs qui la composent sont ensuite listés et référencés. Cette référence à une spécificité technique, peut se faire de plusieurs manières (pas vraiment de grandes différences aussi bien techniques que pour l’optimisation du programme).
-
Référence directe à un type de champ et une longueur :
. . .
obj1(5) TYPE c,
obj2(4) TYPE n,
. . .
-
Référence directe à un élément de données (cf. chapitre Dictionnaire de données (DDIC) - Éléments de données) :
. . .
obj1 TYPE char5,
Obj2 TYPE numc4,
. . .
-
Référence indirecte à un élément de données via le nom d’une table et son champ :
. . .
obj1 TYPE zdriver_car-driver_id,
Obj2 TYPE zdriver_car-car_year,
. . .
-
Référence indirecte avec le LIKE :
. . . obj1 LIKE char5,
Obj2 LIKE numc4,
. . .
. . . obj1 LIKE zdriver_car-driver_id,
Obj2 LIKE zdriver_car-car_year,
. . .
Pour faire une petite parenthèse, une variable et une constante peuvent se déclarer exactement de la même façon. Cette notion n’a pas été évoquée dans le chapitre adéquat...
Travail sur les données
1. Ajout d’enregistrements
a. INSERT
INSERT wa
| {INITIAL LINE}
| {LINES OF jtab [FROM idx1] [TO idx2]} ...
INTO {TABLE itab}
| {itab INDEX idx } ...
L’instruction INSERT va insérer les données contenues dans une structure (wa), une ligne vide (INITIAL LINE), ou dans les lignes d’une autre table interne (jtab), avec comme option la possibilité de spécifier les numéros de ligne à copier (FROM idx1 / TO idx2). Elle va insérer ces enregistrements dans une table interne (TABLE itab), avec la possibilité d’indiquer leur ligne de destination.
Pour tous les exemples ci-dessous, le programme 06_CODE_CITIZEN.txt liste tous les champs et les valeurs de la table interne T_CITIZEN.
Exemple
Insertion de lignes dans la table interne T_CITIZEN1
TYPES: BEGIN OF ty_citizen,
country TYPE char3,
name TYPE char20,
age TYPE numc2,
END OF ty_citizen.
DATA: t_citizen1 TYPE TABLE OF ty_citizen,
t_citizen2 TYPE TABLE OF ty_citizen,
s_citizen TYPE ty_citizen.
s_citizen-country = 'FR'.
s_citizen-name = 'Thierry'.
s_citizen-age = '24'.
INSERT s_citizen INTO TABLE t_citizen1.
*
s_citizen-country = 'ES'.
s_citizen-name = 'Luis'.
s_citizen-age = '32'.
INSERT s_citizen INTO TABLE t_citizen2.
s_citizen-country = 'BR'.
s_citizen-name = 'Renata'.
s_citizen-age = '27'.
INSERT s_citizen INTO TABLE t_citizen2. ...
Organisation et Lecture
1. SORT
SORT itab [ASCENDING|DESCENDING] [AS text] [STABLE]
BY c1 [ASCENDING|DESCENDING] [AS text]
...
cn [ASCENDING|DESCENDING] [AS text].
L’instruction SORT permet d’organiser une table interne de type STANDARD ou HASHED itab selon sa clé primaire ou une liste de composants (c1 à cn). Les options ASCENDING et DESCENDING définissent un tri par ordre croissant ou décroissant, AS TEXT donne la possibilité pour les champs de type chaîne de caractères d’être triés par une langue définie en local par l’instruction SET LOCALE LANGUAGE (par défaut, la langue utilisée est celle définie par l’utilisateur).
Exemple
Deux SORT sont effectués sur une table de type STANDARD.
TYPES: BEGIN OF ty_citizen,
country TYPE char3,
name TYPE char20,
age TYPE numc2,
END OF ty_citizen.
DATA: t_citizen TYPE STANDARD TABLE OF ty_citizen,
s_citizen TYPE ty_citizen.
s_citizen-country = 'FR'.
s_citizen-name = 'Thierry'.
s_citizen-age = '24'.
APPEND s_citizen TO t_citizen.
s_citizen-country = 'ES'.
s_citizen-name = 'Luis'.
s_citizen-age = '32'.
APPEND s_citizen TO t_citizen.
s_citizen-country = 'BR'.
s_citizen-name = 'Renata'.
s_citizen-age = '27'.
APPEND s_citizen TO t_citizen.
s_citizen-country = 'FR'. ...
Outils
1. FIND IN TABLE
FIND [{FIRST OCCURRENCE}|{ALL OCCURRENCES} OF] pattern
IN TABLE itab [table_range]
[IN {CHARACTER|BYTE} MODE]
... [{RESPECTING|IGNORING} CASE]
[MATCH COUNT mcnt]
{ {[MATCH LINE mlin]
[MATCH OFFSET moff]
[MATCH LENGTH mlen]}
| [RESULTS result_tab|result_wa] }.
L’instruction FIND IN TABLE possède les mêmes paramètres et se comporte exactement de la même façon que l’instruction FIND dans une variable (cf. chapitre Instructions basiques ABAP - Opérations sur variable texte).
Exemple
Chercher toutes les occurrences ’FR’ dans la table T_CITIZEN et afficher les lignes concernées.
TYPES: BEGIN OF ty_citizen,
country TYPE char3,
name TYPE char20,
age TYPE numc2,
END OF ty_citizen.
DATA: t_citizen TYPE STANDARD TABLE OF ty_citizen,
t_results TYPE TABLE OF match_result,
s_citizen TYPE ty_citizen,
s_results TYPE match_result.
FIELD-SYMBOLS: <fs_citizen> TYPE ty_citizen.
s_citizen-country = 'FR'.
s_citizen-name = 'Thierry'.
s_citizen-age = '24'.
APPEND s_citizen TO t_citizen.
s_citizen-country = 'ES'.
s_citizen-name = 'Francisco'.
s_citizen-age = '32'.
APPEND s_citizen TO t_citizen.
s_citizen-country = 'BR'.
s_citizen-name = 'Renata'. ...
Exercice
Le but de cet exercice est de créer deux tables internes, et de boucler sur l’une d’entre elles pour afficher ses informations complétées par celles de la deuxième.
Créer un programme Z comme objet local via la transaction SE38.
Créer une table interne T_CATEGORY contenant les champs :
-
CATEGORY de type alphanumérique de 3 positions.
-
DESCRIPTION de type alphanumérique de 20 positions.
Renseigner la table interne avec les enregistrements suivants :
CATEGORY |
DESCRIPTION |
BIO |
Biographie |
FAN |
Fantasy |
HOR |
Horreur |
ROM |
Roman |
SCI |
Science-Fiction |
Créer une deuxième table interne T_BOOKS faisant référence à la table du DDIC ZBOOKS :
Renseigner la table interne avec les enregistrements suivants :
TITLE |
CATEGORY |
AUTHOR |
YEAR |
La planète des Singes |
SCI |
Pierre Boulle |
1963 |
Le Seigneur des Anneaux |
FAN |
J.R.R. Tolkien |
1955 |
Frida Khalo |
BIO |
Frida Khalo |
2009 |
Ça |
HOR |
Stephen King |
1986 |
L’alchimiste |
ROM |
Paulo Coelho |
1988 |
Dune |
SCI |
Frank Herbert |
1965 |
L’Appel de Cthulhu |
HOR |
Howard P. Lovecraft |
1928 |
Open |
BIO |
André Agassi |
2011 |
Au bonheur des Ogres |
ROM |
Daniel Pennac |
1985 |
Le Trône de fer |
FAN |
George R.R. Martin |
1996 |
La Nuit des Temps |
SCI |
René Barjavel |
1968 |
Le programme affichera un compteur indiquant le nombre de livres contenus dans la bibliothèque (penser à une phrase du type : ’La...