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.
Creacion de un procedimiento
Sección titulada «Creacion de un procedimiento»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;Llamada de un procedimiento
Sección titulada «Llamada de un procedimiento»trigger OnRun()begin if Quantity > 5 then MyCustomFunction();end;
procedure MyCustomFunction()begin // Some logic goes here.end;Función GuiAllowed
Sección titulada «Función GuiAllowed»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');Procedimientos Globales
Sección titulada «Procedimientos Globales»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 hereend;Procedimiento Local
Sección titulada «Procedimiento Local»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 hereend;Procedimiento Interno
Sección titulada «Procedimiento Interno»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 hereend;Procedimiento Protegido
Sección titulada «Procedimiento Protegido»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 hereend;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 objectend;
procedure MyFunction2()begin myInt := 6; // The variable myInt is not in the scope of MyFunction2 myInt2 := 11; // myInt2 is accessible everywhere in the objectend;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 functionend;
procedure MyFunction2()begin myInt := 6; // The variable myInt is not in the scope of MyFunction2end;Pasando Parametros a los procedimientos
Sección titulada «Pasando Parametros a los procedimientos»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
Parámetros por valor
Sección titulada «Parámetros por valor»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 17end;
procedure MyFunction(paramA : Integer) : Integerbegin paramA := 17; Exit(paramA);end;Parámetros por referencia
Sección titulada «Parámetros por referencia»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 17end;
procedure MyFunction(var paramA : Integer) : Integerbegin 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.

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])Instruccion Exit
Sección titulada «Instruccion Exit»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() : Integervar myResult: Integerbegin myResult := Power(2, 3); exit(myResult);end;Devolución de tipos complejos
Sección titulada «Devolución de tipos complejos»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;Sobrecarga de procedimientos
Sección titulada «Sobrecarga de procedimientos»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;}