Busqueda de datos

Busqueda de datos

Hola!! Vamos a ver distintas formas para buscar y filtrar datos.

Contenido:
1. Métodos: Get, Find y Mark
2. Filtros: SetRange y SetFilter
3. Tips: SetCurrentKey, IsEmpty

Métodos

Get()

Recupera un record segun las claves principales de la tabla, o cualquier otro campo.

// Buscamos el cliente "4001", sabiendo que la clave principal es el campo "No."
if CustomerRec.GET('4711') then
 .... // Si existe
else  
 .... // Si no existe

Ademas, existe el metodo GetBySystemId(Guid),

Find()

Fue la primera opcion de busqueda dentro de Navision, segun el parametro que se le pase filtrara de distinta forma

Hoy en dia, no siempre es la forma mas eficaz de buscar datos.

  • FIND(’-’): Busca el primer registro de la tabla. Debe usarse solo.
  • FIND(’+’): Busca el ultimo registro de la tabla. Debe usarse solo.
  • FIND(’=’): Busca el record que sea igual a los valores de la clave principal. Tiene le mismo funcionamiento que un Get()
  • FIND(’>’): Busca un registro mayor que las claves principales
  • FIND(’<’): Busca un registro menor que las claves principales
if CustomerRec.Find('-') then
    repeat
        ...
    until CustomerRec.Next() = 0;
Funciones mas comúnmente usadas:
  • FINDFIRST:Esta funcion recupera unicamente el primer registro de la tabla, teniendo en cuenta los filtros asignados
  • FINDLAST: Esta funcion recupera unicamente el ultimo registro de la tabla. Al igual que el ‘FindFirst()’ tiene en cuenta los filtros.
  • FINDSET: Esta funcion se usara para recorrer todos los registros del Record, teniendo en cuenta los filtros asignados Es la forma mas habitual de hacer un loop
    CustomerRec.SetFilter(Name, 'A*')
    if CustomerRec.FindSet() then
        repeat
            ...
        until CustomerRec.Next() = 0;

Mark()

Usando este método podemos seleccionar los registros que necesitemos.

Una vez marcados puedes usar el método Rec.MarkedOnly() y recorrerlos

CustomerRec.SetRange(Name, NameVar);
if CustomerRec.FindFirst() then
    Customer.Mark(true);

Customer.MarkedOnly(true);
NoAux := Customer.Count();
// NoAux guardara la cantidad de registros marcados en Customer

Filtros


SetRange()

Filtro sencillo, para comparar con un simple valor o rango.

CustomerRec.SetRange(Name, 'Luis');
CustomerRec.SetRange("No.",'10000','90000');
if CustomerRec.FindFirst() then
        ...
SetFilter()

Permite establecer filtros mas completos y especificos, ya que podemos usar expresiones

En las expresiones podemos pasarle las variables usando el “%1”, “%2”…

CustomerRec.SetFilter("No.", '>10000 & <> 20000');
CustomerRec.SetFilter("No.",'>%1&<>%2',Value1, Value2);
if CustomerRec.FindFirst() then
        ...
GetRangeMin & GetRangeMax

Recupera el valor minimo/maximo del rango que se este aplicando en ese campo

BottomValue := Customer.GetRangeMin("No.");
UpperValue := Customer.GetRangeMax("No.");

TIPS


Rec.IsEmpty()

Si solo queremos saber si un rec tiene contenido, la mejor forma sera usar un “Rec.IsEmpty()“

CustomerRec.SetFilter(Name, 'Repuestos Pepe')
if not CustomerRec.IsEmpty() then
    repeat
        ...
    until CustomerRec.Next() = 0;
SetCurrentKey()

Si tenemos un filtro concreto, usando esta funcion podremos optimizar su rendimiento

CustomerRec.SetFilter(Name, 'Repuestos Pepe')
CustomerRec.SetCurrentKey(Name);
if CustomerRec.FindSet() then
    repeat
        ...
    until CustomerRec.Next() = 0;

Todas las funciones de busqueda se pueden complementar con filtros, modificaciones de clave principal y similar.
La diferencia entre unas funciones y otras sera el rendimiento que tengan


Muchas gracias por leerlo!