Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-01-2009
Avatar de totote
totote totote is offline
Miembro
 
Registrado: oct 2006
Posts: 150
Poder: 18
totote Va por buen camino
Unhappy Trasacciones Firebird dbExpress

Hola gente del foro, en los últimos días me ha surgido un problema con las transacciones y no se como solucionarlo, actualmente utilizo Delphi 2007 con componentes de conexion dbExpress y el motor de base de datos Firebird 2.0.

La situación es la siguiente, tengo dos usuarios en la base de datos ademñas de SYSDBA,Usuario1 y Usuario2, en un modelo de facturación, tengo una tabla donde guardo el número para la siguiente factura, en la situación ideal, inicio una transacción, tomo el valor de la factura de la tabla numero_comprobante, actualizo ese registro al siguiente número, creo una nueva factura y le asigno el número obtenido, al finalizar hago un commit para guardar los cambios, en caso de que se genere un error se hace un rollback para volver todo a su estado anterior. Esto funciona en el caso de que un usuario esté accediendo a estas tablas, pero el problema surge cuando se da esta situación, el Usuario1 inicia la transacción, obtiene el número de la factura y actualiza el registro al siguiente número, y mientras se completa la factura, en ese mismo instante el Usuario2, inicia otra transacción (estamos hablando de que cada usuario se encuentra en una PC diferente, pero conectados a la misma base de datos), obtiene el número de la factura y cuando actualiza el registro con el siguiente número este, por decirlo mal y pronto, se queda colgado, y si el Usuario1 cancela su factura el Usuario2 continua sin ningún problema, pero si el Usuario1 guarda los cambios, al Usuario2 el sistema le genera un error y no lo deja continuar.
Mi duda es, si se puede detectar una transacción iniciada por otro usuario, para prevenir que se "cuelgue" el sistema y por ende no me genere el error, cosa de que si lo detecto, poder mostrar un mensaje diciendo "En este momento no se puede realizar esta tarea, intentelo más tarde" o algo parecido.

Saludos
__________________
¡Oh nooo! no compartas, compartir es pirateria, compartir te llevara a la carcel - Revolution OS
Responder Con Cita
  #2  
Antiguo 06-01-2009
Ingeniero Ingeniero is offline
Miembro
 
Registrado: ene 2006
Posts: 75
Poder: 19
Ingeniero Va por buen camino
Talking ...He utilizado...

...Yo, para esos casos, no utilizo procesos transaccionales, para eso utilizo un proceso normal (sin begin transac bien sea de sql o delphi) donde en una tabla tengo un campo de secuencia, bien sea numeric, que me controle la secuencia de las facturas, y en la tabla de Facturas utilizo este mismo campo, desde luego, ademas del campo Codigo Factura que este si lo grabo con un max sql de Delphi al momento de guardar, mientras que el otro campo controlo y genero su proxima secuencia al momento de generar una nueva factura, de la misma forma como utilizas tu el campo de codigo de factura. Espero te sirva esta idea, Cordial Saludo y Feliz Año!!!...
Responder Con Cita
  #3  
Antiguo 06-01-2009
Avatar de totote
totote totote is offline
Miembro
 
Registrado: oct 2006
Posts: 150
Poder: 18
totote Va por buen camino
Hola ingeniero, primero gracias por responder y Feliz Año para vos también.

Lo que utilizas es muy parecido a lo que hago yo, capaz que no me explique bien, pero sigo teniendo el mismo problema, la solución decis funciona correctamente con un sistema mono usuario, pero para un sistema multiusuario se genera el problema que si dos usuarios quieren tomar un número a la vez y al que primero se le dio el numero cancela la factura mientras que al segundo acepta esto dejará un hueco en la secuencia.

Saludos y nuevamente muchas gracias por contestar
__________________
¡Oh nooo! no compartas, compartir es pirateria, compartir te llevara a la carcel - Revolution OS
Responder Con Cita
  #4  
Antiguo 06-01-2009
Avatar de Kipow
Kipow Kipow is offline
Miembro
 
Registrado: abr 2006
Ubicación: Guatemala
Posts: 329
Poder: 19
Kipow Va por buen camino
Yo lo que hago es utilizo un numero correlativo para guardar las facturas ( en mi caso son pedidos) este es independiente del numero fisico de la factura, al momento de emitir la factura es que inicio la transaccion y ejecuto un store procedure que hace n cosas, en el procedure hago un bloqueo de la tabla donde guardo el correlativo de facturas y al terminar el procedure pues hago el commit a la base. con eso cero clavos tengo clientes con mas de 10 puestos de ventas utilizando el mismo correlativo de facturas.
Responder Con Cita
  #5  
