Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-07-2015
aromigaret aromigaret is offline
Miembro
 
Registrado: jun 2011
Posts: 68
Poder: 13
aromigaret Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 24-07-2015
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
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.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #3  
Antiguo 24-07-2015
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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!
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 24-07-2015 a las 21:18:01.
Responder Con Cita
  #4  
Antiguo 24-07-2015
aromigaret aromigaret is offline
Miembro
 
Registrado: jun 2011
Posts: 68
Poder: 13
aromigaret Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 24-07-2015
aromigaret aromigaret is offline
Miembro
 
Registrado: jun 2011
Posts: 68
Poder: 13
aromigaret Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 25-07-2015
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
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.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #7  
Antiguo 27-07-2015
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 29-07-2015
aromigaret aromigaret is offline
Miembro
 
Registrado: jun 2011
Posts: 68
Poder: 13
aromigaret Va por buen camino
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Actualizar un campo vacio con el valor de otro jafera Firebird e Interbase 4 03-07-2013 19:34:19
¿Como calcular un campo basado en otro campo de otra fila (registro)? AzidRain MySQL 9 19-12-2011 11:34:42
Cómo actualizar tablas provenientes de otro equipo? LizdR Varios 1 10-05-2008 00:58:08
Cargar en un TImagen que está en otro modulo Anunakis Gráficos 2 11-02-2007 23:56:39
como actualizar un solo campo de una BD Nelly Conexión con bases de datos 2 06-12-2005 23:58:31


La franja horaria es GMT +2. Ahora son las 16:07:49.


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