Hola Amigos de DelphiAccess
La idea de crear este hilo es para resolver la actualización de multiples datasets usando sus Deltas hacia un servidor datasnap 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.
Hay que ponerse en el caso que una cabecera tienen muchos detalles y estos detalles tienen subdetalles exagerando pueden llegar a 5 ó 6 niveles. Para complicar el tema se imaginan si este tiene entidad de relación entre sus tablas, con los famosos atributos IDENTITY's.
1. Seria un poco riesgoso hacer un ApplyUpdate por cada Datasets. ya que tendría que actualizar desde la tabla bebé para llegar al papá(cabecera) si todo no esta en una transacción podríamos tener problemas en la actualización en la base datos.
2. Si 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 cadadataset con Close/Open o Refresh, esto originaria ejecutar nuevamente las consultas por cada Dataset.
He preparado un ejemplo que voy a adjuntar para todos los interesados. Ya que todos pueden dar sus aportes para llegar a la solución del tema Publicado.
Decirles también que esto que estoy compartiendo actualmente está funcionando con componentes ADO, DCOM, MIDAS y SQL Server. La idea es que funcione con DATASNAP también.
Explico un poco el ejemplo que estoy compartiendo:
El ejemplo es sencillo y no tiene todo el mundo de datasets que menciones anteriormente, pero solucionando el problema con uno ya los demas cada amigo del foro lo va usar a su criterio. La idea es que toda la actualización sea controlado en una sola transacción y también decirles que la idea es trabajar con atributos de tipo IDENTITY como PK y entidad de relacion con FK
Servidor:
Se ha creado una conexión a una tabla users que también comparto el script en el archivo. Dentro del servidor se ha creado un método llamado "UpdateDeltas" que este recibe los nombres de los Providers y Deltas a Actualizar. Si revisan el código ahí verán que todo eso se envía en un arreglo de Variants.
Según las pruebas que he realizado con el ejemplo en la parte del servidor no hay problemas. (Eso Creo...)
Cliente:
Para invocar al método definido en el servidor "UpdateDeltas" se pueden hacer de 2 maneras:
1. Usando el componente TSQLServerMethod que configurando la clase del servidor datasnap se tiene el componente listo para invocar al método.
OJO: Yo he configurado el componente pero no me está funcionando ya que si ven el código desde el cliente se envían 2 parámetros OLEVARIANT y el componente al momento de configurar los parámetros del método los pone como VARIANTs y ahí me sale errores que no soporta los parámetros. SI ALGUIEN CAPAZ PUEDE VER QUE PUEDE ESTAR PASANDO... no creo que los de embarcadero no hayan considerado los parámetros OLEVARIANTS para los métodos en DATASNAP.
2. Obteniendo las Clases del Servidor hacia el Cliente(El algunos foros lo conocen como las clases Proxis) y en este caso si me está permitiendo invocar el método definido en el servidor y poder ejecutarlo con los parámetros OLEVARIANTS. Cosa rara porque se supone que es lo mismo. Ahí espero sus comentarios.
Continuando después de definida la llamada al método del servidor se ha definido un procedimiento llamado: ApplyUpdates que ahí lo que está haciendo es preparar la lista de Deltas y Providers los cuales van a ser enviados al Servidor por el método definido en los puntos 1(Con Errores por resolver) ó 2.
El ejemplo que les comparto todo esta funcionando con la excepción de un procedimiento ReconcileDeltas que lo que hace es de todos los Deltas actualizados en el servidor actualizarlos en los ClientDataSets correspondientes. Ahí está saliendo el problema y muestra un error: “Mismatch in datapacket."
Espero no haberlos confundido, yo por mi parte sigo investigando cual puede ser la causa de los 2 problemas que se me han presentado tanto en usar el componente TSQLServerMethod con parámetros OLEVARIANTS y al momento de hacer RECONCILE de los Deltas actualizados en la Base Datos.
Capaz ya a alguien les haya pasado algo similar y de verdad resolver lo que pongo en el tema nos va ayudar bastante a minimizar las llamadas al servidor.
Saludos.
pdta: Archivo lo he publicado en: https://rapidshare.c...46110/DSXE3.zip
Actualización masiva de datasets con datasnap server
Comenzado por
Maniches
, mar 18 2013 09:22
3 respuestas en este tema
#1
Escrito 18 marzo 2013 - 09:22
#2
Escrito 19 marzo 2013 - 08:51
Bienvenido a delphiaccess Maniches
Interesante tu propuesta, asumo que tu ejemplo está desarrollado con XE3, espero que haya varios compañeros que utilicen esa versión, yo aún tengo XE2 profesional.
Saludos
Interesante tu propuesta, asumo que tu ejemplo está desarrollado con XE3, espero que haya varios compañeros que utilicen esa versión, yo aún tengo XE2 profesional.
Saludos
#3
Escrito 19 marzo 2013 - 12:32
Hola amigo egostar
Si intente hacer la prueba en Delphi XE3 con Update 2 y pensé que habían solucionado el problema con esa versión.
Pero sigo con el mismo problema.
El ejemplo que he publicado también debería de poder compilarse en Delphi XE2 ya que no se usa nada en particular que tenga la versión XE3.
Capaz el problema es que algo estoy haciendo mal en la migración que he hecho. Ya que ten presente que menciono que este misma funcionalidad si funciona usando DCOM / MIDAS y Componentes ADO.
Yo creo que si podemos solucionar el código publicado va ayudar a mucha gente ya que solucionaría un posible problema de concurrencia.
Espero las opiniones de los amigos del Foro.
Saludos.
Si intente hacer la prueba en Delphi XE3 con Update 2 y pensé que habían solucionado el problema con esa versión.
Pero sigo con el mismo problema.
El ejemplo que he publicado también debería de poder compilarse en Delphi XE2 ya que no se usa nada en particular que tenga la versión XE3.
Capaz el problema es que algo estoy haciendo mal en la migración que he hecho. Ya que ten presente que menciono que este misma funcionalidad si funciona usando DCOM / MIDAS y Componentes ADO.
Yo creo que si podemos solucionar el código publicado va ayudar a mucha gente ya que solucionaría un posible problema de concurrencia.
Espero las opiniones de los amigos del Foro.
Saludos.
#4
Escrito 19 marzo 2013 - 12:43
Muy bien, espero darme un tiempo para probarlo en mi delphi, sólo que será cuando llegue a casa, acá en el trabajo aún seguimos usando Delphi 2007.
Saludos
Saludos