Saltearse al contenido

Procedimientos (Funciones)

Los motivos por los que crear procedimientos personalizados son:

  • Organizar el programa.
  • Crear un código autoexplicativo.
  • Simplificar el proceso de desarrollo.
  • Hacer que el código sea reutilizable, lo que reduce el trabajo.
  • Reducir los errores.
  • Ayudar a realizar modificaciones de forma más sencilla.
  • Reducir el tamaño de los objetos.

Un procedimiento es una parte con nombre de un programa. Puede agrupar muchas líneas, asignarles un nombre y luego llamar a este bloque de código por su nombre.

local procedure MyProcedure()
begin
// Some logic goes here.
end;
trigger OnRun()
begin
if Quantity > 5 then
MyCustomFunction();
end;
procedure MyCustomFunction()
begin
// Some logic goes here.
end;

Al crear procedimientos personalizados, debe considerar la función GuiAllowed. Puede usar esta función para determinar cuándo deben ejecutarse determinadas partes del código, en función de si una interfaz gráfica de usuario (GUI) está disponible o no.

if GuiAllowed then
Message('Hello');

Al crear un procedimiento en el objeto, el procedimiento es global de forma predeterminada, lo que significa que otros objetos pueden tener acceso a este. Si otras extensiones dependen de su extensión, tendrán acceso a los procedimientos de acceso que sean públicas.

procedure MyFunction()
begin
// Logic goes here
end;

También puede hacer que el procedimiento sea local, interno o protegido. Cuando un procedimiento es local, solo puede tener acceso a él desde el mismo objeto. Para crear un procedimiento local, debe especificar la palabra clave local.

local procedure MyFunction()
begin
// Logic goes here
end;

Cuando un procedimiento es interno, solo puede tener acceso a ella desde la misma extensión. Por tanto, el resto de objetos de la misma extensión pueden tener acceso a este procedimiento. Para crear un procedimiento interno, debe especificar la palabra clave interno.

internal procedure MyFunction()
begin
// Logic goes here
end;

Cuando un procedimiento está protegido, solo puede tener acceso a él desde el objeto de definición y de host. Por tanto, si crea un procedimiento en una tabla, las extensiones de tabla que extienden su tabla pueden tener acceso a dicho procedimiento. Para crear un procedimiento protegido, debe especificar la palabra clave protegido.

protected procedure MyFunction()
begin
// Logic goes here
end;

Accesibilidad de variables globales y locales

Sección titulada «Accesibilidad de variables globales y locales»

Se puede acceder a las variables globales desde cualquier lugar del objeto donde se definen. No es posible acceder a ellas fuera del objeto. Solo otros objetos pueden acceder a los procedimientos globales.

var
myInt2: Integer
procedure MyFunction()
var
myInt: Integer;
begin
myInt := 5; // The variable myInt is only available in this function
myInt2 := 10; // myInt2 is accessible everywhere in the object
end;
procedure MyFunction2()
begin
myInt := 6; // The variable myInt is not in the scope of MyFunction2
myInt2 := 11; // myInt2 is accessible everywhere in the object
end;

Las variables locales en el procedimiento cuando se definen, de modo que el ámbito se limita únicamente al procedimiento actual en el que se está trabajando.

procedure MyFunction()
var
myInt: Integer;
begin
myInt := 5; // The variable myInt is only available in this function
end;
procedure MyFunction2()
begin
myInt := 6; // The variable myInt is not in the scope of MyFunction2
end;

Puede usar un parámetro para pasar información a un procedimiento. Los procedimientos podrían incluir los siguientes parámetros:

  • Los valores, referencias o expresiones se envían al procedimiento

Al pasar parámetros por valor, transmitirá el valor de una variable a un procedimiento. Este método siempre es el predeterminado con los tipos fundamentales.

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;

Una variable siempre asigna cierta parte de la memoria del equipo. Al pasar un parámetro por referencia, no se transmite el valor a un procedimiento, sino a la referencia, que es su posición en la memoria. Al usar este método, estará trabajando directamente en la memoria. Como resultado, cambiar ese valor afecta también al procedimiento de llamada. Para pasar un parámetro por referencia, debe agregar la palabra clave var delante de un parámetro.

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;

Al llamar a procedimientos desde el código, Visual Studio Code le ayuda facilitándole información sobre los parámetros que requiere el procedimiento.

intellisense-visual-studio-code-ss.png

Para definir un procedimiento con parámetros, debe separar todos los parámetros con un punto y coma en la definición del procedimiento.

procedure MyFunction(Param1: Integer; Param2: Text[50])

Al crear un procedimiento, cuando el procedimiento ha terminado de ejecutar el código, si quiere que devuelva algo, puede usar la instrucción exit.

Si no proporciona un valor de devolución en la instrucción exit, el procedimiento terminará. Esta característica puede resultar útil si quiere que el procedimiento se detenga tras una determinada condición. De lo contrario, puede proporcionar un valor que se pueda devolver.

exit(<expression>);
exit(param * param);
local procedure MyFunction() : Integer
var
myResult: Integer
begin
myResult := Power(2, 3);
exit(myResult);
end;
procedure GetCustomerByName(Name: Text): record Customer;
var
Customer: record Customer;
begin
Customer.SetFilter(Name, '@' + Name + '*');
Customer.FindFirst();
exit(Customer);
end;

También es posible utilizar un valor de retorno con nombre. Internamente, la sentencia de salida provoca una asignación a un valor de retorno asignado. La asignación tendrá un pequeño costo de rendimiento en función del tipo. Dado que el tipo de registro se trata como un tipo de valor, es mejor.

procedure GetCustomerByName(Name: Text) Customer: record Customer;
begin
Customer.SetFilter(Name, '@' + Name + '*');
Customer.FindFirst();
end;

La sobrecarga de procedimientos permite a los desarrolladores crear múltiples procedimientos con el mismo nombre, pero con diferentes firmas, en el mismo objeto de aplicación. Conceptualmente, los procedimientos sobrecargados se utilizan para ejecutar la misma tarea en un conjunto diferente de argumentos. Cuando se llama a un procedimiento sobrecargado, se ejecutará una implementación específica de ese procedimiento, adecuada al contexto de la llamada.

codeunit 10 StringifierWithOverloads
{
procedure ToString(value : Text) : Text
begin
Exit(value);
end;
procedure ToString(value : Date) : Text
begin
Exit(Format(value));
end;
procedure ToString(value : Integer) : Text
begin
Exit(Format(value));
end;
}