Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Refrescar tabla y consulta (https://www.clubdelphi.com/foros/showthread.php?t=43282)

carlosegs11 07-05-2007 19:46:46

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.

Caral 07-05-2007 19:55:49

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

carlosegs11 07-05-2007 20:02:56

Uso bases de datos .dbf y las acceso con un componente de ADS (Advantage Database Server). Pero la consulta es lenta.

Gracias.

ContraVeneno 07-05-2007 20:22:47

¿realmente hay necesidad de mostrar 180,000?

Caral 07-05-2007 20:25:07

Hola Contra Veneno.
De hecho, es precisamente lo que pienso, ni siquiera caben en la pantalla.:D
Las consultas se hacen en rangos de 25 o 50, 180000, me parece algo raro.
Saludos

carlosegs11 07-05-2007 21:54:19

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.

Caral 07-05-2007 22:08:57

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

carlosegs11 07-05-2007 22:32:53

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.

Caral 07-05-2007 22:55:28

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

Caral 07-05-2007 23:04:47

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

Caral 07-05-2007 23:33:41

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

carlosegs11 08-05-2007 19:40:53

Ok. Gracias por todo. Estoy mirando la opción de procedimientos almacenados para ver si mejora el rendimiento.

Carlos E. :D


La franja horaria es GMT +2. Ahora son las 00:39:45.

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