Ver Mensaje Individual
  #2  
Antiguo 06-12-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Hola!

Es normal lo que obtienes.

Al aplicar los cambios al servidor (llamando al método ApplyUpdates) no hay un mecanismo que automáticamente realice una nueva consulta. En cliente-servidor y esquemas superiores esta es una de las grandes diferencias con respecto a las bases de datos de escritorio, donde después de guardar un registro el motor te devuelve en automático una "imagen" de lo que al final quedó registrado.

En cliente-servidor es diferente, y aunque algunos motores ya implementan "respuestas al guardado", no es algo que esté estandarizado ni soportado plenamente por dbExpress, ADO, IBX, etc. Se da por entendido que el servidor no responde con datos de campos a una operación Insert o Update. Es necesaria una nueva consulta.

Ahora, cuando haces un ClientDataSet.RefreshRecord, sólo estás diciéndole que le pida al proveedor la última copia que fue leída del registro actual, la cual se encuentra todavía en algún lugar de la memoria, pero NO se realiza una nueva consulta Select.

Ante esto, hace ya tiempo que implementé mi propio "RefreshRecord consultante". La esencia del mismo es:

1. Eliminar de memoria la fila actual del conjunto de datos cliente.
2. Ignorar por completo ese registro llamando a MergeChangeLog.
3. Consultar con otro conjunto de datos cliente el registro que se quiere volver a leer, mediante un proveedor conectado a una consulta SQL que tenga como parámetro de entrada el "ID" del registro a consultar.
4. Copiar de este segundo conjunto de datos el registro recién leído al primer conjunto de datos. Esto último lo consigues con una sentencia como:

Código Delphi [-]
CDS1.AppendData (CDS2.Data, True);

Parece mucho trabajo, pero, como ya has visto, la poco deseable alternativa es llamar al método Refresh, el cual haría una nueva y costosa consulta de todas las filas, cuando realmente sólo necesitas releer una de ellas.

Si optas por implementar el mecanismo de los cuatro pasos que mencioné, te recomendaría encapsularlo en alguna función, o, mejor aún, en clases de objetos derivadas, para que cada vez que lo uses sea más conciso tu código (entre otras ventajas).

Espero haber orientado un poco. No dejes de contarnos.

Al González.

Última edición por Al González fecha: 22-01-2009 a las 20:23:07.
Responder Con Cita