Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-05-2007
Avatar de carlosegs11
carlosegs11 carlosegs11 is offline
Miembro
 
Registrado: jul 2004
Posts: 41
Poder: 0
carlosegs11 Va por buen camino
Red face Refrescar tabla y consulta

Hola. Tengo una base de datos con aproximadamente 180.000 registros. Ejecuto una consulta SQL una sola vez la cual es demorada.

Necesito que cuando el usuario cree un registro nuevo se actualice en la tabla y en la consulta sin necesidad de volver a hacer la primera consulta (es decir sin hacer query.Close query.Open o query.refresh) debido a que se demora mucho tiempo.

Es posible hacerlo?

Gracias.

Carlos E.
Responder Con Cita
  #2  
Antiguo 07-05-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
No se que base de datos usas, pero una consulta bien hecha deberia tardar uno cuandos segundos.
Tengo tablas con mas de esos registros y las consultas son muy rapidas.
Lo que si alenta mucho la cosa es el uso de refrech, no lo creo necesario.
Saludos
Responder Con Cita
  #3  
Antiguo 07-05-2007
Avatar de carlosegs11
carlosegs11 carlosegs11 is offline
Miembro
 
Registrado: jul 2004
Posts: 41
Poder: 0
carlosegs11 Va por buen camino
Uso bases de datos .dbf y las acceso con un componente de ADS (Advantage Database Server). Pero la consulta es lenta.

Gracias.
Responder Con Cita
  #4  
Antiguo 07-05-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
¿realmente hay necesidad de mostrar 180,000?
__________________

Responder Con Cita
  #5  
Antiguo 07-05-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola Contra Veneno.
De hecho, es precisamente lo que pienso, ni siquiera caben en la pantalla.
Las consultas se hacen en rangos de 25 o 50, 180000, me parece algo raro.
Saludos
Responder Con Cita
  #6  
Antiguo 07-05-2007
Avatar de carlosegs11
carlosegs11 carlosegs11 is offline
Miembro
 
Registrado: jul 2004
Posts: 41
Poder: 0
carlosegs11 Va por buen camino
De pronto no me he explicado bien. Tengo una tabla donde estas todas las facturas de los clientes (registros positivos) y los pagos (registros negativos). Cuando un cliente desea pagar una factura, hago la consulta en la tabla que tiene 180.000 registros para filtrar el cliente y a su vez esta consulta debe cruzar las facturas vs. los pagos para mostrarme que facturas debe el cliente. En este caso solo muestra lo que debe el cliente, las que estan pagas no las muestra.

Si deseo consultar otro cliente debo volver a correr la misma consulta otra vez pero con parámetros diferentes, en este caso la cédula.

Si esta consulta la hago mediante un procedimiento estructurado sin SQL y trabajando índices es rápida. Pero si lo hago mediante SQL es mucho mas lenta.

Lo que quiero es poder agilizar mi consulta. Será que me falta utilizar indices en la consulta SQL o el procedimiento que realizo no es el adecuado?

Gracias por sus respuestas.

Carlos E.
Responder Con Cita
  #7  
Antiguo 07-05-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Es un poco dificil entender el como lo haces sin ver el codigo sql que usas para mostrar la consulta.
La verdad no creo que tenga mucho peso esto de los indices, abria que ver primero que estas haciendo y como.
Indicanos:
Tipo de base de datos.
Componentes que usas.
Codigo sql que llama la consulta.
Y por partes veremos que pasa.
Saludos
Responder Con Cita
  #8  
Antiguo 07-05-2007
Avatar de carlosegs11
carlosegs11 carlosegs11 is offline
Miembro
 
Registrado: jul 2004
Posts: 41
Poder: 0
carlosegs11 Va por buen camino
Muchas gracias por tu pronta respuesta.

Tipo de base de datos: tabla.dbf
Componentes que utilizo: TAdsQuery

Codigo de la consulta:

