Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Busqueda constante en tabla con un Ttimer (https://www.clubdelphi.com/foros/showthread.php?t=65274)

cocute 02-12-2009 13:40:07

Busqueda constante en tabla con un Ttimer
 
Hola, soy un poco novato en el tema, bueno más que novato es que llevo mucho tiempo desconectado del tema de bases de datos.
Pues eso, uso una tabla (TKbmMemTable) que tengo en un DBgrid,
y tengo en un Ttimer una función que recorre la tabla cada segundo para ver si coincide el campo fecha y hora con la fecha hora actual.
El problema, es que al estar el timer activo la tabla no es editable ya que al recorrerla se va cambiando de campos.
Cual creeis que seria la forma correcta de hacer esto para que no me ocurra este problema.

Solo se me ocurre crear otra tabla con el mismo contenido y cargarlo en la otra si lo modifico.

cloayza 02-12-2009 14:08:34

Podrias usar 2 TKbmMemTable.

TKbmMemTable 1: Asociada al Grid permitiendo edicion, insercion, eliminacion.
TKbmMemTable 2: Se recorre segun indique el ttimer para buscar las coincidencias de fecha y hora.

Por supuesto ambos TKbmMemTable apuntando al mismo archivo de datos.

Lo de crear una segunda tabla y copiar datos creo que estaria de mas.

Saludos...

cocute 02-12-2009 15:14:32

Ok gracias ya lo he hecho y funciona perfectamente,

otra pequeña duda, como deberia comprobar si un campo de tipo boolean esta a TRUE?, he probado esto pero no funciona

if kbmemetable1.Fields.FieldByName('Activado') then ....
if kbmemetable1.Fields.FieldByName('Activado').checked then ....
if kbmemetable1.Fields.FieldByName('Activado').text='True' then ....

no doy con la forma adecuada


gracias

cloayza 02-12-2009 15:19:30

Esta seria la forma correcta...
Código:

//if kbmemetable1.FieldByName('Activado') then ....

//Forma correcta...
if kbmemetable1.FieldByName('Activado').AsBoolean then ....

Saludos

gerardus 02-12-2009 17:51:11

Hola, no se que estas intentando hacer exactamente, pero esto de recorrer la tabla cada segundo para comprobar un campo me parece muy ineficiente.
Si hay suficientes registros, se te va a "congelar" la aplicación, por rápida que sea la TkbmMemTable.
Por qué no usas un evento AfterPost de la tabla para saber cuando se ha guardado un registro y entonces miras el valor del campo que te interesa?

Cordialmente,

Gerard.

cocute 02-12-2009 17:51:51

Cita:

Empezado por cloayza (Mensaje 347975)
//Forma correcta...
if kbmemetable1.FieldByName('Activado').AsBoolean then ....

muchas gracias, todo OK

cocute 02-12-2009 18:44:55

Cita:

Empezado por gerardus (Mensaje 347992)
Hola, no se que estas intentando hacer exactamente, pero esto de recorrer la tabla cada segundo para comprobar un campo me parece muy ineficiente.
Si hay suficientes registros, se te va a "congelar" la aplicación, por rápida que sea la TkbmMemTable.
Por qué no usas un evento AfterPost de la tabla para saber cuando se ha guardado un registro y entonces miras el valor del campo que te interesa?

Cordialmente,

Gerard.

Aunque no es propiamente eso, lo que necesito es digamos un programador de tareas.
Como ya he puesto lo que quiero es que cuando la fecha y hora que esta dentro de un campo coincida con la fecha y hora actual pues haga una acción con los datos de esa ficha.
Al necesitar que coincidan hasta los segundos solo se me ocurre comprobarlo cada segundo con un timer.
Lo que tambien tengo duda es de si no le diese tiempo en un segundo a realizar la busqueda en las fichas si se saltaria alguna vez alguna tarea.
No se si existe otra forma de hacer esto, seguramente que si, pero no se me ocurre.

gerardus 02-12-2009 19:27:58

Hola,

En efecto, puedes "perder" alguna tarea si la busqueda dura más de 1 segundo. Para eso te aconsejo usar algún sistema más rápido. Podrías por ejemplo usar alguna lista ordenada en memoria y hacer una busqueda binaria (o una busqueda secuencial si tienes pocos elementos).
Y bajar a una resolución de un segundo supone mucha carga. Asegurate de que es realmente necesario.

Cordialmente,

Gerard.

coso 03-12-2009 17:58:27

Hola, como te comenta el compañero, este sistema es muy ineficiente. Te digo una idea que te funcionaria mejor: ordenas la tabla por el campo de fecha/hora, y en el OnTimer lo unico que deberias hacer es comprobar si el primer registro tiene la misma hora. En el caso que sea asi, ejecutas lo que debas y marcas conforme esta ejecutado. Una vez finalizado filtras la tabla mostrando solo los no ejecutados y ordenado otra vez por fecha/hora, de tal manera que el primer registro sea de nuevo el que mas cerca este de ejecutarse. Es una idea, espero que te sirva. Un saludo.

PD: si tienes dos registros muy cerca en intervalos de tiempo, p.e. diferenciados dos segundos, tendras que usar threads para ejecutar cada uno de ellos.

cocute 03-12-2009 23:32:19

gracias, es buena idea.

Sobre lo de si hay registros muy seguidos en el tiempo no me meto ya que a tanto no quiero ajustar el programa (al menos en principio).


La franja horaria es GMT +2. Ahora son las 17:58:40.

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