Ir al contenido


Foto

DataSnap o webservice en varias sucursales


  • Por favor identifícate para responder
17 respuestas en este tema

#1 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 09 octubre 2014 - 10:22

Bueno como ya comente en otros hilos, aprendi a usar webservices en delphi, y trabajo en un sistema que deberia andar en varias sucursales.
Uso MYSQL y delphi xe2 con componentes zeoslib.

Los webservices brindan la posibilidad de que la aplicacion cliente pueda ser desarrollada en varios lenguajes como por ejemplo la AFIP de argentina probee varios webservices para la facturacion online, pero el cliente se puede desarrollar en delphi o en otro lenguaje. Pero la aplicacion de esta empresa solo la desarrollo yo mismo, entonces esto no es una ventaja?

Pense en DataSnap porque permite hacer de servidor en LAN(dentro de cada sucursal), digo esto porque tuve el problema de que sucederia si se corta internet, debo desarrollar uno por sucursal, y luego al retornar la conexion llevar al central los datos. Por otro lado: ¿no seria mejor levantar los datos cuando es necesario? A fin de mes o como sea?

Cuando se me ocurrio lo de llevar los datos una vez por mes (por ej: deuda de los clientes con cuenta)al central pense lo siguiente: ¿como accedo a un servidor datasnap desde "fuera" de la LAN? Este mismo problema lo tendria para actualizar el precio de un producto por ej. Si un administrador o jefe quiere actualizar un precio a mitad de mes.. esta y otras consultas. En mi aplicacion el webservice de la sucursal tiene un metodo que actualiza el precio que es llamado desde el central.

Y la ultima pregunta importante es: ¿seria mas facil desarrollar un servidor DataSnap que un webservice?
  • 0

#2 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 09 octubre 2014 - 04:43

Hola

Me queda la inquietud, de que harías si creas webservices y se cae la conexión?  no pasaría lo mismo con DataSnap si se cae la conexión?

En la parte de Cliente de DataSanp puedes tener la oportunidad de guardar localmente información básica para poder seguir trabajando algunas cosas sin conexión y al momento de conectarse sincronizar todo automáticamente.  esas son algunas de las ventajas de utilizar esta tecnología, cosa que no es fácil implementar con WS.

Con la versión XE5 (No recuerdo si la XE2 lo tiene) puedes habilitar para que DataSnap también comparta datos en formato REST con JSON de forma automática y sin desarrollar más código.

Una de las grandes ventajas que he encontrado con DataSnap que supera a los WS como SOAP y REST es la velocidad de desarrollo, así como en tu caso tu desarrollas el cliente como el servidor,  puedes contar con tiempo extra para hacer mejores cosas. y si algún cliente externo quiere desarrollar algo, puedes habilitar (si es posible en la versión) el uso del protocolo REST.

Saludos.


  • 0

#3 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 10 octubre 2014 - 03:19

Hola

Me queda la inquietud, de que harías si creas webservices y se cae la conexión?  no pasaría lo mismo con DataSnap si se cae la conexión?

En la parte de Cliente de DataSanp puedes tener la oportunidad de guardar localmente información básica para poder seguir trabajando algunas cosas sin conexión y al momento de conectarse sincronizar todo automáticamente.  esas son algunas de las ventajas de utilizar esta tecnología, cosa que no es fácil implementar con WS.

Con la versión XE5 (No recuerdo si la XE2 lo tiene) puedes habilitar para que DataSnap también comparta datos en formato REST con JSON de forma automática y sin desarrollar más código.

Una de las grandes ventajas que he encontrado con DataSnap que supera a los WS como SOAP y REST es la velocidad de desarrollo, así como en tu caso tu desarrollas el cliente como el servidor,  puedes contar con tiempo extra para hacer mejores cosas. y si algún cliente externo quiere desarrollar algo, puedes habilitar (si es posible en la versión) el uso del protocolo REST.

Saludos.


Con webservice deberia tener uno por sucursal y llamarlo desde el central, pero entonces se puede acceder por internet a DataSnap y es mas facil de desarrollar.
Lo bueno de los webservice es que se comparte la interfaz del servicio con sus funciones y datos para que cualquiera los acceda(cualquiera que no lo desarrollo).

Muchas gracias por responder
  • 0

#4 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 11 octubre 2014 - 06:35

Hola, creo que no entendí bien, podrías explicar mejor?  tal vez podamos así hacer un mejor diseño.


