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)
-   -   Actualizar en tiempo Real (https://www.clubdelphi.com/foros/showthread.php?t=76267)

Diego827 19-10-2011 21:22:15

Actualizar en tiempo Real
 
Hola amigos, busque por todos lados una solucion a mi problema pero no la haye. Espero que ustede me brinden una mano.

Les comento mi problema:

Quisiera que un DBChart se actualizara en tiempo real; este presenta datos de una base de datos Interbase. Los componentes utilizados son Interbase o bien IBX como le llaman algunos.

La unica forma que he hayado para actualizarlo es cerrando y habriendo el IBDataBase cada cierto tiempo pero no es lo correcto.

Gracias de antemano;

Ñuño Martínez 19-10-2011 21:50:18

En lugar de eliminar y crear el IBDataBase, ¿has probado a desactivar y activar el DataSet?

Diego827 19-10-2011 22:58:14

Probe con esto
 
Estimado Ñuño, por lo que comentaste realize esto:

Código Delphi [-]
void __fastcall TForm_vistas::Button1Click(TObject *Sender)
{
IBDataSet_ATR->Active=false;
IBDataSet_ATR->Active=true;
SeriesDataSet_ATR->Active=false;
SeriesDataSet_ATR->Active=true;
DBChart_ATR->Refresh();

}


Pero no funciona, presiono el boton y de cualquier modo el DBChart no actualiza.
Seguire intentando con otras formas que se me ocurran y posteo,

Gracias por contestar.

Casimiro Notevi 19-10-2011 23:11:02

Es difícil ayudarte porque no has explicado lo que estás haciendo, de cómo obtienes los datos, cómo los presentas, etc. ni lo que quiere decir para tí "tiempo real".

Si lo que quieres es un gráfico se esté actualizando según los datos que se introducen en una base de datos, entonces NO lo hagas en tiempo real porque estarás saturando la red y el servidor con constantes "selects".
Hay otras formas de hacerlo, pero antes debes explicar qué estás haciendo, qué quiéres hacer, etc. exactamente.

maeyanes 19-10-2011 23:11:44

Hola...

Prueba creando una transacción nueva (y la configuras para que sea de tipo SNAPSHOT) para esos Datasets y haces algo como:

Código Delphi [-]
if IBChartsTransaction.InTransaction then
  IBChartsTransaction.Commit;
IBChartsTransaction.StartTransaction;
IBDataSet_ATR->Active=true;
SeriesDataSet_ATR->Active=true;

Y a IBDataSet_ATR y SeriesDataSet_ATR le asignas la nueva transacción en su propiedad Transaction.


Saludos...

Casimiro Notevi 19-10-2011 23:19:38

Está claro que no se tiene claro lo que quiere Diego827, ha recibido 3 respuestas, cada una distinta de la otra.

mightydragonlor 19-10-2011 23:32:03

Con IBEvents =P
Edito: Ya van cuatro casimiro xD

Casimiro Notevi 19-10-2011 23:35:40

Cita:

Empezado por mightydragonlor (Mensaje 416248)
Edito: Ya van cuatro casimiro xD

Y sumando... :D

Diego827 20-10-2011 01:39:28

Hola amigos.

Gracias por sus respuestas! sabia que me iban a ayudar (de hecho siempre recibo ayuda de este club!).

Ok, estimado Casimirio; explico el problema con más detalle.

Cita:

Empezado por Casimiro Notevi (Mensaje 416242)
no has explicado lo que estás haciendo.

Es que no lo he hecho... Quisiera hacerlo pero no me sale :rolleyes:; lo que de igual forma significaria lo estoy intentando hacer.

Como dije antes: "Quisiera que un DBChart se actualizara en tiempo real; este presenta datos de una base de datos Interbase. Los componentes utilizados son Interbase o bien IBX como le llaman algunos". Añadiría: lo que trato de hacer es una ventana con un DBChart; el cual muestra datos de un campo en una base de datos InterBase SMP 2009. Si se ingresaran datos inmediatamente que cambiara el DBCHart, algo asi como si este "pendiente de cambios" y actualizarce en cuanto sucedan. Esto, si fuera posible.

Cita:

Empezado por Casimiro Notevi (Mensaje 416242)
de cómo obtienes los datos

Los obtengo por componentes IBX, como dije: "Los componentes utilizados son Interbase o bien IBX como le llaman algunos."; pero cabería añadir: Para conectarme a la base un TIBDataBase, un IBTransaction... lo que se utiliza normalmente y por supuesto el IBDataSet.

Cita:

Empezado por Casimiro Notevi (Mensaje 416242)
cómo los presentas

Los presento en un DBChart, como dije: "Quisiera que un DBChart se actualizara en..."; no utilizo ningun DBGrid ni nada parecido, es una ventana simple con un DBChart. Lo que sucede es que no se como hacer que el Componente IBDataSet se de cuenta que la base de datos ha tenido una modificacion o algun cambio y por lo tanto volver a consultar y obtener los nuevos datos.

Cita:

Empezado por Casimiro Notevi (Mensaje 416242)
ni lo que quiere decir para tí "tiempo real

Para mi tiempo real (y para Wikipedia y otras Web) es algo como: un sistema que esta pendiente de lo que suceda y que presenta datos del ahora; por ejemplo si se ve la memoria de acceso aleatorio consumida de tu PC en este momento el dato es de tiempo real (no de ayer ;) en el administrador de tareas).

