PDA

Ver la Versión Completa : filtrar con DbLookupComboBox


Walterdf
05-08-2003, 22:06:46
Hola a todos
Voy a poner un ejemplo sencillo de lo que realmente quiero hacer, supongamos que tengo una base en paradox, con los campos:

A, B, C, D, E y F

y utilizo un form con varios dbedit para visulizar los datos.

Ahora bien, quiero realizar un procedimiento de búsqueda abriendo otro form con varios dblookupcombobox (uno para cada campo)

Quiero que el usuario busque por cualquier de ellos, por ejemplo, que clickee en E, se despliegue la lista (sin duplicados), seleccione un registro, luego se le ocurre clickear en B seleccionar otro y así sucesivamente pero en ningún orden. Puede ser por un campo, por dos o por todos. Una vez que el usuario selecciona lo que quiere clickea en un botón que toma el text de los dblookupcombobox y filtra una query para luego mostrar los resultados en el form principal.

Yo hice algo mediante SQL y funciona siempre y cuando siga un orden al seleccionar y ademas se está haciendo algo enorme.

Bueno, espero que se haya entendido lo que deseo hacer y porfavor, si alguien puede ayudarme y decirme como encararía algo así se lo voy a agradecer mucho.

Cabanyaler
06-08-2003, 10:38:31
Hola, puedes crearte la sql en tiempo de ejecución, y a los eventos de cambio del contenido de los desplegables recomponer y ejecutar la sql comprobando si el contenido de los desplegables es blanco o no. Si es blanco no añades la linea de comparación con ese contendio para hacer el filtro y si es <> del blanco la añades.
Posteriormente deberas de crearte la lista de parametros también con su naturaleza.
Te añadiría de programas viejos (cuando trabajaba con paradox) alguna estructura de este tipo, pero tampoco quiero hacer demasiado largo este mensaje. Si te es necesario de forma imprescindible, te lo anexo.
Un saludo y suerte.

Walterdf
06-08-2003, 13:30:44
Antes que nada muchas gracias por responder mi mensaje.
Mira, si bien ya he hecho algunas aplicaciones en Delphi y con bases de datos, no soy experto en esto, recien comienzo y no logro darme cuenta de algunas cosas como realizar sql en tiempo de ejecución. Quisiera que porfavor me expliques un poco más como lo hago y si es posible y no es mucha molestia para vos que me anexes alguna de esas estructuras, si querés podes enviarmelo por mail a walter@rodamet.com , aunque si lo pones en el foro podría serle de utilidad a alguna otra persona.
Un saludo y gracias nuevamente.
Walter

Cabanyaler
07-08-2003, 09:05:04
Bueno, vamos allá.

Es un tanto royo, pero funciona.


// Limpio la lista de STRING que pudiese existir
Query.SQL.Clear;

// Compongo la SQL en su cuerpo principal
Query.SQL.Add('SELECT RO.NumOrd_RegOfe,RO.Varord_RegOfe,RO.Estado_RegOfe,');
Query.SQL.Add('RO.AnyoReg_RegOfe,RO.TitOfe_regOfe,RO.NomCli_RegOfe,RO.NumObr_RegOfe,');
Query.SQL.Add('RO.FecOfe_RegOfe,RO.FecCon_RegOfe,RO.ImpCon_RegOfe,RO.ImpOfe_RegOfe,');
Query.SQL.Add('RO.DesAct_RegOfe');
Query.SQL.Add('FROM RegOfertas RO');
Query.SQL.Add('WHERE');
Query.SQL.Add('(RO.FecCon_RegOfe >= :EditFechaInicio)');
Query.SQL.Add('AND');
Query.SQL.Add('(RO.FecCon_RegOfe <= :EditFechaFinal)');

/* Aqui es donde empiezas como tu quieres a realizar a medida dicha SQl dependiendo de algunos valores
de los Edits */

