Identifier les différences entre un paramètre par valeur et par référence
Vous pouvez transmettre des paramètres par valeur ou par référence. Chaque méthode offre des avantages différents.
Transmettre des paramètres par valeur
Lorsque vous transmettez un paramètre par valeur, vous transmettez la valeur d’une variable à une procédure. Cette méthode est toujours le cas par défaut avec les types fondamentaux.
Dans l’exemple suivant, la procédure MyFunction obtient un paramètre de type entier, modifie la valeur et renvoie la valeur de paramA. L’instruction Exit renvoie la valeur.
trigger OnRun()
var
myInteger : Integer;
myResult : Integer;
begin
myInteger := 23;
myResult := MyFunction(myInteger);
Message('myInteger: %1', myInteger); // Displays 23
Message('myResult: %1', myResult); // Displays 17
end;
procedure MyFunction(paramA : Integer) : Integer
begin
paramA := 17;
Exit(paramA);
end;
La valeur de myInteger reste à 23, même après l’exécution de la procédure MyFunction.
Transmettre des paramètres par référence
Une variable alloue toujours une certaine partie de la mémoire de l’ordinateur. Lorsque vous transmettez un paramètre par référence, vous ne transmettez pas la valeur à une procédure, mais plutôt à la référence, à savoir sa position dans la mémoire. À l’aide de cette méthode, vous travaillez directement dans la mémoire. Par conséquent, la modification de cette valeur a également un impact sur votre procédure d’appel. Pour transmettre un paramètre par référence, vous devez ajouter le mot clé var devant un paramètre.
trigger OnRun()
var
myInteger : Integer;
myResult : Integer;
begin
myInteger := 23;
myResult := MyFunction(myInteger);
Message('myInteger: %1', myInteger); // Displays 17
Message('myResult: %1', myResult); // Displays 17
end;
procedure MyFunction(var paramA : Integer) : Integer
begin
paramA := 17;
exit(paramA);
end;
Retourner des types complexes
Vous pouvez maintenant simplifier votre code AL et renvoyer des types complexes, au lieu de les transmettre dans les paramètres de la méthode.
Par exemple, la méthode suivante prend un nom et renvoie le premier enregistrement client correspondant au nom. Notez que la signature spécifie le type de renvoi à la fin de la déclaration de la procédure, et que la procédure se termine en renvoyant l’enregistrement client trouvé.
procedure GetCustomerByName(Name: Text): record Customer;
var
Customer: record Customer;
begin
Customer.SetFilter(Name, '@' + Name + '*');
Customer.FindFirst();
exit(Customer);
end;
Cette nouvelle fonctionnalité vous permet d’appeler les membres directement sur la variable renvoyée, par exemple dans les expressions.
Par exemple, vous pouvez utiliser la formule ci-dessus dans une instruction IF telle que
if GetCustomerByName('SomeName')."Balance (LCY)" > 0 then.
D’autres exemples de renvoi de types complexes sont disponibles ici :