Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Como actualizar un campo modificado por otro modulo (https://www.clubdelphi.com/foros/showthread.php?t=88733)

aromigaret 24-07-2015 00:29:16

Como actualizar un campo modificado por otro modulo
 
Hola, estoy desarrollando un sistema de facturación para mi negocio implementando la factura electrónica. Mi problema radica en que, el modulo de facturación deja en un registro de una tabla (ventas) toda la información necesaria para solicitar un permiso a la Afip (Ente fiscal) y queda esperando (por 1 minuto como máximo), que en ese mismo registro, en el campo "CAE", otro modulo independiente (quien solicita los permisos a la Afip) deje la información devuelto por la Afip. Pero el modulo de facturación nunca se entera de que el campo "CAE" fue cambiado. Imagino que en el modulo de facturación, debo actualizar el registro para obtener la modificación hecha por el otro modulo, pero no se como hacerlo sin correrme de ese registro, ya que puede haber multiples pedidos de autorización y no sabría cual pido esta terminal ya que el sistema esta pensado para usar en varias terminales. Uso sql server 2008 y ado. Desde ya muchas gracias

Ñuño Martínez 24-07-2015 13:29:52

Hola aromigaret.

La pregunta es, cuando hablas de módulos, ¿hablas de programas diferentes, o de unidades dentro de una única aplicación? Y si son programas diferentes, ¿están en ordenadores diferentes o en el mismo?

Estas preguntas las hago porque, según el caso, se puede hacer de forma más directa y no estar pendiente de la base de datos. La única forma de saber si se ha modificado algo es hacer consultas a la base de datos y comparar los datos. No hay otra.

En mi opinión es mejor que los módulos se comuniquen directamente entre sí, y no depender de la base de datos.

Lepe 24-07-2015 21:11:42

En Firebird se hace mediante triggers y eventos, en SQL server veo que también existen, pero no sé si se usa igual.

Creas un trigger after insert y after update para la tabla en cuestión.
En el código del trigger lanzas un evento "campo cambiado" y tu aplicación debe escuchar esos eventos para actuar en consecuencia cuando le llegue el mensaje "campo cambiado".
https://msdn.microsoft.com/es-es/lib...ql.120%29.aspx
https://msdn.microsoft.com/en-us/library/ms189453.aspx

También tiene otra cosa llamada "Extended Events" y creo va destinado a otro uso... pero échale un vistazo.
https://technet.microsoft.com/es-es/...ql.105%29.aspx

Lo bueno de los eventos de BBDD, es que se mandan a todos los clientes que estén conectados a esa BBDD escuchando esos eventos. Da igual si el cliente está por internet, por red local o en el mismo ordenador.

Lo que no sé si puedes modificar ambos módulos para que escuchen estos eventos.

Suerte!

aromigaret 24-07-2015 22:48:07

Estimado Ñuño, gracias por contestar a mi pregunta.
Modulo, me refiero a programa, perdón por no haber sido más claro. Te cuento como diagrame la secuencia. Realice un programa de facturación el cual se ejecuta en varias terminales. Cuando se da la orden de imprimir, agrega un registro en la tabla “Ventas” con toda la información requerida por la Afip para que ésta devuelva un string si aprueba la operación. El programa de facturación queda esperando que en dicho registro, en el campo “Cae”, cambie de vacío a la string devuelta por la Afip. Para que esto ocurra, realice un programa “Autorización” que se ejecuta en segundo plano, en una computadora que oficia de servidor y realiza la autorización, levantando la información cuando encuentra un registro donde “Cae” está vacío, poniendo luego allí la string de autorización y el número de comprobante autorizado.
Esto lo diseñe así, porque al haber varias terminales de facturación, existe la posibilidad de que pidan autorización del mismo número de comprobante para distintos clientes. En cambio si se hace uno a la vez (registro por registro) esa posibilidad es nula.
Mi problema, es que “Facturación” nunca se entera, que “Autorización” cambió el campo “Cae”. Si pido una actualización en “Facturación”, (uso un AdoQuery para referirme a “Ventas”), pierdo al registro donde estaba esperando al campo “Cae”.
He probado con Q_Ventas.Recordset.Requery y no actualiza nada.
Tal vez tenga que poner en el registro que genera "Facturación" un numero interno para que lo identifique después de realizar la actualización. Quería evitar esto pero no se me ocurre otra idea.
Espero haber sido claro. Gracias por tu tiempo

aromigaret 24-07-2015 22:52:39

Lepe, gracias por tu interés. Había visto el tema de triggers, pero muy por arriba. No se si lo que me sugieres me sirve, pues el evento debe devolverle solamente a la terminal que solicito esa información y no a todas. Investigare mas sobre el asunto. Muchas gracias.

Ñuño Martínez 25-07-2015 12:51:24

Es posible que lo de los triggers funcione. Yo nunca los he usado así que no sé cómo funciona, pero parece ser la solución que buscas.

Lepe 27-07-2015 23:05:54

El trigger creo que sirve porque es quien se entera que un campo de una tabla se ha modificado. En SQL suele ser " NEW.cae <> OLD.cae"

OLD y NEW son palabras reservadas para saber si el campo "cae" ha cambiado de valor.

OLD es el valor antiguo que tenía el campo
NEW será el valor nuevo que va a grabarse.

Al menos en firebird me permite crear un evento con un nombre personalizado, por ejemplo post_event "CAE_HA_CAMBIADO " || tabla1.NombreOrdenador

Si el nombre o IP del ordenador que ha realizado la petición, la guardas en el mismo registro, lo puedes usar en el propio evento, así cada terminal solo hace caso a los eventos que traen su nombre.

Siento no poder dar más info concreta de lo que necesitas.

aromigaret 29-07-2015 01:11:16

Lepe, te estoy muy agradecido por tu tiempo. Como mencionaste, lo mejor es usar triggers. Cambiando un poco la lógica que había diseñado, pude hacer lo que quería, pero de otro modo y aplicando tu consejo. Muchas gracias nuevamente.


La franja horaria es GMT +2. Ahora son las 21:41:11.

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