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)
-   -   Actualizar sólo 1 registro en cliente/servidor (https://www.clubdelphi.com/foros/showthread.php?t=11556)

Rufus 17-06-2004 12:39:52

Actualizar sólo 1 registro en cliente/servidor
 
Hola.

¿Hay alguna manera de que teniendo un conjunto de datos se actualice sólo un registro concreto, sin tener que volver a actualizar todo el conjunto de registros?

marto 17-06-2004 12:45:57

Código SQL [-]
  UPDATE TABLA
  SET CAMPO1 = VALUE1,
  ..
  CAMPOn = VALUEn
  WHERE CAMPO_CLAVE = VALOR_CLAVE;

??????? :confused::confused::confused::confused::confused::confused::confused:

Rufus 17-06-2004 13:21:51

Creo que no me he expresado bien.

Supongamos que tengo un servidor, y varios clientes en red. Uno de los clientes actualiza un registro en la base de datos, con una instruccion como la que has dicho. En ese momento, el servidor lanza un evento donde en el nombre del mismo, que puede ser de hasta 15 caracteres, incluyo tipo de operacion + nombre de tabla + identificador unico de registro. Es decir que si actualizo el registro 03515 de la tabla clientes puedo lanzar un evento que se llame 'ACli03515'

Bien; los clientes tendran abierto un conjunto de datos en memoria, mediante un componente descendiente del TDataSet de delphi. Es decir, mediante una consulta de seleccion habran seleccionado lo que les interesa y lo tendran ahí (en un TIBQuery o similiar). Supongamos que tengo 10 clientes los cuales han seleccionado unos 100 registros en su consulta.

Si digo que se haga un refresh del dataset, que creo que es como cerrarlo y abrirlo, se actualizaran las consultas con un total de 10*100= 1.000 registros viajando por la red. Pues lo que me gustaria saber es si a ese conjunto de datos se le puede decir que sólo actualice un registro y lo incorpore a lo que ya está, sustituyendo sólo ese registro, asi en el ejemplo sólo viajarian en total 10 registros por la red.

marto 17-06-2004 13:34:42

Uff, hasta dónde llegan mis conocimientos, eso es bastante complicado. Piensa que tu dataset es un cursor abierto directamente en la base de datos, por lo tanto, realmente el cursor no ha cambiado.

A mi se me ocurren dos posibilidades:

1.- Trabaja con un TClientDataset y encargate de cargar en él los datos a pelo. Cuando te llegue la notificación, cambias los valores del registro y listos.

2.- Pagina el dataset de manera que te asegures que nunca nadie tenga 100 registros. No consigues lo que buscabas pero sí minimizar el tráfico de red.

jachguate 17-06-2004 18:12:47

Si usas IBX, tengo entendido que estos componentes únicamente refrescan el registro actual en la implementación de su método Refresh, con lo que lo único que te haría falta es ubicarte en el registro que te interesa.

Hasta luego.

;)

Rufus 18-06-2004 14:20:39

Mirando por ejemplo en el TIBQuery veo que no reimplementa el método Refresh, sino que es el del TDataSet, el cual actualiza todo el conjunto.

Rufus 18-06-2004 15:40:10

Me he dado cuenta de dos cosas:

Una es que el IBDataSet tiene una propiedad llama RefreshSQL, aparte de SelectSQL, etc, así que ahí justamente estaba lo que preguntaba.

Y la otra es que he metido la pata con lo de los eventos, no les puedo dar cualquier nombre, ha de ser un nombre concreto y conocido de antemano. De cualquier manera, eso no es impedimento para lograr lo que proponía.

Gracias a todos

Delfino 21-06-2004 12:02:14

El metodo Refresh del IBDataset actualiza unicamente un registro q es el registro actual, no se q has hecho para q te actualice todo el conjunto de datos, pero por lo menos a mi me actualiza unicamente el ActiveRecord..


La franja horaria es GMT +2. Ahora son las 20:00: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