Saludos.
  • 0

#5 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 12 octubre 2014 - 06:39

Tu me preguntaste en la primera respuesta como haria si se corta internet con webservice? pues yo estaba diseññando un webservice por sucursal y uno central, por eso preguntaba: con datasnap seria igual un servidor por sucursal, igual debe haber uno central.
Inclusive desarrolle 2 aplicaciones clientes: un terminal de puesto de venta (el mismo para todas las sucursales) y un programa mas administrativos(para el jefe o secretarios)
  • 0

#6 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 12 octubre 2014 - 07:57

Ok. bajo ese esquema es igual que lo hagas con SOAP o con DataSnap.  puedes crear uno para cada sucursal y si se cae internet tendrías exactamente lo mismo en ambos mundos.  allí no hay diferencia.

Yo tengo varias aplicaciones realizadas con DataSnap,  pero tengo un servicio central, donde todas las sucursales acceden para su trabajo rutinario, tengo 340 computadores en 70 sucursales a lo largo del país, obviamente con una buena infraestructura.  lo importante allí es tener servidores de respaldo, por si se cae una conexión a internet, se tenga donde trabajar si es necesario continuar la operación.

Ten en cuenta que DataSnap igual que Soap y REST pueden trabajar desconectados (State Less), es responsabilidad tuya suministrar la información necesaria en cada llamado para que esto suceda así, estos ignifica que si un servidor se cae, automáticamente podrías conmutar a otro y continuar con la operación sin problemas.

Con un esquema así puedes tener varios servidores e ir creciendo fácilmente, ya que podrías adicionar solo un servidor más y el numero de clientes que puedes soportar se aumenta sin problemas considerables,  puedes aplicar así también el balance de carga.  (todo esto con cualquiera de las tres tecnologías).

Si el origen y el destino están en Delphi, no hay problema en utilizar DataSnap, y tienes la ventaja que el desarrollo  y el mantenimiento de estas aplicaciones es muchísimo más rápido,  si tienes que interactuar con clientes que no son Embarcadero (Delphi o C++) podrías utilizar REST o Soap,  pero si tienes las últimas versiones de RadStudio,  todo lo que hagas con DataSnap, lo puedes habilitar para que exponga los datos automáticamente en REST e incluso incluye librerías en Java y JQuery para ser utilizado desde el cliente que construyas en otras plataformas.  con eso tienes lo mejor de los dos mundos.

Saludos.
  • 0

#7 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 12 octubre 2014 - 11:49

Bueno en mi caso solo tendria un solo servidor central ya que es suficiente.
Ademas me parece que se complica el hecho de agregar un servidor, porque si tienes 2 servidores centrales debes coordinar los datos, es decir distribuir la base de datos, cada servidor atenderia un grupo de clientes, en mi caso las terminales de venta. Pero el servidor central si esta dividido se debe consultar en ambas partes..ejjeje
Osea voy a desarrollar un servidor pero uno solo que levante de sucursales, mas adelante vere si puedo distribuir y hacer algo mas complejo.

Saludos...
  • 0

#8 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 12 octubre 2014 - 05:23

Hola tal vez no me hice entender.

El hecho que tengas varios servidores de DataSnap no quiere decir que debas tener varias bases de datos,  para evitar caídas desde el lado del servidor, se puede tener dos o tres o cuatro servidores datasnap conectados con diferentes proveedores de internet (redundancia) y todos conectadas a una sola base de datos en la configuración que gustes de la base de datos.

Efectivamente es muy complicada la sincronización de bases de datos y eso aunque yo lo tengo es una piedra en el zapato, pero bueno esas son exigencias de mi cliente.

Lo que quiero decir es que la arquitectura de servidores middleware es muy buena y sirve para crecer todo lo que quieras, solo hay que adicionar servidores DataSnap, ya que la mayoría del trabajo y el proceso queda en el servidor Middleware, descargando la base de datos y descargando el cliente, que ya puede ser un celular o una Tablet, sin problemas. 

Saludos.


  • 0

#9 chaja

chaja

    Advanced Member

  • Miembros
  • PipPipPip
  • 54 mensajes

Escrito 22 diciembre 2014 - 09:10

