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)
-   -   Adoquery sql server 2000 (https://www.clubdelphi.com/foros/showthread.php?t=64479)

compualarma 03-04-2009 07:48:09

Adoquery sql server 2000
 
Saludos

Tengo un programa que recibe datos de manera continua desde un puerto serial y estoy creando la plataforma del usuario. He puesto un adoquery, datasource y adoconnection. He puesto un ttimer y en el evento ontimer
he hecho un REQUERY.

Mi problema es que necesito leer uno por uno los registros nuevos que llegan
para generar los eventos dependiendo del tipo que sean. Ademas de que cada vez que hace un REQUERY este se va al comienzo del DBgrid.

Si me pudieran dar alguna sugerencia, se los agradeceria.

Neftali [Germán.Estévez] 03-04-2009 09:44:00

Cita:

Empezado por compualarma (Mensaje 343746)
Mi problema es que necesito leer uno por uno los registros nuevos que llegan
para generar los eventos dependiendo del tipo que sean. Ademas de que cada vez que hace un REQUERY este se va al comienzo del DBgrid.

Lo más eficiente que se me ocurre es que cada vez que realices la consulta te quedes con algun campo que "marque" cual es el último registro; un ID (autoincremental), un TimeStamp (Fechahora), de forma que la siguiente vez que hagas la consulta, en lugar de hacer el Requery, ejecutes la consulta utilizado el campo guardado, con el objetivo de sólo obtener los nuevos registros, no todos.

No se si me explico.

Ej. Si el último registro leído tiene ID=205, la siguiente consulta debería ser:

Código SQL [-]
  Select * from Tabla where ID > 205

Si lees tres y el último ID es el 208, la siguiente:
Código SQL [-]
  Select * from Tabla where ID > 208

Y así sucesivamente.

Si dicionalmente necesitas tener un Grid con todos los registros, utiliza un Query diferente al del Grid y en el del Grid sí puedes hacer un Requery para obtener los nuevos y luego un Locate para posicionarte en el que te interese.

compualarma 03-04-2009 18:39:29

Muchisimas gracias por tu tiempo y tu respuesta.

La idea me parece excelente. Tengo un campo autoincrementable que se llama entradadatos. Pense que en el evento onshow del form al enviar al query al ultimo registro podia tomar el valor del registro y asignarlo a la variable.
ejemplo:
Código:

DataModule2.ADOqprueba.Last;
buscar:=DataModule2.ADOqpruebaEntradadatos.AsInteger;

luego realizar la sentencia sql en el evento ontimer como sigue:

Código:

DataModule2.ADOqprueba.SQL.Clear;
datamodule2.ADOqprueba.SQL.Add(' SELECT * FROM CENTRAL left join acmsub on central.csid = acmsub.csid left join evento on central.evento=evento.evento where evento.activo=1 and central.entradadatos > '+ quotedstr(inttostr(buscar)));
DataModule2.ADOqprueba.Open;

pero no me funciona, que estoy haciendo de manera incorrecta.

compualarma 03-04-2009 19:17:34

http://docs.google.com/View?docID=dj...vision=_latest

Esta es la imagen del grid de prueba que he puesto

Neftali [Germán.Estévez] 06-04-2009 09:57:22

:(:(:(


Neftali [Germán.Estévez] 06-04-2009 09:58:52

Cita:

Empezado por compualarma (Mensaje 343794)
...pero no me funciona, que estoy haciendo de manera incorrecta.

Tal vez deberías explicar un poco mejor el problema. ¿Porqué no te funciona? ¿te da error? ¿No devuelve nada? Si da error ¿cual es? :confused::confused:

luk2009 07-04-2009 06:49:48

lo que pasa es que me llegan muchas señales y algunas pueden llegar al mismo tiempo o en el mismo minuto. Necesito una forma de poder manejarlas una por una, sin que al llegar las nuevas se pierdan.

cuando hago el select, perfecto, me gusta mas que hacer el requery, ya que realmente lo que necesito es manejar los eventos nuevos y no traer todos los que estan en la base de datos todo el tiempo. pero no se si los bookmarks me sirvan para ello, o algun indice.

Necesito alguna idea para trabajar.



luk2009 07-04-2009 06:57:59

Imagenes
 
la de arriba es el programa que tengo funcionando de manera local, directo al puerto serial y donde tengo el problema que cuando quiero escribir una nota sobre una de las señales, si llega otra me pasa hacia esa.

La segunda imagen es del dbrid del query que puse en otra computadora para probar el funcionamiento en red.

La idea es que veas como son las señales que llegan.

Gracias por tu tiempo.

luk2009 07-04-2009 07:02:27

cambie nombre de usuario
 
Ya que me parecio mas correcto, aclaro para evitar confusiones

Neftali [Germán.Estévez] 07-04-2009 12:36:29

OK.
¿Y ahora en qué punto estás? (lo siento pero me he perdido un poco...)

Por un lado te llegan señales y por otro lado quieres ir procesándolas.
El código o estrategia que comentamos más arriba, ¿Te funciona? ¿Puedes ir leyendo las nuevas señales?

luk2009 07-04-2009 17:39:32

detalles
 
hola de nuevo

El metodo del select esta perfecto porque es menos pesado que el de requery

-PROBLEMA - el select esta puesto en un timer. si llegan cinco seÑales al mismo tiempo, necesito poder trabajar con cada una de ellas y con las demas que van llegando.

-PROBLEMA- despues que se hace el nuevo select se van las seÑales viejas
aunque obviamente ellas estan en la base de datos del servidor.

-PREGUNTA -Si recibo estos datos constantemente y necesito procesarlos uno por uno, cual seria el mejor metodo.

1.- crear una tabla o vista con el cual trabajaria que podria ir llenando conel select?

2.-marcar los datos nuevos como pendientes con algun campo en la tabla en el servidor y mantener un contador y luego recuperarlos con otro select para saber lo que esta pendiente e ir trabajando con ellas

Espero haberme explicado bien.

Ejemplo practico: suena una alarma en robo del cliente X y luego dos segundos mas tarde suena la del cliente Y en fuego, mientras proceso la del cliente X, si llegan otros datos se pierde la del cliente Y.

-pero claro esos datos estan todos en la base de datos del servidor.

Neftali [Germán.Estévez] 07-04-2009 17:59:41

Cita:

Empezado por luk2009 (Mensaje 344216)
Ejemplo practico: suena una alarma en robo del cliente X y luego dos segundos mas tarde suena la del cliente Y en fuego, mientras proceso la del cliente X, si llegan otros datos se pierde la del cliente Y.

En ese caso yo lo que haría sería dos procesos distintos (Productor/Consumidor).

(1º) El qe se encarga de leer las señales y guardarlas en una tabla temporal. Sólo tiene que leer y guardar. Así con este proceso no pierdes tiempo de proceso. Sólo lee y guarda en la tabla.

(2º) Otro proceso que se encarga de ir recuperando las señales guardadas en la tabla y las va procesando y eliminando.

De esta forma, si llega un momento en que necesitas más potencia puedes optar por configurar varios consumidores.


La franja horaria es GMT +2. Ahora son las 01:57:36.

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