Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Ayuda Urgente, Por favor. Tarda mucho en traer los datos. (https://www.clubdelphi.com/foros/showthread.php?t=43919)

Paradiso 24-05-2007 00:00:32

Ayuda Urgente, Por favor. Tarda mucho en traer los datos.
 
Hola a todos.
Seriamente.
Delphi 7 + Interbase 6.5 + DbExpress + DevExpress.

:o esta es la tabla y su estructura:

CREATE GENERATOR GEN_TC_CLIENTE_ID;

CREATE TABLE TC_CLIENTE (
NRO AUTONUMERICO NOT NULL /* AUTONUMERICO = INTEGER */,
RAZON_SOCIAL NOMBRE_CORTO NOT NULL COLLATE ES_ES /* NOMBRE_CORTO = VARCHAR(50) */,
NOMBRE_COMERCIAL NOMBRE_CORTO COLLATE ES_ES /* NOMBRE_CORTO = VARCHAR(50) */,
CONDICION_IVA AUTONUMERICO NOT NULL /* AUTONUMERICO = INTEGER */,
CUIT CUIT NOT NULL /* CUIT = VARCHAR(13) */,
DIRECCION DOMICILIO NOT NULL /* DOMICILIO = VARCHAR(30) */,
PROVINCIA AUTONUMERICO /* AUTONUMERICO = INTEGER */,
LOCALIDAD AUTONUMERICO /* AUTONUMERICO = INTEGER */,
CODIGO_POSTAL CODIGO_POSTAL /* CODIGO_POSTAL = VARCHAR(20) */,
TELEFONO TELEFONO /* TELEFONO = VARCHAR(40) */,
FAX TELEFONO /* TELEFONO = VARCHAR(40) */,
MOVIL TELEFONO /* TELEFONO = VARCHAR(40) */,
NEXTEL TELEFONO /* TELEFONO = VARCHAR(40) */,
EMAIL EMAIL /* EMAIL = VARCHAR(100) */,
LISTA_PRECIO LISTA_PRECIO /* LISTA_PRECIO = INTEGER */,
ULTIMA_COMPRA FECHA_HORA /* FECHA_HORA = TIMESTAMP */,
ULTIMO_PAGO FECHA_HORA /* FECHA_HORA = TIMESTAMP */,
SALDO "PRECIO UNITARIO" DEFAULT 0 NOT NULL /* "PRECIO UNITARIO" = NUMERIC(15,4) */,
ACTIVO ACTIVO DEFAULT 0 NOT NULL /* ACTIVO = INTEGER */,
SALDO_I NUMERIC(15,2) DEFAULT 0.00 NOT NULL,
CONTACTO VARCHAR(50) CHARACTER SET WIN1251,
NOTA BLOB SUB_TYPE 1 SEGMENT SIZE 4096,
CONVENIO_MULTILATERAL VARCHAR(12) CHARACTER SET WIN1251,
CONDICION_VENTA INTEGER DEFAULT 0,
CATEGORIA_CLIENTE VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
GERENTE VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES,
JEFE_DE_COMPRA VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES,
JEFE_TECNICO VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES,
CATEGORIA_INSTALADOR VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
INSTALADOR_1 VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
INSTALADOR_2 VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
INSTALADOR_3 VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
INSTALADOR_4 VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
INSTALADOR_5 VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
EMPRESA_DE_SERVICIOS_1 VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES,
EMPRESA_DE_SERVICIOS_2 VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES,
EMPRESA_DE_SERVICIOS_3 VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES,
CONTACTO_1 VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
CONTACTO_2 VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
CONTACTO_3 VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
CONTACTO_4 VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
CONTACTO_5 VARCHAR(25) CHARACTER SET ISO8859_1 COLLATE ES_ES,
MAIL_CONTACTO_1 VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES,
MAIL_CONTACTO_2 VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES,
MAIL_CONTACTO_3 VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES,
MAIL_CONTACTO_4 VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES,
MAIL_CONTACTO_5 VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES,
TELEFONOS_INSTALADOR_1 VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES,
TELEFONOS_INSTALADOR_2 VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES,
TELEFONOS_INSTALADOR_3 VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES,
TELEFONOS_INSTALADOR_4 VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES,
TELEFONOS_INSTALADOR_5 VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES,
NOTA_CONTACTOS BLOB SUB_TYPE 1 SEGMENT SIZE 4096,
TELEFONO_CONTACTO_1 VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES,
TELEFONO_CONTACTO_2 VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES,
TELEFONO_CONTACTO_3 VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES,
TELEFONO_CONTACTO_4 VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES,
TELEFONO_CONTACTO_5 VARCHAR(40) CHARACTER SET ISO8859_1 COLLATE ES_ES
);




/******************************************************************************/
/**** Primary Keys ****/
/******************************************************************************/

ALTER TABLE TC_CLIENTE ADD CONSTRAINT PK_TC_CLIENTE PRIMARY KEY (NRO);


/******************************************************************************/
/**** Indices ****/
/******************************************************************************/

CREATE INDEX TC_CLIENTE_IDX1 ON TC_CLIENTE (RAZON_SOCIAL);
CREATE INDEX TC_CLIENTE_IDX2 ON TC_CLIENTE (NOMBRE_COMERCIAL);
CREATE INDEX TC_CLIENTE_IDX3 ON TC_CLIENTE (NRO, PROVINCIA, LOCALIDAD);


/******************************************************************************/
/**** Triggers ****/
/******************************************************************************/


SET TERM ^ ;


/******************************************************************************/
/**** Triggers for tables ****/
/******************************************************************************/



/* Trigger: TC_CLIENTE_BI */
CREATE TRIGGER TC_CLIENTE_BI FOR TC_CLIENTE
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.NRO IS NULL) THEN
NEW.NRO = GEN_ID(GEN_TC_CLIENTE_ID,1);
END


===================================================

:o " Esta es la Consulta:"



SELECT C.NRO,
C.RAZON_SOCIAL,
C.NOMBRE_COMERCIAL,C.CUIT,
C.LISTA_PRECIO,
C.CONDICION_VENTA,
C.DIRECCION,
C.NOTA,
FP.DESCRIPCION AS FORMADEPAGO
FROM TC_CLIENTE C
JOIN TC_FORMA_PAGO FP ON FP.NRO = TC_CLIENTE.CONDICION_VENTA
WHERE ( (C.ACTIVO = 0) AND :OPCION = 0) OR
( C.ACTIVO = 0 AND C.CONDICION_IVA = :OPCION ) OR
( C.ACTIVO = 0 AND C.CONDICION_IVA > 1 AND :OPCION = 2)
ORDER BY C.NOMBRE_COMERCIAL ASC


:o Este es el Problema: la cantidad de registros es de 34.000 y en un Atlhon 3000+ con 1 gb de RAM, tarda muchisimo en abrir la misma. si lo hago desde IBExpert no tarda nada, pero desde mi aplicacion si.

uso para mostrar los datos una grilla DBGrid.
la cual he tocado para que optimice la vista considerando la cantidad de datos, pero ahun asi sigue tardando muchisimo.
en las maquinas donde va a correr la aplicacion tarda mas de 1 minuto en traer los datos.

Realmente no se que hacer. para solucionar este problema
saludos y gracias.

egostar 24-05-2007 03:01:50

Tengo una pregunta, cuando dices que abres la (base/tabla) con IBExpert, lo haces con el mismo query:confused:

Código SQL [-]
SELECT C.NRO,
       C.RAZON_SOCIAL,
       C.NOMBRE_COMERCIAL,C.CUIT,
       C.LISTA_PRECIO,
       C.CONDICION_VENTA,
       C.DIRECCION,
       C.NOTA,
       FP.DESCRIPCION AS FORMADEPAGO
FROM TC_CLIENTE C
JOIN TC_FORMA_PAGO FP ON FP.NRO = TC_CLIENTE.CONDICION_VENTA
WHERE ( (C.ACTIVO = 0) AND :OPCION = 0) OR
      ( C.ACTIVO = 0 AND  C.CONDICION_IVA = :OPCION   ) OR
      ( C.ACTIVO = 0 AND  C.CONDICION_IVA > 1 AND :OPCION = 2)
ORDER BY C.NOMBRE_COMERCIAL ASC

Solo una anotación adicional, has uso de las etiquetas para que el código sea mas legible.

Salud OS.

Paradiso 24-05-2007 04:57:22

Si, efectivamente.

egostar 24-05-2007 05:02:09

Pues entonces me suena a algún problema de conectividad con la base de datos porque la cantidad de registros no es considerable, con que componentes estas conectando a la base y como lo haces en el código:confused:

Salud OS.

Neftali [Germán.Estévez] 24-05-2007 11:20:06

Cita:

Empezado por Paradiso
Este es el Problema: la cantidad de registros es de 34.000

Realmente creo que ese es el problema.
Intentar devolver 34.000 registros en una consulta para mostrarlos en un DBGrid creo que es un fallo de concepo.

No tiene sentido que alguien acceda a un DBGrid con 34.000 filas. Nadie se pone a bajar con el cursor hasta encontrar la fila que necesita (imagina qie es la fila 18.345 del Grid :o). Normalmente cuando se devuelve un Grid así el usuario que está delante de él intenta ordenarlo o filtrarlo para buscar lo que necesita. Ahí está la cuestión debes "acostumbrar" al usuario a que lo filtre o lo ordene antes de realizar la consulta para obtener un rango de registros más pequeño (y aun así yo pensaría en usar un TOP).

Aun así los tiempos me parecen demasiado.
* Ejecuta la misma consulta sin el Gris a ver lo que tarda, para descartar que sea problema de la carga.
* Revisa el tipo de cursor que estás utilizando ServerSide o ClientSide.
* Si la consulta tarda mucho revisa los índices y el plan de ejecución.
* Usa TOP; Yo no devolvería más de 1000 o 2000 registros.
* Piensa que los Grids de las DevExpress en su modo de funcionamiento estandard ("el bonito" que permite agrupar,ordenar, filtrar,...) traen todos los registros a memoria y los cargan en el Grid.

Lepe 24-05-2007 14:15:30

No se ha dicho, pero se debe: Normaliza la Base de datos (google: "formas normales" o "normaliza tabla").

Instaladores, contactos, emails y telefonos de cada uno, todos en una tabla no hará otra cosa que estorbar y crear inconsistencias.

Tampoco veo un índice por el campo activo, que se usa mucho en el where.

Saludos

egostar 24-05-2007 16:53:44

Yo pienso que si está filtrado los datos como se ve en su sentencia SQL

Código SQL [-]
JOIN TC_FORMA_PAGO FP ON FP.NRO = TC_CLIENTE.CONDICION_VENTA
WHERE ( (C.ACTIVO = 0) AND :OPCION = 0) OR
      ( C.ACTIVO = 0 AND  C.CONDICION_IVA = :OPCION   ) OR
      ( C.ACTIVO = 0 AND  C.CONDICION_IVA > 1 AND :OPCION = 2)
ORDER BY C.NOMBRE_COMERCIAL ASC
Me pregunto, los 34,000 registros cumplirán con esa condición.:confused:

La otra cuestión pudiera ser el JOIN.

En todo caso Lepe tiene razón al acotar sobre la normalización de la tabla.

Salud OS.

Neftali [Germán.Estévez] 24-05-2007 17:12:12

Cita:

Empezado por egostar
Yo pienso que si está filtrado los datos como se ve en su sentencia SQL...

Yo me refería a los filtros en campos "de cara al usuario":
C.NRO,
C.RAZON_SOCIAL,
C.NOMBRE_COMERCIAL,C.CUIT,
C.LISTA_PRECIO,
C.CONDICION_VENTA,
C.DIRECCION,
C.NOTA,
FP.DESCRIPCION AS FORMADEPAGOSeguramente si el usuario está buscando algo, podrá acotar alguno de estos antes de ejecutar la SQL.

Delfino 24-05-2007 19:31:20

Cita:

Delphi 7 + Interbase 6.5 + DbExpress + DevExpress.
en q utilizas los DevExpress si no es para el Grid?
sospecho q este puede ser el problema pq esos componentes suelen traer todos los datos de una vez, en el IBExpert se utiliza ese grid pero el modo GridMode esta para q sea virtual igual q el DBGrid de Delphi,

aparte de deber o no deber traer todos esos datos, IBDataset + DBGrid se abren al instante con una tabla de mas de 100.000 registros, incluso en red, pq el IBDataset trae solo los datos establecidos en la propiedad BufferChunks y el DBGrid trae del IBDataset solo los datos q necesita mostrar en la pantalla, asi q el problema esta en otro sitio no en la cantidad..

Paradiso 25-05-2007 03:23:35

Ante todo GRACIAS, por Responder.

Si sirve de algo aclaro hasta donde pueda.

para abrir la consulta en cuestion hago lo siguiente:

cdsClientes.close;
cdsClientes.params.ParamByName('OPCION').value := gOPCION;
cdsClientes.params.ParamByName('OPCION').value := gOPCION;
cdsClientes.params.ParamByName('OPCION').value := gOPCION;

cdsCLientes.open;
grdBase.setfocus;

---
con respecto a por que dbExpress: es la forma que aplico para manejar datos.

lo que si noto es que si la grilla DeVexpress trae si o si todos los registros, entonces estoy en problemas. por que tengo la aplicacion llena de esos componentes.

Creo que el problema pasa por el componentes grilla. pruebo e informo.
si alguien me dice alguna critica o idea mas , voy a estar muy agradecido.