Resumiendo ;):

Un grafico DBChart (digamos que de linea) que este mostrando los datos actuales que se presentan en la base de datos (por supuesto especificamente de un campo) y que al cambiar estos datos (ya sea una edicion o un insert) este grafico se actualics. No se si exista alguna funcion que detecte cambios en la base de datos y que al cambiar inmediatamente se actualice. Estoy de acuerdo con lo que mencionas estimado Casimiro; si hago sentencias SELECT cada cierto tiempo con un Timer estaria hasta cierto punto siendo desconsiderado con los recursos.

Estimado maeyanes; lo pruebo y posteo, de igual forma voy a probar lo que me dices estimado mightydragonlor; voy a intenarlo.

Saludos a todos y gracias por responder.

Casimiro Notevi 20-10-2011 01:48:24

Entonces te viene mejor los eventos, que cuando se actualice ese campo (o la tabla) salta el evento oportuno y tú te encargarías de presentar la gráfica con los nuevos datos, así sólo tendrías que hacerlo cuando realmente se han modificado los datos.
Creo que en algún hilo había un ejemplo que te puede venir perfecto, voy a ver si lo encuentro, aunque tampoco es muy complejo.

Edito: busca por post_event, también por el componente indicado por mightydragonlor, para manejarlo desde delphi.

Aquí hay un hilo que te puede servir.

RONPABLO 20-10-2011 03:27:44

Como te han comentado usa los eventos, es un componente IBX, se llama IBEvente...

Cita:

Un grafico DBChart (digamos que de linea) que este mostrando los datos actuales que se presentan en la base de datos (por supuesto especificamente de un campo) y que al cambiar estos datos (ya sea una edicion o un insert)
1. Ok en la base de datos debe crear un trigger en la tabla que tiene dicho campo, es importante determinar que es lo que esta graficando, los cambios realizados por un update, inserciones nuevas con un Insert o información que se borra con un Delete, así pues al crear el trigger ponemos que se active en una de estas opciones o en todas o en las 2 que necesite.

2. El código del trigger lucirá algo así:

Código SQL [-]

SET TERM ^^ ;
CREATE TRIGGER NombreDelTrigger FOR NombreTabla ACTIVE AFTER INSERT POSITION 0 AS
begin
  /* code */
  POST_EVENT 'NuevoRegistro';   // Este es el nombre que yo le di al evento, pero puede ser el que más se adapte o el que quiera poner
end ^^
SET TERM ; ^^

3. Ya volviendo al código del programa y dejando a un lado la base de datos vamos al componete IBEvent, en él usamos la propiedad registrar evento y ahí colocamos el nombre del evento creado en el trigger (el que yo llame 'NUevoRegistro').

4. Acá queda faltando programar el evento del componente IBEvent (suena redundante, y puede ser confuso, pero este no es una propiedad si no un evento, como el onMouseUp o el OnClick), no recuerdo como se llama este evento, pero en el solo necesita poner algo así como esto:

Código Delphi [-]
    DataSet.Refresh;

Nota: Acá todo lo digo de memoria, así que puede haber muchos errores, pero es la idea de como funciona.

Diego827 20-10-2011 06:47:22

Excelente amigos
 
Gracias amigos en cuanto lo realice posteo muy agradecido por su tiempo!

Saludos a todos.


La franja horaria es GMT +2. Ahora son las 10:39:41.

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