Filtros mediante DbLookupComboBox

Mi nombre es Walter y antes que nada muchas gracias por tu atención.
Tengo el sig.problema, voy a dar un ejemplo sencillo de lo que realmente quiero hacer para que sea un poco más comprensible.
Tengo una aplicación (Delphi 6) que maneja una base de datos Paradox, y supongamos que tengo los sig.campos:
Marca, modelo, motor y combustible
En un form principal se visualizan todos los datos de esa base y pulsando un botón se accede a otro form con un dblookupcombobox para cada campo, lo que quiero hacer es que el usuario busque por cualquiera de los campos y en cualquier orden seleccionando el dato de la lista (sin duplicados), por ejemplo: que clickee en COMBUSTIBLE y seleccione de la lista el registro NAFTA, luego que vaya a MODELO y que al desplegarlo me muestre los modelos existentes coincidiendo con COMBUSTIBLE = NAFTA y así sucesivamente. Logré hacer algo mediante SQL pero se me complicó muchísimo. Si podes darme un consejo de como encarar esto te lo agradeceré.

1 Respuesta

Respuesta
1
Siento la tardanza por la respuesta. Podrías hacer lo siguiente:
Tienes 4 lookups que pueden tener valor o estar nulos. Centraliza en un solo evento genérico el evento CloseUp de los 4 y desde allí haz una llamada a una función del módulo de datos que pase como parámetros los 4 valores de los lookup (definidos como variant) y devuelva 4 parámetros tipo Dataset que son los que por código modificaremos en la property Dataset de los componentes Datasource.
Esta misma función la llamaremos en el create o show del form para que los lookup tengan valores para seleccionar.
Ejemplo de llamada:
Procedure CloseUpGenerico(sender : TObject);
var
ds1, ds2, ds3, ds4 : TDataset;
begin
dmGeneral.GetDatasetsFiltrados(DBLookUP1.KeyValue, DBLookUP2.KeyValue, DBLookUP3.KeyValue, DBLookUP4.KeyValue, ds1, ds2, ds3, ds4);
if Assigned(ds1) then
Datasource1.Dataset := ds1;
if Assigned(ds2) then
Datasource2.Dataset := ds2;
if Assigned(ds3) then
Datasource3.Dataset := ds3;
if Assigned(ds4) then
Datasource4.Dataset := ds4;
end;
Ejemplo definición de la función en el módulo de datos (dmGeneral):
Procedure GetDatasetsFiltrados(Valor1, Valor2, Valor3, Valor4 : Variant; var ds1 : TDataset; var ds2 : TDataset; var ds3 : TDataset; var ds4 : TDataset);
var
Param1, Param2, Param3, Param4 : String;
begin
If VarIsNull(Valor1) then Param1 := '%' else Param1 := VarToStr(Valor1);
If VarIsNull(Valor2) then Param2 := '%' else Param2 := VarToStr(Valor2);
If VarIsNull(Valor3) then Param3 := '%' else Param3 := VarToStr(Valor3);
If VarIsNull(Valor4) then Param4 := '%' else Param4 := VarToStr(Valor4);
//Obtenemos los datasets
query1.Parambyname('param1').AsString := param1;
query1.Parambyname('param2').AsString := param2;
query1.Parambyname('param3').AsString := param3;
query1.Parambyname('param4').AsString := param4;
try
query1.open;
except
//error
end;
ds1 := query1;
query2.Parambyname('param1').AsString := param1;
query2.Parambyname('param2').AsString := param2;
query2.Parambyname('param3').AsString := param3;
query2.Parambyname('param4').AsString := param4;
try
query2.open;
except
//error
end;
ds2 := query2;
query3.Parambyname('param1').AsString := param1;
query3.Parambyname('param2').AsString := param2;
query3.Parambyname('param3').AsString := param3;
query3.Parambyname('param4').AsString := param4;
try
query3.open;
except
//error
end;
ds3 := query3;
query4.Parambyname('param1').AsString := param1;
query4.Parambyname('param2').AsString := param2;
query4.Parambyname('param3').AsString := param3;
query4.Parambyname('param4').AsString := param4;
try
query4.open;
except
//error
end;
ds4 := query4;
end;
Las querys obtienen los campos que nos interesa sin duplicados y filtrados por los 4 parámetros. Utilizamos el like para obtener todos en el caso de que venga null algún parámetro (% = todos) de la manera:
SELECT DISTINCT MARCA FROM TABLA
WHERE
MARCA LIKE :param1 AND MODELO LIKE :param2 AND MOTOR LIKE :param3 AND COMBUSTIBLE LIKE :param4
SELECT DISTINCT MODELO FROM TABLA
WHERE
MARCA LIKE :param1 AND MODELO LIKE :param2 AND MOTOR LIKE :param3 AND COMBUSTIBLE LIKE :param4
SELECT DISTINCT MOTOR FROM TABLA
WHERE
MARCA LIKE :param1 AND MODELO LIKE :param2 AND MOTOR LIKE :param3 AND COMBUSTIBLE LIKE :param4
SELECT DISTINCT COMBUSTIBLE FROM TABLA
WHERE
MARCA LIKE :param1 AND MODELO LIKE :param2 AND MOTOR LIKE :param3 AND COMBUSTIBLE LIKE :param4
Esta es una manera que te propongo, quizá tengas otra mejor, si es así expónla.
Puede que haya algo que no funcione a la primera ya que lo he escrito sin el Delphi delante, serán minucias. Seguramente tengas que hacer un uses Variants según tu versión de Delphi.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas