Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Providers
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-11-2012
Avatar de Maniches
Maniches Maniches is offline
Miembro
 
Registrado: nov 2012
Ubicación: Lima - Perú
Posts: 67
Poder: 12
Maniches Va por buen camino
Thumbs up DataSnap XE3 - Actualización masiva de datasets con datasnap server.

Hola Amigos de ClubDelphi

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.
Archivos Adjuntos
Tipo de Archivo: zip DSXE3.zip (189,9 KB, 61 visitas)
__________________
Maniches
maniches@outlook.com
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Conectar varias Bases de Datos con Server DataSnap gcaffe Providers 5 22-05-2016 01:55:09
DataSnap XE3 - Actualización masiva de datasets con datasnap server. Maniches Conexión con bases de datos 0 08-11-2012 07:11:39
DataSnap Server Remoto - Delphi XE mrh_peru Providers 4 30-10-2011 03:51:06
datasnap para sql server??? _CALI Conexión con bases de datos 5 25-04-2011 18:49:04
Actualizacion masiva con trigger lledesma SQL 1 22-04-2009 23:24:09


La franja horaria es GMT +2. Ahora son las 15:40:54.


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
Copyright 1996-2007 Club Delphi