Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Problema de concurrencia

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Problema de concurrencia Responder citando

Hola compañeros,

Tengo el típico problema al momento de guardar una factura.
Utilizo Firebird 1.5, como lo hago, capturo los datos de la factura, y obtengo el consecutivo de la factura (este valor lo tengo en una tabla con un solo campo), empiezo a escribir el encabezado y el detalle y todo bien pero al momento de generar la factura, si 2 personas lo hacen al mismo tiempo se repite el nùmero de la factura, como me recomiendan que haga esta validaciòn en caso de que, por ejemplo, no se tenga en el inventario las existencias suficientes para un producto, ya que genero una excepciòn y le doy el rollback a toda la transacciòn, es decir está protegida la transacciòn pero el consecutivo se me desconchifla :P

Saludos !!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Calcula el numero de folio HASTA EL MOMENTO DE GUARDAR
_________________
Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc

http://www.touchsoftwares.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Bueno, según mi experiencia en esos casos, independientemente de que tu obtengas el consecutivo de la factura, le debes permitir al usuario cambiar el valor del numero de factura.... ya que si la primera guarda, la segunda obviamente no será válida, asi que en el momento de que se intenta guardar la segunda factura el sistema envia el mensaje de error correspondiente indicando al usuario la situación. De está forma el usuario puede indicar otro número de factura válida o en su defecto que el sistema vuelva a consultar el nuevo consecutivo de la factura.

Saludos.
_________________
Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Crea un trigger y usa un generator de la manera siguente:
Código:

CREATE Generator Facturas_Numero;

CREATE TRIGGER "FACTURAS_NUMERO" FOR "FACTURAS"
ACTIVE BEFORE INSERT POSITION 0
as

begin
   new.numero=gen_id(facturas_numero,1);

end

Esto suele funcionar si tu sistema no es muy complicado, te garantiza que no habran numeros repetidos. Aunque puede tener la siguente pega si por cualquier causa no se concreta la transaccion ese numero se pierde, es decir se salta un numero.

Una mejora a esto es:
Código:
CREATE TRIGGER "FACTURAS_NUMERO" FOR "FACTURAS"
ACTIVE BEFORE INSERT POSITION 0
as
declare variable contador integer;
declare variable ultimo_numero integer;
begin

 select gen_id(facturas_numero,0) from rdb$database into contador;
 select max(numero) from facturas into ultimo_numero;
 if(contador=ultimo_numero)then
   new.numero=gen_id(facturas_numero,1);
 if(contador>ultimo_numero)then
   new.numero=ultimo_numero+1;
 
end
 
Probablemente funcione bien con solo el select max(numero) y sin
el generator, pero no me he atrevido a probarlo en ambientes de produccion ya que no se el scope de la clausula select dentro de un trigger
en el ambito de una transaccion.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Yo lo veo por el lado de la tabla de un solo campo de donde tomas el numero de la factura. Imagino que vas hasta el final de la tabla, lees el ultimo numero, lo incrementas en uno y ese es el nuevo numero para crear la factura. Verdad? Pues yo pienso que debes programar la aplicacion para que siempre tome el ultimo numero que encuentre y lo incremente, asi siempre vsa a tener numero nuevos sin repeticion. Mejor dicho, un tipo de dato Autoincremento.

Bueno, por otro lado esta la base de datos, la cual debes configurar en la tabla esta de un campo, que este mismo campo es Key o llave primaria, lo cual te envia un mensaje de error si se intenta crear dos registros con el mismo dato. Tambien puedes cogerlo por ese lado.

Bueno, en fin, hay varias opciones, espero te ayuden mis ideas.
_________________
Dios es real... a menos que se declare entero!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.