FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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 |
#2
|
|||
|
|||
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. |
#3
|
|||
|
|||
Puedes seguir con la idea del generador pero disparandolo en un trigger (before insert) y luego actualizar los items
|
#4
|
|||
|
|||
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)
|
#5
|
|||
|
|||
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 |
#6
|
|||
|
|||
Cita:
|
#7
|
|||
|
|||
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 |
#8
|
|||
|
|||
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
|
#9
|
|||
|
|||
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
|
#10
|
||||
|
||||
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*/ |
|
|
|