Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Obtención de Array de un Componente de Base de datos (https://www.clubdelphi.com/foros/showthread.php?t=94094)

LIA_GUILLERMO 26-07-2019 19:01:27

Obtención de Array de un Componente de Base de datos
 
Buen día primero expondré mi caso:

Tengo por medio de Firebird 2.5 una BD la cual tiene 5 tablas de momento (Config, EA, SA, ED, SD) en las últimas 4 es en donde se concentra la mayor información, en esas tablas se tienen los mismos campos (Indice, Valor, Fecha_Hora, Status).

Mi problema es el siguiente:

Al realizar la lectura de la base de datos lo hago con un TFDQuery para posteriormente vaciar los resultados en una Collection, el detalle que tengo es que al ser una gran cantidad de datos conlleva un tiempo considerable, me gustaría saber si existe una forma de poder obtener todos los datos de la Query o de algún otro complemento de Delphi como si fuera una Matriz o que otra opción sería viable para este tipo de casos.

Sin más por el momento espero me puedan ayudar a comprender y entender mejor el tema para poder darle solución.

Casimiro Notevi 26-07-2019 20:07:54

Cita:

Empezado por LIA_GUILLERMO (Mensaje 532933)
Sin más por el momento espero me puedan ayudar a comprender y entender mejor el tema para poder darle solución.

Eso pensamos nosotros, no se entiende lo que explicas.

WHILENOTEOF 26-07-2019 22:04:45

Bueno esa "matriz" la tienes ya en el componente FDQuery (columnas-campo x filas-registro), puedes intentar optimizar con cursores unidireccionales y propiedades de la transacción que se utiliza para traerte los datos, que sea solo de lectura.

movorack 26-07-2019 23:13:42

1- ¿Por qué vuelcas el contenido de la consulta en un collection?
2- Como te dice WHILENOTEOF, Ya en el Query tienes los datos listados
3- ¿Por qué vuelcas el contenido de la consulta en un collection?
4- ¿¡Por qué!?

orodriguezca 27-07-2019 14:52:40

A las preguntas que hizo movorack yo agregaría:

- ¿ Cuantos registros son esa gran cantidad de datos ?
- ¿ Cuanto tiempo, en segundos o minutos, es un tiempo considerable?

Es posible que el problema no este del lado de la aplicación sino del lado de la base de datos.

oscarac 27-07-2019 19:56:39

incluiria tambien
la forma en que se esta conectando, usas ADO ? ODBC ? alguna otra forma?
aunque viendo el componente que usas, lo haces utilizando FireDAC
en ese caso deberias colocar tambien la cadena con la cual estas "jalando" los datos de esas tablas

creeme hay una enorme diferencia entre

Código SQL [-]
select * from Tabla1 t1
left join Tabla2 t2 on t1.Campo1 + T1.Campo2 = t2.Campo1 + T2.Campo2
y

Código SQL [-]
select * from Tabla1 t1
left join Tabla2 t2 on t1.Campo1 = t2.Campo1  and T1.Campo2 = + T2.Campo2


se supone que este tipo de base de datos es mucho mas potente y rapido que las tablas convencionales

LIA_GUILLERMO 01-08-2019 16:13:48

Cita:

Empezado por movorack (Mensaje 532938)
1- ¿Por qué vuelcas el contenido de la consulta en un collection?
2- Como te dice WHILENOTEOF, Ya en el Query tienes los datos listados
3- ¿Por qué vuelcas el contenido de la consulta en un collection?
4- ¿¡Por qué!?


R1.- La paso a una Collection para mandarsela a un TChart que se va a encargar de graficar los cambios.
R2.- Si el Query ya me trae los datos pero como quería pasar esos datos a la TChar por eso los mando a la Collection.

LIA_GUILLERMO 01-08-2019 16:20:17

Cita:

Empezado por orodriguezca (Mensaje 532939)
A las preguntas que hizo movorack yo agregaría:

- ¿ Cuantos registros son esa gran cantidad de datos ?
- ¿ Cuanto tiempo, en segundos o minutos, es un tiempo considerable?

Es posible que el problema no este del lado de la aplicación sino del lado de la base de datos.



1- Los registros son variables, es un SCADA que registra nuevos valores cada 5 o 10 seg, y además la consulta que se hace es dependiendo lo que el usuario quiera ver, si quiere ver los cambios que han surgido en 2 hrs, 1 día o 5 días.
2- Bueno por lo que he medido para 2 hrs o 2 días se tarda lo mismo, seria 1 min 34 seg, 34 seg se lleva trayendo datos y pasarlos a la Collection y lo demás en pintarlo a la TChart.

Yo tengo el complemento TChart Lite, ayer estaba yo viendo que con la TChart Pro se podía jalar datos directos desde un Query me parece, no se si ese podría ser mi solución.

LIA_GUILLERMO 01-08-2019 16:25:28

Cita:

Empezado por oscarac (Mensaje 532940)
incluiria tambien
la forma en que se esta conectando, usas ADO ? ODBC ? alguna otra forma?
aunque viendo el componente que usas, lo haces utilizando FireDAC
en ese caso deberias colocar tambien la cadena con la cual estas "jalando" los datos de esas tablas

creeme hay una enorme diferencia entre

Código SQL [-]
select * from Tabla1 t1
left join Tabla2 t2 on t1.Campo1 + T1.Campo2 = t2.Campo1 + T2.Campo2
y

Código SQL [-]
select * from Tabla1 t1
left join Tabla2 t2 on t1.Campo1 = t2.Campo1  and T1.Campo2 = + T2.Campo2


se supone que este tipo de base de datos es mucho mas potente y rapido que las tablas convencionales




Bueno lo que pasa es que los datos solo los jalo de 1 tabla:

Cadena := System.SysUtils.Format ('Select Fecha_Hora, Valor, Status From %s Where ((Indice = %d) And (Fecha_Hora between %g and %g))', [VarType, AVarId,
DateTime1, DateTime2]);

En el primer %s va el nombre de la tabla del cual jalara los datos, son 4 posibles tablas de momento pero todas tienen los mismos campos, entonces no jalo datos de tablas combinadas.


La franja horaria es GMT +2. Ahora son las 11:32:24.

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