// Compruebo que tengan valor los edits y lo meto en la SQL
// ya que establecer estos otros parametros es opcional al usuario
// En este caso compruebo hasta el contenido de 4 edits

if EditApenom_cli.text <> '' then
begin
Query.SQL.Add('AND');
Query.SQL.Add('(RO.NomCli_RegOfe LIKE ("%' + EditApenom_cli.text + '%"))');
end;

if EditTitulo.text <> '' then
begin
Query.SQL.Add('AND');
Query.SQL.Add('(RegOfertas.TitOfe_RegOfe LIKE ("%' + EditTitulo.text + '%"))');
end;

if EditEstOfer.text <> '' then
begin
Query.SQL.Add('AND');
Query.SQL.Add('(RegOfertas.Estado_RegOfe LIKE ("%' + EditEstOfer.text + '%"))');
end;

if EditDesActividad.text <> '' then
begin
Query.SQL.Add('AND');
Query.SQL.Add('(RegOfertas.DesAct_RegOfe LIKE ("%' + EditDesActividad.text + '%"))');
end;

// Abro la consulta una vez establecida la String de la SQL
Query.Open;


La propiedad del dataset Query.ParamCheck la estableces a False.

Creo que con esto te funcionará, espero no haber olvidado nada.

Suerte.:o

CORBATIN
07-08-2003, 22:06:17
Hola a todos, solo una aclaración, después de inciar unas comillas deja espacio en blanco, en caso contrario se va añadir todo unido y no sirve.

Normalmente lo que yo hago es dejar el espacio en blanco al final, ejemplo:
query1.sql.add('esto es un ejemplo ');
query1.sql.add('ahora va bien ');

Walterdf
11-08-2003, 13:29:09
Muchísimas gracias por tu ayuda Cabanyaler por responderme pero no logré lo que necesitaba ya que los datos me los sigue mostrando con duplicados.
Saludos y gracias nuevamente.
Walter

CORBATIN
11-08-2003, 15:55:25
Eso es lo que pasa cuando se sacan datos de varias tablas con algún campo en común y no se igualan dichos campos ejemplo:
Tenemos la tabla mia con campos: id,nombre,errores.
Tenemos la tabla tuya con campos:num,dato,id.

Al hacer una consulta usando estas dos tablas se debería hacer esto con los campos iguales:

select mia.*, tuya.dato
from mia,tuya
where mia.id = tuya.id

De esta forma no te dupica los datos.

Pero por lo que veo, en esta consulta solo utilizas una tabla. Prueba a poner después del Select la palabra "distinct" o "distinct row", espero que te sirva.

Con respecto a añadir código SQL no hace falta escribir tantas veces la propiedad add del query:

antes:
query1.sql.add('tengo que hacer muchas cosas ');
query1.sql.add('y todas son para hoy');

ahora:
query1.sql.add('tengo que hacer muchas cosas '+
'y todas son para hoy');

Y por último es mejor acceder a los parámetros de una query a través de la propiedad params ejemplo:

antes:
query1.parambyname('campo').asinteger;
en este código necesita acceder a este campo y debe buscar la referencia escrita para saber que parámetro es.

ahora:
query1.params[0] := mydato.//no estoy seguro si la propiedad se llamaba así o algo parameters.
De esta forma sabe directamente a qué parámetro estamos haciendo referencia y funcionará un poquito más rápido.

En la ayuda vienen varios ejemplos de esto, te aconsejo que la miras ya que no estoy muy seguro si el nombre de la propiedad es ese, además de no acordarme si después había que decir el tipo del parámetro con "asintegero asString".

Saludos.

Walterdf
11-08-2003, 16:17:33
Hola Corbatin, muchas gracias por tu ayuda. Quería decirte que cuando selecionas varios campos de una misma tabla no puedes usar el Select distinct porque no funciona, solo hace efecto cuando seleccionas 1 solo campo.
Gracias nuevamente.
Un abrazo.
Walter