Usar diferentes funciones de campo en AL
Al trabajar con datos de la base de datos en AL, tendrá que usar otras instrucciones que se emplean en los campos, como las siguientes:
CalcFields
CalcSums
FieldError
Init
TestField
Validate
Instrucciones CalcFields y SetAutoCalcfields
Al recuperar FlowFields en código AL, su valor siempre será cero.
El motivo de este valor es que el tipo de cálculo de FlowFields no se ejecuta en código AL. Al usar FlowFields en una página, el FlowField se calcula automáticamente, pero no en código AL. Por tanto, necesita usar la función CalcFields. Al usar la función CalcFields, puede especificar qué FlowFields hay que calcular durante la implementación del código.
En el siguiente ejemplo, solo se calculan los FlowFields Saldo y Saldo periodo. Fuera de la instrucción repeat until, los FlowFields ya no se calculan, solo dentro de su ámbito.
customer.SetRange("Date Filter", 0D, Today());
// Using CALCFIELDS
if customer.FindSet() then
repeat
customer.CalcFields(Balance, "Net Change");
// Do some additional processing
until customer.Next() = 0;
Si siempre quiere calcular determinados FlowFields (dentro del ámbito de la función), puede usar la función SetAutoCalcFields.
// Using SETAUTOCALCFIELDS
customer.SetAutoCalcFields(Balance, "Net Change");
if customer.FindSet() then
repeat
// Do some additional processing
until customer.Next() = 0;
Instrucción CalcSums
La función CalcSums se usa para calcular un total para un campo específico, en función de los filtros del conjunto de datos.
En el siguiente ejemplo, la tabla Cabecera de facturas de ventas se filtra por el campo Facturar a n.º cliente entre 10 000 y 50 000 y la Fecha del documento entre 0D (el principio) y Hoy. La función CalcSums resumirá todos los campos de importe.
salesInvoiceHeader.SetCurrentKey("Bill-to Customer No.");
salesInvoiceHeader.SetRange("Bill-to Customer No.", '10000', '50000');
salesInvoiceHeader.SetRange("Document Date", 0D, Today());
salesInvoiceHeader.CalcSums(Amount);
Message('The total is %1', salesInvoiceHeader.Amount);
Instrucción FieldError
La función FieldError detiene la implementación del código, lo que causa un error en tiempo de ejecución y crea un mensaje de error para un campo específico. El campo muestra un borde rojo, lo que indica que se ha producido un error con el valor de este campo.
if item."Unit Price" < 10 then
item.FieldError("Unit Price", 'must be greater than 10');
Instrucción init
La mejor estrategia es comenzar usando el comando Init en el registro. Esta acción inicializa todos los campos en el registro.
Inicializar significa que cada campo obtiene su valor predeterminado (0 para tipos de datos numéricos, cadena vacía para texto, etc.). Sin embargo, si ha especificado un InitValue en el campo de la tabla, la función Init inicializará su campo con ese valor y no con el valor predeterminado.
customer.Init();
customer.Name := 'John Doe';
customer."E-Mail" := 'john.doe@contoso.com';
customer.Insert(true);
Instrucción TestField
Con la función TestField, puede comprobar si un campo tiene un valor o está en blanco. Si el campo está vacío, la función TestField genera un error en tiempo de ejecución.
customer.TestField("Salesperson Code");
También puede usar la función TestField para comprobar si un campo contiene un valor específico o no. Si no lo contiene, el campo generará un error. En el siguiente ejemplo, TestField comprobará si Cód. vendedor contiene el valor ZX. En este caso, no contiene el valor porque el valor está configurado como DK.
customer."Salesperson Code" := 'DK';
customer.TestField("Salesperson Code", 'ZX');
Instrucción validate
Al asignar un valor a un campo, el desencadenador OnValidate de ese campo no se ejecuta. Si quiere ejecutar el desencadenador OnValidate, use la función Validate.
Customer."Phone No." := '1234567891234'
customer.Validate("Phone No.");
También puede usar la función Validate para asignar un valor y ejecutar el desencadenador OnValidate.
customer.Validate("Phone No.", '1234567891234');