Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Filtros en Clientdataset (https://www.clubdelphi.com/foros/showthread.php?t=5215)

asirvent 13-11-2003 11:14:49

Filtros en Clientdataset
 
Hola, tengo una aplicación creada en D6, utilizando dbexpress , y utilizo para acceder a los datos SQLDATASET+DATASETPROVIDER+CLIENTDATASET, el problema viene ya que cuando en el cliente necesito hacer una consulta utilizo un filtro pero este trabaja muy lento (al trabajador con unos 500 registros).

¿A que puede deberse esto?, los filtros yo sabía que eran lentos en BDE ¿pero tb lo son utilizando los clientdatasets?. ¿Que puedo hacer para acelerar las consultas en los clientes?

un saludo

jachguate 13-11-2003 15:55:42

Lo mas eficiente para realizar un filtro, es no hacerlo del lado del cliente, sino del lado del servidor. En otras palabras, en lugar de tener un dataset que haga un

Select * from tabla;

y luego filtrar los que tengan una fecha mayor a la del '1/ene/2003', es mucho mas eficiente tener un dataset que haga:

Select *
from tabla
where fecha > '1/ene/2003'

La eficiencia, por supuesto, dependerá de tu motor de base de datos. Lo que es recomendable en cualquier motor, es tener indices que ayuden a optimizar las consultas de acuerdo a los criterios de busqueda a utilizar.

Hasta luego.

;)

asirvent 14-11-2003 09:23:26

Esa solución que comentas es la que actualmente estoy aplicando, pero de esta forma pierdo la independencia de las 3 capas que utilizo en mi aplicación, por eso comentaba si hay algo que este haciendo mal para q no vaya tan rápido al hacer el filtro, como en la consulta.

un saludo

jachguate 14-11-2003 16:50:37

Acaso no podes usar parametros en ClientDataSets?

asirvent 17-11-2003 09:48:40

Poder, si que puede utilizar parametros, pero el problema bien en que la consulta no siempre utiliza los mismos parametros, ya que unas veces puede ser del tipo:

select * from clientes

...y otras:

select * from clientes where poblacion like '%ali%' and fechaalta>'01/01/2003'

con lo que segun creo yo, en estos casos los parametros no se podrían implementar, ¿o si?...

salu2

jachguate 18-11-2003 09:17:17

si hay un número finito de condiciones, si, de la siguiente forma:

Código:

select *
  from clientes
 where (poblacion like :NombrePoblado or :NombrePoblado is null)
    and (fechaalta > :Fecha or :Fecha is null)
    and (saldo > :SaldoMinimo or :SaldoMinimo is null)
    etc, etc, etc.

Si los parámetros pueden llamarse igual, depende del motor que utilices (en el bde no, porque asigna el valor solamente al primero que encuentra), pero podes llamarlos diferente y asignar el mismo valor.

Hasta luego.

;)

asirvent 18-11-2003 10:26:45

Me parece una solución perfecta para mis consultas, el tema ahora es, ¿Como implemente esto en Firebird?, te lo digo porque al intentar hacer esto que me comentas obtengo el error:

-----Data type unknown----

referenciando a cuando comparo la variable con null.

gracias y un saludo

jachguate 18-11-2003 22:07:20

Enel editor de parámetros del Query, asigna un tipo de dato a cada parámetro. Si lo estas haciendo desde ibConsole, creo que la única forma de hacerlo es usando CAST.

Hasta luego.

;)

asirvent 19-11-2003 10:00:08

Sigue sin funcionarme..., he probado a utilizar la función CAST en la SQL, he probado desde delphi en la query a utilizar un tipo en los parametros y nada, en cuando comparo un parametro de entrada con un valor, me da el error que te comentaba.

¿que hago mal?

salu2

jachguate 20-11-2003 18:42:59

Estas epecificando los tipos de dato de lops parámetros en delphi...??

como has usado el cast?

proba con algo como:

where : parametro = campo or cast(: parametro as integer) = cast(null as integer).

A ver si te tira el mismo error...

hasta luego

;)

asirvent 21-11-2003 09:51:32

Hola, he resolvido el problema, con una variante de lo que tu me comentaste, te explico, si utilizo la forma q tu me comentabas no consiguía obtener ningun registro, por ejemplo:

select * from color_general
where (cog_descripcion like :des) or (:des = cast( null as char(50)))

En cambio si utilizo en lugar de null un valor que yo sepa q nunca se va a dar para la comparación si q funciona bien:

select * from color_general
where (cog_descripcion like :des) or (:des = cast( '@' as char(50)))

o sea que de momento esta resuelto el tema, pq supongo

asirvent 21-11-2003 09:53:16

perdon continuo aquí:

eso supongo q con otros tipos de datos (fecha, numero...) no habrá problemas con las comparaciones.

Pero ¿pq no funciona bien con el null?, es mas que nada por curiosidad pq el problema lo he resulto de la otra manera.

un saludo y muchas gracias

jachguate 21-11-2003 18:18:12

Ya no recuerdo exactamente en interbase pero la solucion que has dado es correcta.

Tambien podes optar por utilizar otro parámetro, que lo haria mas claro, algo como:

Código:

select * from color_general
where (cog_descripcion like :des) or (:todas_las_descripciones = 'S')

y desde delphi, luego hacer:

Código:

  if eDescripcion.Text = '' Then
    Query.ParamByName('todas_las_descripciones').Value := 'S';
  else Begin
    Query.ParamByName('todas_las_descripciones').Value := 'N';
    Query.ParamByName('cog_descripcion').Value := eDescripcion.Text;
  End;

Hasta luego.

;)

asirvent 22-11-2003 12:06:36

Esta solución q comentas no se me habia ocurrido y la verdad me convence más que la que he utilizado yo.

Muchas gracias por tu tiempo y un saludo desde alicante.

jachguate 22-11-2003 17:10:13

Cuando vaya por la Madre Patria... tenes el compromiso de invitarme un par de chelas... jeje

:D

;)

asirvent 23-11-2003 18:13:50

eso esta hecho tio, aunque la verdad que son ¿las chelas?...

salu2

jachguate 24-11-2003 01:06:21

cheves
birrias

cervezas, pues...

Hasta luego.

;)


La franja horaria es GMT +2. Ahora son las 09:17:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi