Il arrive souvent que dans un user-exit ou une BADI on n'ait pas toutes les informations nécessaires disponibles en paramètres d'entrée. Dans ces cas-là, plusieurs solutions sont possibles :
- définir des variables de type 'statics'
- utiliser les import/export en mémoire
- assigner directement la zone mémoire si elle est connue
- définir des variables locales ou privées dans la classe d'implémentation.
Voici une description et un exemple pour chaque cas.
Variable de type 'statics' :
Ces variables peuvent être utilisées de la même façon que des variables de types 'data', elles se définissent de la même manière, mais alors que les 'data' perdent leur valeur à la fin du sous-module ou du user-exit, les valeurs des 'statics' sont conservées en mémoire et réutilisables lors du prochain passage dans le sous-module ou le user-exit à condition qu'on reste dans le même processus de traitement.
Par exemple, un user-exit est appelé dans une boucle loop/endloop, on peut donc définir un 'statics', l'initialiser en début de user-exit, modifier sa valeur en fin de user-exit, et retrouver cette dernière valeur lors du prochain passage.
loop at w_table.
call customer-function '001'.
endloop.
customer-function '001' :
statics : s_count type i.
if s_count is initial.
s_count = 1.
else.
if w_table[]-champ1 is initial.
clear s_count.
endif.
endif.
[suite du code..........]
s_count = s_count + 1.
endfunction
ainsi au prochain passage dans le user-exit s_count aura la valeur 2, puis 3, et ainsi de suite jusqu'à la sortie de la boucle.
Import/export en mémoire :
Il arrive souvent qu'au sein d'un même programme principal, plusieurs user-exit soient appelés, et que dans celui qui nous intéresse, il manque une information qui est présente dans un des user-exit appelé précédemment. Dans ce cas il suffit de faire un export en mémoire de l'information voulue dans le premier user-exit et un import de la mémoire dans le user-exit dans lequel on développe.
Attention cependant, cette méthode très utile peut, lorsque plusieurs gros traitements faisant appels à beaucoup d' import/export en mémoire sont lancés simultanément, engendrer des erreurs imprévisibles en mélangeant les valeurs des différentes zones conduisant ainsi à des résultats erronés. La marge est quand même importante avant d'arriver à de tels extrêmes.
Par exemple :
Dans le premier user-exit :
DATA : BEGIN OF w_vari OCCURS 6.
INCLUDE STRUCTURE api_cv.
DATA : END OF w_vari.
[suite du code..........]
EXPORT w_vari TO MEMORY ID 'VARI'.
[fin du code..........]
Dans le second user-exit :
DATA : BEGIN OF w_vari OCCURS 6.
INCLUDE STRUCTURE api_cv.
DATA : END OF w_vari.
[suite du code..........]
IMPORT w_vari FROM MEMORY ID 'VARI'.
[fin du code..........]
Nous verrons dans un prochain article les autres méthodes.