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.