Classificar e filtrar dados no código

Concluído

Os exemplos anteriores demonstraram como os registros podem ser recuperados do banco de dados. Esses dados são classificados na chave primária por padrão.

Você pode especificar como deseja classificar os dados antes de executar uma instrução Find ou FindSet. O resultado pode ser diferente, especialmente com uma instrução FindFirst.

Função SetCurrentKey

Para classificar registros, use a função SetCurrentKey, na qual você pode especificar o campo (ou campos) pelo qual deseja classificar.

var
    customer: Record Customer;
begin
    customer.SetCurrentKey(City);

    customer.FindFirst();
    Message('%1', customer);

Funções SetRange e SetFilter

Além de classificar, você também pode filtrar os resultados. Ao usar esse método, você não precisa recuperar todos os dados do banco, o que é melhor para o desempenho.

As duas possibilidades para filtrar o conjunto de dados são SetRange e SetFilter.

Com a função SetRange, você pode especificar um valor inicial e final para um campo específico. No entanto, não é possível usar a função SetRange para procurar registros em que o valor do campo seja maior ou menor do que um valor específico.

SetRange(Field, [FromValue], [ToValue])

O exemplo a seguir mostra a função SetRange que está sendo usada.

customer.SetRange("No.", '10000', '40000');
customer.FindSet();
repeat
    Message('%1', customer);
until customer.Next() = 0;

A omissão da função ToValue significa que você terá que procurar todos os registros em que o valor de Field é igual a FromValue.

Se omitir o valor de FromValue também, você redefinirá o filtro e o removerá do campo especificado.

customer.SetRange("No."); // Removing filter on "No." field
customer.FindSet();
repeat
    Message('%1', customer);
until customer.Next() = 0;

Você já aprendeu que não é possível usar a função SetRange para procurar valores maiores ou menores do que um valor específico. No entanto, é possível usar a função SetFilter para essa finalidade.

A função SetFilter aceita um valor de cadeia de caracteres, no qual você pode especificar as condições de filtragem, como:

  • >
  • <
  • < >
  • <=
  • >=
  • '*'
  • .. (intervalo)
  • & (e)
  • | (ou) e mais nesta condição de filtro
SetFilter(Field, String, [Value1], [Value2], …)

No exemplo a seguir, o filtro recuperará todos os clientes em que o campo é maior do que 10.000 e diferente de 20.000.

customer.SetFilter("No.", '> 10000 & <> 20000');

Como alternativa, você pode usar espaços reservados.

value1 := '10000';
value2 := '20000';
customer.SetFilter("No.", '>%1&<>%2', value1, value2);

Para pesquisar e filtrar em vários campos, especifique várias instruções SetRange e/ou SetFilter.

No exemplo a seguir, todos os clientes com um entre 10.000 e 90.000 são recuperados, em que os campos City começam com a letra B (o símbolo @ especifica a diferenciação de maiúsculas e minúsculas; caso contrário, sempre diferencia maiúsculas de minúsculas) e o Country/Region Code começa com uma letra maiúscula B.

customer.SetRange("No.", '10000', '90000');
customer.SetFilter(City, '@B*');
customer.SetFilter("Country/Region Code", 'B*');
customer.FindSet();
repeat
    Message('%1', customer);
until customer.Next() = 0;

O exemplo a seguir mostra um filtro "ou" (|) sendo usado.

customer.SetFilter("No.", '10000|20000|30000');

Você pode usar as instruções de filtro com a instrução IsEmpty para verificar se algum registro corresponde aos filtros.

DocumentNo := '10000';

SalesLine.SetRange("Document No.", DocumentNo);
if (SalesLine.IsEmpty()) then
    Message('No sales line records found for document %1', DocumentNo);