Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-11-2003
asirvent asirvent is offline
Miembro
 
Registrado: may 2003
Posts: 48
Poder: 0
asirvent Va por buen camino
Unhappy 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
Responder Con Cita
  #2  
Antiguo 13-11-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 14-11-2003
asirvent asirvent is offline
Miembro
 
Registrado: may 2003
Posts: 48
Poder: 0
asirvent Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 14-11-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

Acaso no podes usar parametros en ClientDataSets?
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #5  
Antiguo 17-11-2003
asirvent asirvent is offline
Miembro
 
Registrado: may 2003
Posts: 48
Poder: 0
asirvent Va por buen camino
Question

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
Responder Con Cita
  #6  
Antiguo 18-11-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 18-11-2003
asirvent asirvent is offline
Miembro
 
Registrado: may 2003
Posts: 48
Poder: 0
asirvent Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 18-11-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #9  
Antiguo 19-11-2003
asirvent asirvent is offline
Miembro
 
Registrado: may 2003
Posts: 48
Poder: 0
asirvent Va por buen camino
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
Responder Con Cita
  #10  
Antiguo 20-11-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

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

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #11  
Antiguo 21-11-2003
asirvent asirvent is offline
Miembro
 
Registrado: may 2003
Posts: 48
Poder: 0
asirvent Va por buen camino
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
Responder Con Cita
  #12  
Antiguo 21-11-2003
asirvent asirvent is offline
Miembro
 
Registrado: may 2003
Posts: 48
Poder: 0
asirvent Va por buen camino
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
Responder Con Cita
  #13  
Antiguo 21-11-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #14  
Antiguo 22-11-2003
asirvent asirvent is offline
Miembro
 
Registrado: may 2003
Posts: 48
Poder: 0
asirvent Va por buen camino
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.
Responder Con Cita
  #15  
Antiguo 22-11-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

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



__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #16  
Antiguo 23-11-2003
asirvent asirvent is offline
Miembro
 
Registrado: may 2003
Posts: 48
Poder: 0
asirvent Va por buen camino
eso esta hecho tio, aunque la verdad que son ¿las chelas?...

salu2
Responder Con Cita
  #17  
Antiguo 24-11-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
cheves
birrias

cervezas, pues...

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 01:30:17.


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
Copyright 1996-2007 Club Delphi