Ir al contenido



Foto

Evitar el uso de callbacks para sistema de gestion


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

#1 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 433 mensajes

Escrito 28 septiembre 2015 - 08:05

Hola amigos, trabajando con DataSnap necesito que al actualizar un  precio en la aplicacion cliente admin(que es una aplicacion separada de la aplicacion que es terminal de punto de venta) se actualize la grilla (dataset) del terminal de puesto de venta.

 

Una alternativa es usar callbacks, lo cual sabemos es un poco complejo(he estado ahondando un poco) hay que tener un metodo que hereda de TDBXCallBack el cual es llamado desde el server.

Lo que me preguntaba es como se reconocen los clientes: hay que tener las ips? si es asi deben ser estaticas.. pero por lo que lei en los tutos de embarcadero se maneja con los channels o canales... me gustaria hacer un tuto sobre esto(si algun dia lo entiendo..).

 

Entonces me pregunto si se puede actualizar el TsqlDataSET, yo trabajo con este componente asociado a un TDataSetProvider, para llenar TClientDataSet del lado del cliente.. Osea tiene un metodo refresh? como los queries normales?

 

Lo mismo necesito en otras situaciones de actualizaciones de datos..

Saludos..


  • 0

#2 genriquez

genriquez

    Advanced Member

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

Escrito 30 septiembre 2015 - 04:32

Hola, separemos la pregunta en dos partes.

 

la primera no la entiendo, ya que no se como quieres actualizar los precios y en que punto lo quieres hacer, si puedes explicar mejor el proceso que quieres realizar en tu programa, sería de gran ayuda.  ya que es probable que no requieras necesariamente los callbacks.

 

En la segunda parte que es el uso de los callbacks, tienes dos opciones, la primera es hacer un broadcast, es decir enviar un mensaje a todos los clientes conectados al servidor, para que realicen una tarea,  para lo cual solo necesitas que estén conectados al servidor y con un nombre de un canal,  el cual es un String que se utiliza en el momento de registrarse y forma "GRUPOS", así puedes enviar mensajes a unas aplicaciones y no a todos los clientes conectados a la aplicación.

 

La otra opción es enviar mensajes a clientes específicos o entre clientes específicos, para ello al momento de registrar se debe crear un identificador único para cada cliente,  y un identificador diferente para identificar la dirección de callback.   o sea requieres dos direcciones diferentes para que el servicio de callbacks funcione.

 

En mi caso, yo lo registro con un numero generado aleatoriamente como el CallBackId,   CallBackId := Random(100000).ToString+'.'+Random(100000).ToString+'.'+Random(100000).ToString;

y el clientId es el mismo CallBackId adicionándole un "-1" al final, ClientId := CallBAckId + '-1', de esa manera los puedo identificar fácilmente.

 

NO se requieren direcciones IP ni nada por el estilo, y conociendo estas direcciones es posible enviar mensajes desde el servidor hacia el cliente o entre clientes directamente.

 

------------------------

 

En una aplicación utilizo el broadcast para enviar una notificación e indicarle a las aplicaciones que estén activas a refrescar ciertos datos.  las que no están activas, pues al momento de abrirse lo tienen que leer, así que no hay problema con ellas.

 

Saludos.


  • 1

#3 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 433 mensajes

Escrito 01 octubre 2015 - 04:19

Mi sistema tiene la aplicacion servidor, un servidor datasnap.

Ademas tengo una aplicacion Cajero para la facturacion, donde se ven los clientes y el catalogo de productos, entre otras cosas.

Y programe por separado una aplicacion administrativa que tambien accede al mismo servidor. Y lo que hace entre otras cosas es permitir al user que modifique el precio de un articulo. Lo que me gustaria es no tener que cerrar y abrir la aplicacion para que se actualizen los precios de los productos que se modificaron. Lo mismo si se inserta un cliente nuevo, etc...

 

Lo que habia pensado era actualizar el TSQLDataSet que llena el clientdataset del lado del cliente... tambien vi la idea de colocar un Timer para que se actualize solo en el cliente cada tanto tiempo, pero queria hacer algo mas robusto o mas idoneo, como por ejemplo que al modificar algo por el secretario administrativo, se modifiquen, en todas las maquinas cliente que son cajero lo correspondiente en el acto...

 

Gracias por tu respuesta


  • 0

#4 genriquez

genriquez

    Advanced Member

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

Escrito 01 octubre 2015 - 05:29

Yo tengo una tabla en mi servidor, donde almaceno una lista de todas las tablas maestras (Principales) y la fecha de la última actualización, y desde el cliente al momento de abrirlo, revisa cual de esas tablas está con fecha superior a la almacenada en el cliente, en ese caso hago una actualización y almaceno la fecha en el cliente.

 

Usualmente estas modificaciones se hacen en horarios no hábiles, para evitar ciertos traumatismos en los almacenes o con cara al cliente.  y en algunos sql que requieren que durante el día no cambia alguna configuración.

 

Pero si lo que quieres es que inmediatamente se realice esta acción cuando se modifica un registro, pues lo mejor es enviar un callback a un "grupo" o Canal, con un mensaje especifico, en este caso, actualice los maestros.  es un broadcast a un canal especifico, así cada aplicación conectada al servidor se registra en el canal,   Ej. "CanalCajeros", "CanalAdministrador", etc.

 

Saludos.


  • 0