Recuperar datos de la base de datos con instrucciones de AL
Para recuperar datos de la base de datos, puede usar las funciones de acceso a datos.
Puede usar las siguientes funciones de acceso a datos para obtener registros:
Get
Find, FindFirst, FindLast
Next
IsEmpty
Función Get
La función Get recupera un registro basado en la clave principal.
Si la tabla tiene una clave principal de un campo, debe proporcionarle un parámetro a la función Get. Si la clave principal es una clave combinada de varios campos, debe proporcionarlos en el orden de la definición de clave principal.
En el siguiente ejemplo, se recupera un registro con clave principal 30000 de la tabla Customer. Dado que la clave principal de la tabla Customer es de tipo Code[20], debe especificar el valor como una cadena. La mejor manera de usar la función Get es dentro de una instrucción if.
Si no se encuentra el registro y no está utilizando una instrucción if para comprobar el resultado de la instrucción Get, generará un error en el código.
var
customer: Record Customer;
begin
customer.Get('30000');
if customer.Get('10000') then
Message('%1', customer)
else
Error('Not found');
end;
Función Find
La función Find tiene dos funciones derivadas: FindFirst y FindLast. En algún código estándar, se siguen utilizando las funciones Find('-') y Find('+'). Estas funciones se utilizaron en versiones anteriores de Business Central.
El resultado de Find('-') y FindFirst es el mismo, pero la forma en que se solicita el resultado difiere. Con la función FindFirst, Business Central le pide a SQL Server que recupere el primer registro de la base de datos mediante una consulta SQL SELECT TOP 1.
La función Find('-') le solicita SELECT a SQL Server y recupera el primer registro de Business Central. Por tanto, este proceso genera un rendimiento deficiente. Es mejor utilizar las funciones FindFirst y FindLast.
var
customer: Record Customer;
begin
customer.Find('-');
// SELECT * FROM Customer
Message('%1', customer.Name);
customer.Find('+');
// SELECT * FROM Customer Order By No. Desc
Message('%1', customer.Name);
customer.FindFirst();
// SELECT TOP 1 * FROM Customer
Message('%1', customer.Name);
customer.FindLast();
// SELECT TOP 1 * FROM Customer Order By No. Desc
Message('%1', customer.Name);
Para recuperar todos los registros (o un conjunto filtrado de registros), puede usar la función FindSet.
customer.FindSet();
// SELECT * FROM Customer
Instrucción Next
La instrucción Next se utiliza para obtener el siguiente registro de un conjunto de registros.
Por lo general, la instrucción Next se usaría en una instrucción repeat until. La instrucción Next tiene un parámetro opcional que define los pasos que desea realizar para avanzar. Si le asigna al parámetro un valor de 3, siempre obtendrá cada tercer registro de la lista.
customer.FindSet();
// SELECT * FROM Customer
repeat
// process record
Message(customer.Name);
until customer.Next() = 0;
Función IsEmpty
Si desea comprobar si existe un registro, pero no desea recuperarlo, la mejor opción es usar la función IsEmpty.
Métodos y rendimiento de la base de datos de AL en SQL Server
El lenguaje AL ofrece varios métodos para recuperar datos de registros. En Dynamics 365 Business Central, los registros se recuperan mediante el uso de conjuntos de resultados activos múltiples (MARS). Por lo general, la recuperación de registros con MARS es más rápida que con los cursores del lado del servidor. Además, cada función está optimizada para un propósito específico. Para lograr un rendimiento óptimo, debe usar el método que mejor se adapte a un propósito determinado.
Record.Getestá optimizado para obtener un solo registro basado en valores de clave principal.Record.Findestá optimizado para obtener un solo registro basado en las claves principales del registro y cualquier filtro o rango que se haya establecido.Record.Find('-')yRecord.Find('+')están optimizados para leer principalmente desde una sola tabla cuando es posible que la aplicación no lea todos los registros.Find('-')se implementa emitiendo una llamadaTOP Xde ajuste automático, dondeXpuede cambiar con el tiempo, según las estadísticas del número de filas leídas. A continuación, se muestran ejemplos de escenarios en los que debe usar la funciónFind('-')para lograr un rendimiento óptimo:Antes de registrar un lote de diario general, debe comprobar la validez de todas las líneas del diario y verificar el equilibro de todas las líneas. Después de la primera línea, cuando se encuentra un error, no es necesario recuperar el resto de las filas.
Si desea cumplir con varios pedidos pendientes de una compra reciente, pero no sabe cuántos pedidos cubre la compra.
Record.FindSet(ForUpdate, UpdateKey)está optimizado para leer el conjunto completo de registros en el filtro y rango especificados. El parámetro UpdateKey no influye en la eficacia de este método en Dynamics 365 Business Central, como ocurría en versiones anteriores del producto.FindSetno se implementa emitiendo una llamadaTOP X.Record.FindFirstyRecord.FindLastestán optimizados para encontrar el primer o último registro en el filtro y rango especificados.Record.Nextse puede llamar en cualquier momento. Sin embargo, si no se llama aRecord.Nextcomo parte de la recuperación de un conjunto de resultados continuo, Business Central llama a una instrucción SQL independiente para encontrar el siguiente registro.