Ver Mensaje Individual
  #2  
Antiguo 09-11-2012
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 Manuel.

Disculpa que no respondiera antes a tus mensajes. Me parece bien que hayas abierto este nuevo hilo para tratar de resolver entre los compañeros las inquietudes que te aquejan.

Pero hay que ir por partes, porque es un tema amplio el que planteas. Además pienso que puedes no tener muy claros algunos conceptos. Decir también que mi experiencia con el nuevo DataSnap (Delphi 2009 en adelante) es todavía poca, pero a ver si podemos ayudar. Conmigo ten paciencia porque dispongo de poco tiempo para los próximos días. Por tu parte debes estar dispuesto a dedicar lo que sea necesario a comprender y poner en práctica todo lo que discurra aquí.

Creo conocer un poco la clase TClientDataSet, digamos que es el área donde me siento más seguro dentro de todo este terreno, pero hay compañeros que dominan mejor la práctica de montar sistemas multicapa con DataSnap. A estos los animo a aportar su conocimiento, porque seguro que no sólo a Maniches le servirá.

Analicemos el siguiente punto (evitemos los demás hasta que éste quede resuelto):

Cita:
Empezado por Maniches Ver Mensaje
[...] y que luego de haber actualizado la información en el motor de base datos estos Deltas se actualicen en los ClientdataSets del Cliente. Puede ser mediante RECONCILE o otro forma que se vea conveniente. [...] luego de hacer la actualización a la base datos viene otro problema ya que hay que refrescar el cache de los ClientDataSets por el lado del cliente, la forma sencilla seria refrescar cada dataset con Close/Open o Refresh, esto originaria ejecutar nuevamente las consultas por cada Dataset.
Primero aclarar que Delta es, como dice la ayuda de Delphi sobre la propiedad TClientDataSet.Delta: un paquete de datos del registro de cambios.
Cita:
Use Delta to pass a packet of change log data from the client dataset to a provider. Delta contains only information about those records inserted, modified, or deleted through the client.
En segundo lugar, debes saber que el método TClientDataSet.Reconcile tiene como propósito limpiar el registro de cambios del conjunto de datos después de que su Delta fue enviado al servidor con ApplyUpdates (para grabar todos los cambios en la base de datos), pero habiendo ocurrido impedimentos para guardar alguno(s) de esos cambios —como al intentar la inserción de un registro con la misma clave que otro—.

El mismo método ApplyUpdates se encarga de llamar a Reconcile cuando el servidor rechaza alguno de los cambios. Reconcile tiene varias formas de tratar con esos cambios rechazados, entre ellas disparar el evento OnReconcileError para que sea el programa (el programador de la aplicación) quien determine qué hacer (ignorar, corregir el campo en cuestión y reintentar, etcétera).

Reconcile y OnReconcileError no sirven para "refrescar" los registros que tiene en memoria el conjunto de datos cliente. No es ese su propósito.

Varios motores soportan la devolución de datos automática tras una inserción (Insert Into) o actualización (Update). Esto podría ayudarte a "refrescar" en memoria los cambios que adicionalmente el servidor haya realizado mediante disparadores Before Insert y Before Update, pero desconozco qué tan fácil sería montarlo sobre los mecanismos habituales de comunicación TDataSetProvider-TClientDataSet, además, también dependerá de la conexión que uses (ADO, dbExpress, IBX) y cómo ésta última soporte el "returning" de los Inserts y Updates en tu versión de Delphi (yo no he revisado).

Imagino que no ha de ser imposible canalizar esa devolución del servidor hasta la aplicación cliente, para que ésta actualice su "caché" de registros (TClientDataSets), ya que tanto TDataSetProvider como TClientDataSet posibilitan la transmisión de todo tipo de información.

Pero antes de intentar ese camino, considera que hay por lo menos otra forma en que un conjunto de datos cliente puede refrescar los registros que ha enviado al servidor, sin tener que hacer un completo Refresh o Close + Open. Consiste en consultar con un TClientDataSet auxiliar aquellos registros que nos interesan, y luego copiarlos al primer TClientDataSet. En este hilo se trató el tema. Creo que te puede servir.

Cierto, eso supone volver a hacer una consulta al Servidor, pero al menos no traes de él todos los registros que ya tienes en memoria, sino solamente los que acabas de mandar, reduciendo significativamente el peso de la solicitud.

Nos leemos pronto, saludos...

Al González.
Responder Con Cita