Recuperar dados do banco de dados com instruções AL

Concluído

Para recuperar os dados do banco de dados, você pode usar as funções de acesso a dados.

Você pode usar as seguintes funções de acesso a dados para obter registros:

  • Get

  • Find, FindFirst, FindLast

  • Next

  • IsEmpty

Função Get

A função Get recupera um registro com base na chave primária. Se a sua tabela tiver uma chave primária de um campo, você precisará fornecer um parâmetro para a função Get. Se a chave primária for uma chave combinada de vários campos, você precisará fornecê-los na ordem da definição de chave primária.

No exemplo a seguir, é recuperado um registro com a chave primária 30000 da tabela de Clientes. Como a chave primária de uma tabela de Clientes é do tipo Code[20], é necessário especificar o valor como uma cadeia de caracteres. A melhor maneira de usar a função Get é em uma instrução if.

Se o registro não for encontrado e você não estiver usando uma instrução if para verificar o resultado da instrução Get, será gerado um erro no código.

var
    customer: Record Customer;
begin
    customer.Get('30000');

    if customer.Get('10000') then
        Message('%1', customer)
    else
        Error('Not found');

end;

Função Find

A função Find tem duas funções derivadas: FindFirst e FindLast. Em alguns códigos padrão, as funções Find('-') e Find('+') continuam sendo usadas. Essas funções foram usadas em versões anteriores do Business Central.

O resultado de Find('-') e FindFirst é o mesmo, mas a forma como o resultado é solicitado é diferente. Com a função FindFirst, o Business Central solicita que o SQL Server recupere o primeiro registro no banco de dados usando uma consulta de SQL SELECT TOP 1.

A função Find('-') solicita um comando SELECT do SQL Server e recupera o primeiro registro no Business Central. Esse processo leva a um desempenho ruim. Em vez disso, use as funções FindFirst e 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 os registros (ou um conjunto de registros filtrados), você poderá usar a função FindSet.

customer.FindSet();
// SELECT * FROM Customer

Instrução Next

A instrução Next é usada para obter o próximo registro em um conjunto de registros. Normalmente, você deve usar a instrução Next em uma instrução repeat until. A instrução Next tem, opcionalmente, um parâmetro que define quantas etapas você deseja avançar. Se você atribuir ao parâmetro um valor 3, ele sempre obterá o terceiro registro da lista.

customer.FindSet();
// SELECT * FROM Customer
repeat
    // process record
    Message(customer.Name);
until customer.Next() = 0;

Função IsEmpty

Se você deseja verificar se um registro existe, mas sem o recuperar, é melhor usar a função IsEmpty.

Métodos de banco de dados AL e desempenho no SQL Server

A linguagem AL oferece vários métodos para recuperar dados de registros. No Dynamics 365 Business Central, os registros são recuperados usando conjuntos de resultados ativos múltiplos (MARS). Geralmente, a recuperação de registros com os MARS é mais rápida do que com os cursores no servidor. Cada função também é otimizada para uma finalidade específica. Para obter o desempenho ideal, você deve usar o método mais adequado a uma determinada finalidade.

  • Record.Get é otimizado para obter um registro único com base nos valores de chave primária.

  • Record.Find é otimizado para obter um registro único com base nas chaves primárias do registro e em qualquer filtro ou intervalo definido.

  • Record.Find('-') e Record.Find('+') são otimizados para leitura principalmente de uma tabela única quando o aplicativo não pode ler todos os registros. Find('-') é implementado com a emissão de uma chamada TOP X de ajuste automático, em que X pode mudar ao longo do tempo de acordo com as estatísticas de número de linhas lidas. Veja a seguir exemplos de cenários nos quais você deve usar a função Find('-') para obter o desempenho ideal:

    • Antes de lançar um lote no diário geral, você deve verificar a validade de todas as linhas do diário e confirmar se todas as linhas estão niveladas. Quando um erro é encontrado depois da primeira linha, você não precisa recuperar o restante das linhas.

    • Se você deseja executar várias ordens pendentes de uma compra recente, mas não sabe quantas ordens estão incluídas na compra.

  • Record.FindSet(ForUpdate, UpdateKey) é otimizado para ler o conjunto completo de registros no filtro e no intervalo especificados. O parâmetro UpdateKey não afeta a eficácia desse método no Dynamics 365 Business Central, como ocorria nas versões anteriores do produto. FindSet não é implementado emitindo uma chamada TOP X.

  • Record.FindFirst e Record.FindLast são otimizados para localizar o primeiro ou o último registro no filtro e no intervalo especificados.

  • Record.Next pode ser chamado a qualquer momento. No entanto, se Record.Next não for chamado como parte da recuperação de um conjunto de resultados contínuos, o Business Central chamará uma instrução SQL separada para localizar o próximo registro.