Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-10-2003
lafirma lafirma is offline
Miembro
 
Registrado: may 2003
Ubicación: Honduras
Posts: 159
Poder: 22
lafirma Va por buen camino
Numero secuenciales

que tal grupo, estoy haciendo un form. de facturas, necesito asignarle un numero consecutivo a esas transacciones, no puedo usar generadores porque me dejan huecos en la secuencia de numeros, que tecnicas puedo usar para que en la secuencia de numeros no queden huellas?
es estrictamente necesario en el programa que haya una secuencia ininterrumpida
estoy usando D7 enterprise con IBX y firebird 1.0

tiempo atras usaba herramientas de Microsoft, especificamente VFP, alli generaba mediante una tabla que contenia el ultimo numero de la factura, y durante cada transaccion bloqueaba la tabla hasta que la transaccion terminaba, como la tabla en cuestion era parte de la transaccion cualquier cambio efectuado en ella era cancelada si la transaccion no finalizaba con exito, pero como hago esto en firebird/interbase?

el impacto en el rendimiento de la transaccion era casi nulo, pues las transacciones eran cortas y los multiples usuarios que usaban la aplicacion se dan por enterados
__________________
Saludos

Douglas Cruz
Responder Con Cita
  #2  
Antiguo 30-10-2003
Rudi Rudi is offline
Miembro
 
Registrado: jul 2003
Ubicación: Venezuela
Posts: 78
Poder: 21
Rudi Va por buen camino
Hola

Yo hice algo parecido hace tiempo, no lo tengo a la mano pero si mal no recuerdo utilizaba el disparador de antes de insertar de la tabla, en firebird no en delphi, y le asignaba el valor que faltase, en tu caso seria el ultimo (factura = select max(factura)...+1).

Espero que te sirva.
Responder Con Cita
  #3  
Antiguo 30-10-2003
AdrianD AdrianD is offline
Miembro
 
Registrado: may 2003
Ubicación: San Juan - Argentina
Posts: 113
Poder: 21
AdrianD Va por buen camino
Puedes seguir con la idea del generador pero disparandolo en un trigger (before insert) y luego actualizar los items
Responder Con Cita
  #4  
Antiguo 30-10-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Yo hago una mezcla entre lo de AdrianD y lo de lafirma, es decir, tengo una tabla de contadores de donde saco el código y, esto lo hago en un trigger (Before Insert)
Responder Con Cita
  #5  
Antiguo 30-10-2003
lafirma lafirma is offline
Miembro
 
Registrado: may 2003
Ubicación: Honduras
Posts: 159
Poder: 22
lafirma Va por buen camino
es que lo que sucede que si yo uso un generador en un before insert y la transaccion no finaliza con exito o hago un rollback entonces pierdo la secuencia numerica, que lo que tengo que evitar a toda costa, la numeracion debe ir exactamente en secuencia, no debe dejar "huecos",
en concreto creo que debere usar una tabla para los ultimos numeros, pero como hago para bloquear esa tabla durante la transaccion?
__________________
Saludos

Douglas Cruz
Responder Con Cita
  #6  
Antiguo 30-10-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Cita:
Posteado originalmente por lafirma
...pero como hago para bloquear esa tabla durante la transaccion? ]
Si utilizas una tabla (como yo), no te apures, que si haces un rollback, la actualización que hayas hecho en la tabla de contadores no se tendrà en cuenta. Eso sí, has de procurar que la transacción dure lo menos posible
Responder Con Cita
  #7  
Antiguo 17-11-2003
hibero hibero is offline
Miembro
 
Registrado: nov 2003
Posts: 104
Poder: 21
hibero Va por buen camino
ante todo saludos. Al los metodos propuestos les veo un problema. Supongamos que dos usuarios simultaneamente incrementan el contador. Puede darse el caso que antes de de acabe la transacción del primer usuario, el segundo usuario realice la suya obteniendo el mismo contador (correjidme si me equivoco).

¿Habria que buscar la manera con algun tipo de bandera que indique si un usuario esta enn este momento incrementando el contador o por el contrario nadie incrementa el contador?

Salu2
Responder Con Cita
  #8  
Antiguo 17-11-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
No estoy seguro, pero yo diría que IB le devolverá al segundo usuario un error diciendo que el registro está bloqueado por otro. Por eso las transacciones han de durar lo menos posible
Responder Con Cita
  #9  
Antiguo 17-11-2003
AdrianD AdrianD is offline
Miembro
 
Registrado: may 2003
Ubicación: San Juan - Argentina
Posts: 113
Poder: 21
AdrianD Va por buen camino
Cual es la necesidad de que no queden "huecos" por que en la practica es realmente muy dificil, hay un sin número de casos que se pueden producir que dejen huecos. Un colega tenia una numeración con huecos y al finalzar el día los renumeraba a todos los movimientos, no se si es la mas práctico o correcto pero fué una forma de no dejar hucos
Responder Con Cita
  #10  
Antiguo 25-11-2003
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Crear un store procedure before insert
in pon esto

declare variable "N" smallInt;
as
begin
--supongase que el campo es "Id"
select max("Id")+1 From "tabla nose el nombre" into new."Id":
If (New."Id" Is Null) Then
New."Id" = 1; -- o e asignas donde quiere que comiense
end

/*pero creo que esto se escapa del control transacional no estoy seguro*/
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


La franja horaria es GMT +2. Ahora son las 17:06:16.


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