Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-02-2014
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Datos de un query remoto cargados en un dblookupcombobox lento

Hola.
Se que debo de estar haciendo algo muy mal, y tambien se que hacer un select * from table es un suicidio.

Vereis tengo un query de compras y un query de clientes.
Los dos relacionados en un dbgrid de compras donde va el codigo de cliente y visualiza el nombre del query clientes. Algo que creo normal.
Esto esta filtrado por mes.
Por el otro lado, cuando se genera una nueva compra, el usuario puede elegir de entre todos los clientes almacenados en el dblookupcombobox, de ahi que se carguen todos al principio.

Ya habiais comentado en otro post que a vosotros no os va lenta las aplicaciones aunque las conexiones de los usuarios no sean muy buenas.

La pregunta, porque no se me ocurre nada, es si hay otra forma de no tener q cargar toda la tabla de clientes y si hay otra forma de que el dbgrid solo pida los clientes que salen en el filtro.

La verdad ya me perdi

Gracias y mis disculpas sino se entendio bien.
Responder Con Cita
  #2  
Antiguo 06-02-2014
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
prueba con mandar los nombres de las tablas y sus campos, además enviar el query que usas, y decir de ese query que campos usas para algo... también di con que componente haces los querys... ibx, dbx?
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #3  
Antiguo 07-02-2014
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Hola,
Estoy usando zeos para los componentes en lazarus.

La tabla principal es compras

compras
--------
idautoincremental integer
fecha
numero de compra consecutivo
clavecuenta integer
clavecliente integer
concepto blob

cuentas
--------
clavecuenta integer autoincremental
nombrecuenta varchar

cliente
------
clavecliente integer autoincremental
nombrecliente blob
fechaalta

a grosso modo es lo basico (el autoincremental en firebird no lo hay pero esta con generadores)

en el dbgrid uso el query clientes y relaciono la clavecuenta con el query cuentas, y clavecliente con clientes para convertir el numero a nombre en un campo calculado.

Tambien hay un filtro que puedo consultar los clientes eligiendo desde un dblookupcombobox y sale toda la lista.

En lineas generales nose como puedo hacer que el dbgrid saque solo los nombres de clientes que estan dentro del mes, asi no tengo que leer toda la tabla.de clientes, pero no se me ocurre.

se que con filtros nos podemos ahorrar mucho trabajo innecesario porque no vamos a usar todo.

Y la otra parte, que seria elegir de un dblookupcombobox todos los clientes, seria mas facil saber la clave e introducirla, seria lo mas logico, mas practico y mas rapido.

Tambien tengo un filtro en sql con un like, que, a medida que vamos poniendo letras que conforman el nombre del cliente, (pongo una letra y busca, añado otra y busca, etc) va reduciendo la cantidad de registros, pero tambien se necesita leer toda la tabla principalmente. Esto esta muyh bien cuando es dentro de una red local y con pocos registros, pero imagino que a medida que va engordando la tabla, acabara tambien tardando mas.

las tablas que os he puesto son reducidas a ver si me entero un poco con menos campos.

No se si estos ejemplos sirven de algo para sacar algo en limpio.

y gracias por contestar.
Responder Con Cita
  #4  
Antiguo 07-02-2014
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Cita:
En lineas generales nose como puedo hacer que el dbgrid saque solo los nombres de clientes que estan dentro del mes, asi no tengo que leer toda la tabla.de clientes, pero no se me ocurre.

A mi se me ocurre un query similar a el siguiente:
Código SQL [-]
select con.fecha,
con.numero_de_compra, cue.nombrecuenta, cli.nombrecliente
concepto as con
inner join cuentas as cue on cue.clavecuenta = con.clavecuenta 
inner join cliente as cli on cli.clavecliente = con.clavecliente 
where con.fecha between :f1 and :f2

En delphi debería hacer algo como:
Código Delphi [-]
QClientesXCuentaEntreFechas.Close;
QClientesXCuentaEntreFechas.parambyname('f1').asdate := dtpFechaInicial.Date;
QClientesXCuentaEntreFechas.parambyname('f2').asdate := dtpFechaFinal.Date;
QClientesXCuentaEntreFechas.Open;


Particularmente no me gusta usar dblookupcombobox, prefiero usar combobox y agregar en un procedimiento de delphi el id (clave principal de la tabla) como un objeto del combobox (consulta sobre ComboBox.Items.AddObjec)

