Recuperar datos de la base de datos con instrucciones de AL

Completado

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.Get está optimizado para obtener un solo registro basado en valores de clave principal.

  • Record.Find está optimizado para obtener un solo registro basado en las claves principales del registro y cualquier filtro o rango que se haya establecido.

  • Record.Find('-') y Record.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 llamada TOP X de ajuste automático, donde X puede 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ón Find('-') 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. FindSet no se implementa emitiendo una llamada TOP X.

  • Record.FindFirst y Record.FindLast están optimizados para encontrar el primer o último registro en el filtro y rango especificados.

  • Record.Next se puede llamar en cualquier momento. Sin embargo, si no se llama a Record.Next como 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.