Recuperar dados do banco de dados com instruções AL
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('-')eRecord.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 chamadaTOP Xde ajuste automático, em queXpode 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çãoFind('-')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.FindSetnão é implementado emitindo uma chamadaTOP X.Record.FindFirsteRecord.FindLastsão otimizados para localizar o primeiro ou o último registro no filtro e no intervalo especificados.Record.Nextpode ser chamado a qualquer momento. No entanto, seRecord.Nextnã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.