Hola Gustavo:
Por lo que veo tenes bastante claro lo de DataSnap. Mi nombre es Luis Roldan, soy de Argentina, de la ciudad de Mar del Plata.
COn respecto a lo dicho en la conversacion, no me quedo claro que es mejor si DataSnap o WebService.
Por otra parte estoy haciendo mis primeras armas en DataSnap, y al parecer todo bien. Te cuento que tengo un sistema de gestion y arme un servidor DataSnap, para que luego puntos de Ventas que estan en capital, puedan generar las vtas grabando los datos aca en Mar del Plata. Uso Interbase y estoy en Delphi XE5. Mientras la coneccion es estable todo bien, pero cuando el ancho de banda decrece empieza a mermar el rendimiento. Acostumbrado a la forma de Escritorio Cliente-Servidor usando ClientDataSet, hago un insert en las tablas y voy agregando los datos y luego hago el applyUpdate. todo anda bien, pero pregunto: tengo forma yo de que si la coneccion con el servidor se pierde, se recupere de nuevo? , pues hay veces que parece haber microcorte en internet y al hacer una consulat o intenta hacer el applyupdate me da error de remoto. O detectar en el cliente cuando se pierde coneccion con el servidor.
Como puedo hacer para que en estos casos siga todo normal o casi normal. El echo que veo que en aplicaciones erp del tipo web, si la internet anda mal o se corta unos instates, al restablecerse todo sigue su cause o al menos eso parece.
Gracias por tu tiempo..

Luis Roldan
  • 0

#10 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 22 diciembre 2014 - 09:33

Hola

Efectivamente esto ocurre y es allí donde hay que comenzar a implementar el manejo StateLess (Desconectado), el cual incluye:

1. Si se ha perdido la conexión, antes de realizar una operación con los dataset, es necesario recuperarla. (Desconectar y conectar nuevamente)
2. Si se reconecta, entonces debe ser necesario enviar toda la información necesaria para que se realice la transacción.

en el primer caso yo utilizo una rutina que intenta guardar, si no es posible revisa si está conectado y si no lo está se reconecta, ya con esto realizar un applyupdates debería ser transparente.  (Se captura el error al guardar)

si no es posible reconectarse, también es posible guardar la información del TClientDataSet en un archivo local y al lograr recuperar la conexión,  se carga el archivo local y se aplica.

Ej.


delphi
  1.   CDS.SavetoFile('localfiledata.cds');
  2.  
  3. Para recuperarlo
  4.   CDS.Open;
  5.   CDS.LoadFromFile('localfiledata.cds');
  6.   CDS.ApplyUpdates(0);





  • 0

#11 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 23 diciembre 2014 - 09:56

Entonces stateless permite que el sistema trabaje sin conexion al servidor por no haber internet?

Por ejemplo se podrian tener archivos en local para tener los datos, el tema es que estos archivos deben estar actualizados, sino habria que tener una LAN dentro de cada sucursal con una bd, pero el caso es que despues hay que levantar datos de todas las bd y actualziarlas. Es mejor pero complica un poquito.

No se como funciona stateless para que el sistema continue...
  • 0

#12 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 23 diciembre 2014 - 06:55

Cuando decimos stateless tiene que cumplir minimo con dos condiciones.

1. Que se pueda desconectar y conectar al servidor sin alterar el proceso que se esté realizando.
2. Que en cada llamado al servidor, vaya incluida toda la información que se requiere para realizar la función solicitada.

solucionar la primera puede ser fácil, solo debes preguntar si hay conexión,  puede ser intentando aplicar las modificaciones y si no se puede,  restablecer la conexión e intentar de nuevo.

la segunda si requiere saber que información se requiere para ejecutar cada consulta o actualización, usualmente no hay problema después de restablecer la conexión, pero si requieres más información habría que enviarla junto con la consulta, si es del caso te puedo explicar como se hace, pero primero prueba a ver si así no mas te funciona.

Saludos.

  • 0

#13 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 23 diciembre 2014 - 10:21

Pero estamos hablando de que se corta internet, si la conexion podria ser reestablecida, no tiene sentido preveer el corte de internet. Lo que debo hacer es prevenir esta situacion.

No hay algun manual de esto?
  • 0

#14 chaja

chaja

    Advanced Member

  • Miembros
  • PipPipPip
  • 54 mensajes

Escrito 24 diciembre 2014 - 06:38

