PDA

Ver la Versión Completa : ¿como usar OnFilterRecord? (para un filtro x nombre)


amadis
29-04-2006, 22:52:14
Que tal Gente.

Hace tiempo he posteado preguntando como filtrar o hacer locate sobre campos calculados (lookup) (en este caso nombres de clientes en una tabla con sus codigos y en otra tabla, en la que deseo filtrar numeros de cliente y otros datos de servicios que tiene ese cliente)

Habia solucionado todo trabajando con los ClientDataSet pero a medida que los registros crecen se hace sumamente lento (corriendo en un P4 2.4 512mb)

Si aplico un filtro sobre la tabla serviciosyclientes, en el campo cliente que es un String lookup tomado de la tabla cliente con su codigo me acusa error.
Lo mismo si hago un locate en el mismo campo.


Asi que buscando en el foro encontre que para busquedas avanzadas se usa OnFilterRecord pero no he logrado lo que quiero, mas bien no se usarlo.

Lo que yo necesito es filtrar la tabla serviciosyclientes (que esta conectada a un DBgrid )y mostrar allí solo los resultados del filtro.

Criterio de busqueda --> POR NOMBRE en un Edit y la idea es que en cada OnChange del Edit vaya actualizando el filtro. para lo cual en onchange puse FILTER:= false; y luego lo paso a true.

Pero no me muestra nada en la Grilla.

Abajo adjunto el codigo que en mi ignorancia armé.


procedure serviciosyclientes, FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
var
nombre: String;
begin

nombre := Edcli.text + '*';
Accept := Dataset['Cliente'] = QuotedStr(nombre);
{ Cliente es el campo String calculado mediante el campo codcli de la tabla actual sobre el campo codigo de la tabla clientes]

end;



Les agradecería su ayuda, comentarios o cualquier orientacion que me puedan dar.

Cualquier forma de filtrar un lookup sera bien recibida

Gracias

Amadís

-------------------------------------
NO A LAS FABRICAS DE CELULOSA

Delfino
30-04-2006, 23:13:12
Prueba esto:
Accept := (Dataset['Cliente'] = QuotedStr(nombre));

agregando los parentesis..

olbeup
30-04-2006, 23:27:57
Hola amadis,

El OnFilterRecord, no tiene que deactivar el Filtred y volverlo activar por lo hace solo.

El porque tarda tanto cuando cambias o borras algo, por que tiene que volver a filtrar de nuevo toda la base de datos desde el principio del DBGRID, si tiene un DBGRID de 30 registros tiene que entrar 30 veces en OnFilterRecord para que cada registro que filtra cumpla con lo que le has filtrado.

Un Saludo.

Delfino
30-04-2006, 23:51:01
El OnFilterRecord, no tiene que deactivar el Filtred y volverlo activar por lo hace solo.

Esto no es cierto, el evento se dispara cuando se pone la propiedad Filtered a True..

NestorN
01-05-2006, 04:52:26
Hola proba con este codigo a mi me funciona como filtro, espero que a vos tambien saludos.

clientes.Filter:= 'country ='+ Quotedstr(combo.Text);{Utiliso un combobox para poner las opciones pero seguramente con otros componentes debe funcionar}
clientes.Filtered:=true


Bueno espero tu repuesta para ver si te ayudo.

Saludos

amadis
02-05-2006, 21:45:24
Probé agregandole el parentesis pero no funciona.

Al filtrar no muestra nada o sea no obtiene resultados.

Recuerden que ese campo cliente es un String calculado

Ya comienzo a creer que esto no tiene solucion.

Hace tiempo habia tenido los mismos problemas intentando un Locate sobre ese campo y no pude solucionarlo.

Gracias!

Lepe
03-05-2006, 09:49:30
Los filtros se aplican del lado del cliente, así que siempre consumirá mas recursos que una consulta al servidor.

Es más fácil y rápido hacer una consulta al servidor, pero no en el evento OnChange, sino cuando el usuario pulse la tecla Enter en el Edit (que no cuesta tanto ;)).

Es muy bonito cuando vas pulsando teclas y ves como cambian los datos, pero tecleando rápido.... da igual que sea un AMD 3500 Mhz, con 5000 registros se vé lo lento que es el sistema, por el filtro, y por la "comodidad" de ver los datos cambiar.

Yo veo más eficiente y rápido que el usuario escriba con libertad y al pulsar intro, se lance la consulta, haga un inner join de las tablas y se aplique las restricciones con un "WHERE".

select c.*, s.*
from clientes c inner join servicios s on c.codcliente = s.idcliente
where c.nombreCliente like : prNombre


query1.parambyname('prNombre':= '%'+ edCli.Text + '%';
query1.open;


Saludos

amadis
04-05-2006, 03:56:51
Mas alla del OnChange o el Enter en el Edit

Por lo que veo o no se puede filtrar sobre un lookup o es muy complejo.

La razon por la que me rehuso a usar sql es porque mientras tengo la tabla filtrada yo uso las funciones, de la tabla edit, post, next, prior, first, last. etc. para seguir con el alta y baja de datos inclusive estando la tabla filtrada.

Pero con SQL eso ya es complicarme mas la vida creo.

Lepe
04-05-2006, 18:32:24
Pues no.

Asociando un dbnavigator a una consulta te mueves exactamente igual que hasta ahora.

Para hacer los Edit etc, si solo rescatas datos de una tabla, tambien se puede hacer con la misma facilidad que hasta ahora.

Saludos