Ordenar y filtrar datos en código

Completado

En los ejemplos anteriores se mostraron cómo se pueden recuperar los registros de la base de datos. Estos datos se ordenan en la clave principal de forma predeterminada.

Puede especificar cómo desea ordenar los datos antes de ejecutar una instrucción Find o FindSet. El resultado puede ser diferente, especialmente con una instrucción FindFirst.

Función SetCurrentKey

Para ordenar registros, use la función SetCurrentKey, donde puede especificar los campos por los que desea ordenar.

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

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

Funciones SetRange y SetFilter

Además de ordenar, también puede filtrar los resultados. Al usar este método, no necesita recuperar todos los datos de la base de datos, lo que es mejor con vistas al rendimiento.

Las dos opciones para filtrar el conjunto de datos son SetRange y SetFilter.

Con la función SetRange, puede especificar un valor inicial y final para un campo específico. Sin embargo, no puede usar la función SetRange para buscar registros donde el valor del campo sea mayor o menor que un valor específico.

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

El siguiente ejemplo muestra la función SetRange que se está usando.

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

Omitir la función ToValue significa que tendrá que buscar todos los registros donde Field sea igual a FromValue.

Si también omite FromValue, restablecerá y eliminará el filtro en el campo especificado.

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

Ya ha visto que no puede usar la función SetRange para buscar valores mayores o menores que un valor específico. Sin embargo, puede usar la función SetFilter con este fin.

La función SetFilter acepta un valor de cadena donde puede especificar las condiciones de filtrado; por ejemplo:

  • >
  • <
  • < >
  • <=
  • >=
  • '*'
  • .. (intervalo)
  • & (y)
  • | (o) más en esta condición de filtro
SetFilter(Field, String, [Value1], [Value2], …)

En el siguiente ejemplo, el filtro recuperará todos los clientes donde el campo N.º es mayor que 10 000 y diferente de 20 000.

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

También puede usar marcadores de posición.

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

Para buscar y filtrar en varios campos, especifique varias instrucciones SetRange o SetFilter.

En el siguiente ejemplo, todos los clientes con un N.º entre 10 000 y 90 000 se recuperarán, donde los campos City comienzan por una letra B (el signo @ especifica si distingue entre mayúsculas y minúsculas; de lo contrario, siempre distingue mayúsculas de minúsculas) y el Country/Region Code comienza por una letra mayú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;

El siguiente ejemplo muestra el uso de un filtro "o" (|).

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

Puede usar las instrucciones de filtro con la instrucción IsEmpty para comprobar si algún registro coincide con los filtros.

DocumentNo := '10000';

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