Cita:
Tambien tengo un filtro en sql con un like, que, a medida que vamos poniendo letras que conforman el nombre del cliente, (pongo una letra y busca, añado otra y busca, etc) va reduciendo la cantidad de registros, pero tambien se necesita leer toda la tabla principalmente. Esto esta muyh bien cuando es dentro de una red local y con pocos registros, pero imagino que a medida que va engordando la tabla, acabara tambien tardando mas.
Si tardará más, pero no tanto por hacer la consulta, más bien por regresar los resultados por medio de la red, lo que puedes hacer es solo hacer la consulta cuando tengas en el Edit (me imagino que es donde van escribiendo el nombre que luego mandaran como parámetro al like) por lo menos un0s 4 o 5 caracteres, si el tamaño es menor que solo regrese resultados por medio de hacer click en un boton buscar o algo así, de esta forma te aseguras no estar haciendo una consulta que traiga muchos resultados como lo es hacer un like a una sola letra
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #5  
Antiguo 08-02-2014
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
hola,

si, tienes razon, con un join si podria ser, el problema es que para utilizar el query de clientes, tengo que tener activo el query de compras y clientes, si activo el primero, me dice que que el query esta vacio (por el de clientes), o que hago mal

Código Delphi [-]

sql1:=select * from tcompras inner join tclientes on claveclientecompras=clavecliente where EXTRACT(MONTH FROM cfecha)=:mes1 and EXTRACT(YEAR FROM cfecha)=:anos1  and ccuenta=:cuenta2;
modulodatos.zcompras.close;
modulodatos.Zcompras.sql.clear;
   modulodatos.Zcompras.sql.text:=sql1;
   modulodatos.Zcompras.parambyname('MES1').asstring:=ceros; //ceros lo saca de un combobox de meses
   modulodatos.Zcompras.parambyname('anos1').asstring:=inttostr(Spinannos.Value); //ano1 lo saca de un spinnanos.value que da el año.
modulodatos.Zcompras.ParamByName('cuenta2').asinteger:=filtrarcuenta;
    modulodatos.Zcompras.active:=true;
    modulodatos.zclientes.Active:=true;
Asi lo he estado usando pero con una tabla teniendo las otra abiertas, en este caso, solo tengo cerrada la de clientes.

Alguna idea cual fue primero el huevo o la gallina?
Responder Con Cita
  #6  
Antiguo 08-02-2014
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Pues lo primero que haría es ver el query en una herramienta como el ibexpert o el databBaseWrockBech, en uno de estos ir haciendo la consulta en la misma base de datos que se conecta desde delphi, agregando uno por uno los diversos filtros (primero hacer una consulta sola con el inner join, despues poner una sola condición despues del where e ir aumentando de a uno)

Ya luego cuando estés seguro que el query si regresa información pasar a hacer pruebas en Delphi, teniendo como premisa que siempre que cambies el query antes de probarlo en delphi primero se debe probar directamente sobre la base de datos como el punto anterior.
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #7  
Antiguo 08-02-2014
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
si, es correcto.

Me funciona la sentencia sql en flamerobin por ejemplo, pero cuando se hace en lazarus, me dice que el query esta vacio.

si con el select del primer query tengo que activarlo el segundo donde se activa?
Responder Con Cita
  #8  
Antiguo 08-02-2014
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
No uses Active, prueba con:
Código Delphi [-]
modulodatos.Zcompras.Open;


Respecto a:
Código Delphi [-]
modulodatos.zclientes.Active:=true;

En donde le asignas el query a zclientes?
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #9  
Antiguo 09-02-2014
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
el query compras esta bien pero el de clientes es el que no me funciona, dice que esta vacio.
Responder Con Cita
  #10  
Antiguo 09-02-2014
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Pues es que en el código que envías se nota que le hace falta agregarle una consulta de una forma similar a como lo haces en
Código Delphi [-]
sql1:=select * from tcompras inner join tclientes on claveclientecompras=clavecliente where EXTRACT(MONTH FROM cfecha)=:mes1 
                                                              and EXTRACT(YEAR FROM cfecha)=:anos1  and ccuenta=:cuenta2; 
modulodatos.zcompras.close; 
modulodatos.Zcompras.sql.clear;    
modulodatos.Zcompras.sql.text:=sql1;

Acá por eso pregunto en donde haces algo similar pero a zclientes, ya que la consulta sql1 solo se usa en zcompras y hace falta una para xclientes un proceso similar, así:
Código Delphi [-]
sql2 = select * from tclientes where nombre like'%' || :nombre || '%';
modulodatos.zclientes.close; 
modulodatos.zclientes.sql.clear; 
modulodatos.zclientes.sql.text:=sql2;
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Insert masivo de datos, cada vez mas lento papote654 MS SQL Server 14 16-05-2012 18:02:17
Truncar campo de Tabla con Datos cargados??? ungrande87 Firebird e Interbase 16 28-02-2012 15:02:44
como pasar datos de un DBLookupComboBox a otro DBLookupComboBox francodelphi Conexión con bases de datos 3 30-11-2011 21:02:34
Procedure en Firebird lento o IbQuery lento capo979 Firebird e Interbase 14 17-07-2007 21:35:36
Barridos de Base de Datos Lento jmedina Conexión con bases de datos 3 16-08-2004 01:40:38


La franja horaria es GMT +2. Ahora son las 19:14:59.


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