Antiguo 06-01-2009
Avatar de totote
totote totote is offline
Miembro
 
Registrado: oct 2006
Posts: 150
Poder: 18
totote Va por buen camino
Hola Kipow, es una interesante solución la tuya, no es por menospreciar la solución de ingeniero, también es valida pero no la puedo utilizar en este caso. Volviendo con Kipow, ¿podrias postear el código que utilizas en tu procedimiento para bloquear la tabla?
__________________
¡Oh nooo! no compartas, compartir es pirateria, compartir te llevara a la carcel - Revolution OS
Responder Con Cita
  #6  
Antiguo 06-01-2009
Ingeniero Ingeniero is offline
Miembro
 
Registrado: ene 2006
Posts: 75
Poder: 19
Ingeniero Va por buen camino
Talking

...Me refiero, en mi idea, a que utilizo Dos campos de secuencia independientes (para controlar ambas secuencias), digamos que uno de los campos representa el control de la secuencia interna y el otro el control de la secuencia de codigos de Facturas), y esta solucion me Funciona perfectamente en ambiente multiusuario (n terminales) sin ningun problema, ahora bien, si deseas un proceso mas refinado pues la solucion de Kipow es la ideal; Saludos Cordiales!!!...
Responder Con Cita
  #7  
Antiguo 06-01-2009
Avatar de totote
totote totote is offline
Miembro
 
Registrado: oct 2006
Posts: 150
Poder: 18
totote Va por buen camino
Red face

ahhh ahora te entiendo un poco más ingeniero, pero igual no termino de entender el proceso que utilizas.

Tenes dos tablas, por darles un nombre Secuencia y Facturas, bien donde:

Secuencia
--------------------
ID
NUMERO
NUMERO_SIGUIENTE


Factura
------------------
ID
NUMERO
.....

Cuando generas la factura, obtienes el número al principio, o al momento de grabar lo último que haces es obtener el número de la factura, luego de obtener el número que es lo que haces?

Saludos
__________________
¡Oh nooo! no compartas, compartir es pirateria, compartir te llevara a la carcel - Revolution OS
Responder Con Cita
  #8  
Antiguo 06-01-2009
Avatar de Kipow
Kipow Kipow is offline
Miembro
 
Registrado: abr 2006
Ubicación: Guatemala
Posts: 329
Poder: 19
Kipow Va por buen camino
Pues la solicion de ingeniero es similar a la mia jaja, un numero interno y el numero de factura, cuando esta operando asignas con el id interno este no hay problema puede ser un generador y solo mostras la factura que toca (esto como dato informativo) en Firebird para realizar un bloqueo exclusivo se puede hacer asi

Código SQL [-]
UPDATE FAC_CORRELATIVO SET CODIGO = CODIGO       WHERE CODIGO = :codigo;
o bien
Código SQL [-]
SELECT CODIGO FROM FAC_CORRELATIVO WHERE CODIGO = :CODIGO WITH LOCK;
Responder Con Cita
  #9  
Antiguo 06-01-2009
Ingeniero Ingeniero is offline
Miembro
 
Registrado: ene 2006
Posts: 75
Poder: 19
Ingeniero Va por buen camino
Smile ...

...Es asi como lo describes totote, lo unico que en la Secuencia (Interna) yo busco el numero de secuencia actual (numero actual) y ahi mismo luego grabo la secuencia proxima (numero proximo), porque este es un campo interno que no lo vera el usuario, porque este solo ve el numero de la factura que se genera, la cual se genera finalmente cuando grabo el registro!!!...Saludos Cordiales...
Responder Con Cita
Respuesta



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
Firebird y dbExpress PacoPepe Conexión con bases de datos 5 12-09-2007 18:58:23
Firebird con DbExpress norberto_larios Conexión con bases de datos 1 26-07-2005 18:48:08
dbexpress - firebird Ricardo Alfredo Conexión con bases de datos 4 31-05-2005 17:47:25
DBExpress con FireBird diegofhernando Firebird e Interbase 0 11-12-2004 16:11:19
FireBird 1.5 RC1 y DBExpress mosorio Providers 2 16-06-2003 10:58:41


La franja horaria es GMT +2. Ahora son las 17:59:46.


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