sqlFactura.SQL.Clear;
sqlFactura.SQL.Add('SELECT numefact AS Factura, sum(valor) AS Valor,
fechinivig AS Inicio_Vigencia, fechfinvig AS Fin_Vigencia');
sqlFactura.SQL.Add('FROM factura');
sqlFactura.SQL.Add('GROUP BY cedula, numefact, fechinivig, fechfinvig,
compania, producto');
sqlFactura.SQL.Add('HAVING ((cedula = :sCedula) and (sum(valor) <> 0) and (compania = :sCompania) and (producto = :sProducto))');
sqlFactura.SQL.Add('ORDER BY cedula, fechinivig');
sqlFactura.ParamByName('sCedula').AsString := F_Recaudos.eCedula.Text;
sqlFactura.ParamByName('sCompania').AsString := F_Recaudos.cbxCompania.Text;
sqlFactura.ParamByName('sProducto').AsString := F_Recaudos.cbxProducto.Text;
sqlFactura.Open;

Carlos E.
Responder Con Cita
  #9  
Antiguo 07-05-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
La verdad sigo intrigado, para mi es una consulta sencilla a una tabla (factura), pidiendo que siga ciertos parametros.
Código Delphi [-]
sqlFactura.SQL.Clear;
sqlFactura.SQL.Text 'SELECT numefact AS Factura, sum(valor) AS Valor,'+
                   'fechinivig AS Inicio_Vigencia, fechfinvig AS Fin_Vigencia' +
                   'FROM factura' +
                   'GROUP BY cedula, numefact, fechinivig, fechfinvig,'+
                   'compania, producto' +                                             
                   'WHERE cedula = :sCedula and sum(valor) <> 0 and compania ='+     
                   ':sCompania and producto = :sProducto' +
                   'ORDER BY cedula, fechinivig' +
sqlFactura.ParamByName('sCedula').AsString := F_Recaudos.eCedula.Text;
sqlFactura.ParamByName('sCompania').AsString := F_Recaudos.cbxCompania.Text;
sqlFactura.ParamByName('sProducto').AsString := F_Recaudos.cbxProducto.Text;
sqlFactura.Open;
Perdona que la alla puesto asi, pero me resulta mas facil leerla, se hace un solo bloque.
La opcion HAVING en algunos casos me ha alentado consultas.
No se porque se te alenta esta sentencia, la verdad lo desconozco.
Saludos
Responder Con Cita
  #10  
Antiguo 07-05-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Perdon (trate de editarlo pero no pude, se borra lo bonito) creo que va asi:
Código Delphi [-]
sqlFactura.SQL.Clear;
sqlFactura.SQL.Text 'SELECT numefact AS Factura, sum(valor) AS Valor,'+
                   'fechinivig AS Inicio_Vigencia, fechfinvig AS Fin_Vigencia' +
                   'FROM factura' +
                   'WHERE cedula = :sCedula and sum(valor) <> 0 and compania ='+     
                   ':sCompania and producto = :sProducto' +
                   'GROUP BY cedula, numefact, fechinivig, fechfinvig,'+
                   'compania, producto' +                                             
                   'ORDER BY cedula, fechinivig' +
sqlFactura.ParamByName('sCedula').AsString := F_Recaudos.eCedula.Text;
sqlFactura.ParamByName('sCompania').AsString := F_Recaudos.cbxCompania.Text;
sqlFactura.ParamByName('sProducto').AsString := F_Recaudos.cbxProducto.Text;
sqlFactura.Open;
El where antes del group by.
En el caso del having si es correcta la posicion.
Saludos
Responder Con Cita
  #11  
Antiguo 07-05-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Me estoy haciendo viejo, cada vez veo menos:
Código Delphi [-]
sqlFactura.SQL.Clear;
sqlFactura.SQL.Text:= 'SELECT numefact AS Factura, sum(valor) AS Valor,'+
                   'fechinivig AS Inicio_Vigencia, fechfinvig AS Fin_Vigencia' +
                   'FROM factura' +
                   'WHERE cedula = :sCedula and sum(valor) <> 0 and compania ='+     
                   ':sCompania and producto = :sProducto' +
                   'GROUP BY cedula, numefact, fechinivig, fechfinvig,'+
                   'compania, producto' +                                             
                   'ORDER BY cedula, fechinivig' +
sqlFactura.ParamByName('sCedula').AsString := F_Recaudos.eCedula.Text;
sqlFactura.ParamByName('sCompania').AsString := F_Recaudos.cbxCompania.Text;
sqlFactura.ParamByName('sProducto').AsString := F_Recaudos.cbxProducto.Text;
sqlFactura.Open;
Saludos
Responder Con Cita
  #12  
Antiguo 08-05-2007
Avatar de carlosegs11
carlosegs11 carlosegs11 is offline
Miembro
 
Registrado: jul 2004
Posts: 41
Poder: 0
carlosegs11 Va por buen camino
Ok. Gracias por todo. Estoy mirando la opción de procedimientos almacenados para ver si mejora el rendimiento.

Carlos E.
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
Actualizar o Refrescar una Tabla Caral Tablas planas 2 20-02-2007 20:12:17
Actualizar una tabla con una consulta de otra tabla JODELSA SQL 2 14-09-2006 04:07:01
Paso de una consulta a tabla Alexander Conexión con bases de datos 1 07-05-2005 02:12:29
Refrescar rejilla en una consulta con order by fjolivares Conexión con bases de datos 0 06-04-2004 17:02:00
Refrescar consulta negama SQL 2 05-09-2003 15:45:39


La franja horaria es GMT +2. Ahora son las 09:02:03.


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