-----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