-----Mensaje original-----
De: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] En nombre de Roberto Rodríguez
Pino
Enviado el: jueves, 17 de julio de 2008 11:47
Para: pgsql-es-ayuda@postgresql.org
Asunto: Re: [pgsql-es-ayuda] como lograr campo consecutivo sin fallar ?

2008/7/17 Robert J. Briones C. <[EMAIL PROTECTED]>:
> El día 16 de julio de 2008 23:24, Carlos Mendez <[EMAIL PROTECTED]>
escribió:
>> Hola, que tal
>>
>> como puedo lograr que un campo de una tabla aparezcan numeros 
>> consecutivos sin fallar, 1, 2, 3, 4, 5, etc. con serial a veces falla 
>> porque a veces hay errores y se salta del 2 al 4 y el 3  se pierde, 
>> yo creo que una forma seria calcular el max de este campo y sumarle 
>> +1 y asi sucesivamente, lo pregunto porque tengo que hacer un 
>> programa de facturacion y no debe perder ni un solo consecutivo no 
>> debe haber saltos o perdidas de numeros, Agradeciendo de antemano 
>> cualquier ayuda o sugerencia, me despido, saludos.
>>
>
> Muchas veces se pierden los numeros por una cosa de eliminacion de datos.
> la forma que dices tu . es la que mayormente se ocupa, pero una vez 
> creado el 1, 2, 3, 4, 5 y eliminas el tres, te quedará como, 1,2,4,5 y 
> el próximo que se agregará será el 6, en el caso de un sistema de 
> facturacion, las facturas no se eliminas, solo se anulan, así el 3 en 
> este caso . seguira ahí, pero como anulado.
>
> yo nunca he tenido problemas de que se salte un numero.
> revisa el script que ocupas.
>

> Yo tengo un problema similar. Se salta el correlativo en caso de que haya
> habido un fallo en la inserción.
> Yo estoy ocupando jdbc. Necesitaba hacer 2 inserciones, donde la segunda
> dependia de la primera... pero si habia algun problema en la segunda, la
> primera no debia llevarse a cabo. Para lo cual aplicaba un rollback.
> Pero asi y todo se seguian "quemando"  los identificadores de la
secuencia.
> Despues revise la cantidad de numeros disponbles y era una suma
> considerable, asi que no le di mucha importancia (en mi problema, me
> indiferente que se salte de un 3 a un 6)... pero igual me quedo la duda de
> como se podria solucionar esto.
>¿Se puede de alguna manera?
> Saludos!
> Roberto

Yo tengo una tabla de correlativos asi:

Tabla: t_correlativo
Tipo_doc char(2) PK
Serie_doc number(3) PK
Numero_doc number(8)


Los pasos son sencillos:

1. Primero incrementas el valor del correlativo (numero_doc) que corresponda
al documento y a la serie que estás trabajando.
2. haces un select para traer el correlativo generado (numero_doc)
3. usas este número para tu tabla de movimientos.

Ya que todos estos pasos están dentro de una transacción el registro del
correlativo correspondiente a al documento y serie permanecen bloqueados
mientras no se haga un roolback o commit.

Ojo. El paso 1 y 2 se pueden hacer en un solo update con retorno de valores
y finalmente también se puede meter este proceso dentro de un trigger en la
tabla de movimientos.

Saludos,

Javier.



-- 
Este mensaje ha sido analizado por MailScanner
en busca de virus y otros contenidos peligrosos,
y se considera que está limpio.
For all your IT requirements visit: http://www.transtec.co.uk

--
TIP 5: ¿Has leído nuestro extenso FAQ?
         http://www.postgresql.org/docs/faqs.FAQ.html

Responder a