saludos.

egostar 25-05-2007 04:18:03

Hola, me parece extraño lo siguiente:

Cita:

Empezado por Paradiso
cdsClientes.close;
cdsClientes.params.ParamByName('OPCION').value := gOPCION;
cdsClientes.params.ParamByName('OPCION').value := gOPCION;
cdsClientes.params.ParamByName('OPCION').value := gOPCION;

cdsCLientes.open;
grdBase.setfocus; // que intentas hacer con esto

Y en la consulta haces esto

Código SQL [-]
WHERE ( (C.ACTIVO = 0) AND :OPCION = 0) OR
      ( C.ACTIVO = 0 AND  C.CONDICION_IVA = :OPCION   ) OR
      ( C.ACTIVO = 0 AND  C.CONDICION_IVA > 1 AND :OPCION = 2)
ORDER BY C.NOMBRE_COMERCIAL ASC

No logro entender tu lógica. pasas 3 veces el mismo parámetro y luego lo comparas con números.

Habría que revisar un poco esa lógica.

Salud OS.

Neftali [Germán.Estévez] 25-05-2007 11:38:24

Cita:

Empezado por Paradiso
lo que si noto es que si la grilla DeVexpress trae si o si todos los registros, entonces estoy en problemas. por que tengo la aplicacion llena de esos componentes.

Como te han dicho, el Grid de la DevExpress puede cambiar el modo de funcionamiento para no traer todos los datos; Basta con cambiar la porpiedad GridMode; El problema es que en ese modo de funcionamiento pierdes determinadas propiedades del Grid (ordenaciones, Agrupaciones, totales,...)

Paradiso 25-05-2007 17:14:47

oK.
eXPLICO lo siguiente

la config. de la grilla es asi

Esta tildado PartialLoad
y tildado Smarreload (> 1000 records)
y tildado SmartRefresh (> 1000 Records)

y tarda una locura igual y ademas
y en la propiedad PartialLoadBufferCount = 100 ( se que este valor es corto , pero lo hice para probar si asi me traia los datos mas rapido )

gracias.

NOTA: Lo loco es que en ibexpert para mi esta toda la funcionalidad activa ( podes ordenar etc) y me trae todos los registros en 1 segundo.

Neftali [Germán.Estévez] 25-05-2007 18:14:21

Has ejecutado la consulta sin el Grid; ¿Qué tarda?

Paradiso 25-05-2007 22:00:15

Confirmado,

Cuando activo la consulta tarda lo mismo, asi que no es un problema de la grilla DevExpress.

Y recalco que en el IbExpert corro la misma consulta y no tarda nada.

xander 25-05-2007 23:13:04

El problema es con tus componentes de conexión... Lo que necesitas es usar sesiones persistentes, para que a la hora de abrir la consulta no traiga todo el contenido de la tabla sino solo los primeros N que encuentra... ya si te mueves a travez del dataset con el grid on usando Next's va trayendo el resto de los registros bajo demanda... IBExpert creo que usa FIBPlus, pero que yo conozca tambien los MDO y los IBObjects tienen esa funcionalidad... L

Los Zeos me parece que no manejan sesiones persistentes, osea que te funcionaria igual que con DBExpress...

Delfino 26-05-2007 00:14:50

Cita:

Cuando activo la consulta tarda lo mismo, asi que no es un problema de la grilla DevExpress
No te pongas tan seguro, tienes algun campo lookup o usas el metodo locate del Dataset? sigo pensando q el problema no es los componentes de conexion, has probado los MDO?
Cita:

IBExpert creo que usa FIBPlus
Pues no, utiliza los IBX con el DevExpress grid en modo virtual..

xander 26-05-2007 00:37:13

Cita:

Empezado por Delfino
Pues no, utiliza los IBX con el DevExpress grid en modo virtual..

Bueno IBX tambien usa sesiones persistentes y carga de registros por demanda...

Paradiso 26-05-2007 02:03:26

Que es usar la grilla DevExpress en Modo "Virtual"

por que hay una realidad, la misma consulta con el mismo componente no tarda nada en mostrarse en el ibexpert.

estoy mas confundido que antes.

Delfino 26-05-2007 15:58:33

Cita:

Que es usar la grilla DevExpress en Modo "Virtual"
has leido la respuesta de neftali?
Cita:

Como te han dicho, el Grid de la DevExpress puede cambiar el modo de funcionamiento para no traer todos los datos; Basta con cambiar la porpiedad GridMode


La franja horaria es GMT +2. Ahora son las 04:27:50.

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