PDA

Ver la Versión Completa : Adoquery sql server 2000


compualarma
03-04-2009, 07:48:09
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
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:


Select * from Tabla where ID > 205


Si lees tres y el último ID es el 208, la siguiente:

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:

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


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


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=djxwv6b_0cvzbzzdr&revision=_latest

Esta es la imagen del grid de prueba que he puesto

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

http://img12.imageshack.us/img12/1451/imagen78b.png

Neftali [Germán.Estévez]
06-04-2009, 09:58:52
...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.

http://img26.imageshack.us/img26/5352/centralmonitoreo.jpg
http://img13.imageshack.us/img13/2229/pruebared.jpg

luk2009
07-04-2009, 06:57:59
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
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
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
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.