PDA

Ver la Versión Completa : Numero secuenciales


lafirma
30-10-2003, 01:44:39
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

Rudi
30-10-2003, 03:23:29
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.

AdrianD
30-10-2003, 12:32:07
Puedes seguir con la idea del generador pero disparandolo en un trigger (before insert) y luego actualizar los items

__cadetill
30-10-2003, 14:07:39
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)

lafirma
30-10-2003, 21:23:39
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?

__cadetill
30-10-2003, 21:50:25
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

hibero
17-11-2003, 18:38:05
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

__cadetill
17-11-2003, 18:43:59
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

AdrianD
17-11-2003, 20:39:04
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

rastafarey
25-11-2003, 22:06:30
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*/