Ahora pregunto:
El manejo de la atomicidad de los datos. EN el formato de Cliente - Servidor, cuando inicio una operacion, de venta, cobranza o lo uqe sea al momento de gravar los datos, abro una transaccion. He usado durante mucho tiempo una unidad llamad CDSUtil, la cual tiene un procedure el cual acepta un Array de ClientDataSet y sus DataSetProvider. La unidad se encarga de iniciar la Tx , comitea, y si pasa algo te hace el rollback y queda todo bien.
En DataSnap, decis que la Tx es conveniente que las maneje el servidor y no el cliente. Yo habia implementado 3 metodos que los invocaba del lado del cliente : IniciarTx, CommitTx, RollbackTx,al parecer todo bien, pero debido a este problema de cortes me quedan Tx inconclusas en el servidor debido a que si pasa algo y no hay coneccion el rollback no lo hace. Estoy queriendo entonces pasar los ClientDataSet como parametros a un procedimiento en el servidor, pero no se como.
La pregunta es como haces tu, para gravar varios dataset, mandar una cadena de todos los campos de la tabla como parametro me parece mucho, mas si son mas de 100 campos, ademas genero los movimientos de Fondos mediantes storeProc.
Me podes Orientar? por favor, no encontre mucha info sobre el tema, solo una publicacion de Jose castillo que habla del tema, pero no pude implementar por que esta en Delphi2007. http://edn.embarcade...m/article/38652
Fijate en que me podes ayudar, como te decia no encontre mucha info sobre el tema
Gracias
Luis Roldan
Mar del Plata


  • 0

#15 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 24 diciembre 2014 - 05:34

Hola Las transacciones las puedes seguir manejando igual que hasta ahora con tu utilidad,  capturas todos los tclientdataset y luego los envías a una función, que se encargara en el lado del servidor, de iniciar la transacción, aplicar los datos y commit o rollback según sea el caso y la función retornará si fue exitosa o no.

Esa es la forma correcta de realizar una transacción en un ambiente desconectado.  Recuerda que cuando envias un TCDS  este se puede conectar nuevamente a la tabla, cargar los datos y aplicar cambios, que es lo que se hace en este caso en el servidor por cada uno de los TCDS que tienes en el array.

Así es como se hace desconectada, si la conexión se cae, simplemente se conecta nuevamente a cualquier servidor disponible y se envían todos los datos para realizar la transacción nuevamente.

Saludos.
  • 0

#16 chaja

chaja

    Advanced Member

  • Miembros
  • PipPipPip
  • 54 mensajes

Escrito 24 diciembre 2014 - 11:58

giulichajari:
ok, como te decia la unidad, el procedimiento que se llama 
procedure CDSApplyUpdatesIBX(DMMain_2.SQLConectionMain, ArrayCds, ArrayDsp, OnApply);
El arrary de los clientedataset, to bien, pero como puedo generar el array de los DataSetProvider, ya que del lado del cliente no los tengo.???

Feliz Navidad...


Luis Roldan
  • 0

#17 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 25 diciembre 2014 - 04:06

giulichajari:
ok, como te decia la unidad, el procedimiento que se llama 
procedure CDSApplyUpdatesIBX(DMMain_2.SQLConectionMain, ArrayCds, ArrayDsp, OnApply);
El arrary de los clientedataset, to bien, pero como puedo generar el array de los DataSetProvider, ya que del lado del cliente no los tengo.???

Feliz Navidad...


Luis Roldan


La verdad no se como estas trabajando.. yo lo que hago del lado del cliente es hacer click en Generate DataSnap Client Classes en el SQLConnection del Clinet Module.

Felicidades!
  • 0

#18 chaja

chaja

    Advanced Member

  • Miembros
  • PipPipPip
  • 54 mensajes

Escrito 28 diciembre 2014 - 01:14

Hola :
comentabas es

Hola Las transacciones las puedes seguir manejando igual que hasta ahora con tu utilidad,  capturas todos los tclientdataset y luego los envías a una función, que se encargara en el lado del servidor, de iniciar la transacción, aplicar los datos y commit o rollback según sea el caso y la función retornará si fue exitosa o no.

Esa es la forma correcta de realizar una transacción en un ambiente desconectado.  Recuerda que cuando envias un TCDS  este se puede conectar nuevamente a la tabla, cargar los datos y aplicar cambios, que es lo que se hace en este caso en el servidor por cada uno de los TCDS que tienes en el array.

to

Ahora como lo implementas????
como envio el array de los CDS, pero me faltan los Providers que estasn conectados e los ClientDataSet. Como serica un ejemplo sencillo del lado del cliente y del servidor por ejemplo con dos CDS

  • 0




IP.Board spam blocked by CleanTalk.