From: | Francisco Olarte <folarte(at)peoplecall(dot)com> |
---|---|
To: | Micky Khan <mcanchas(at)hotmail(dot)com> |
Cc: | Lista Postgres ES <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Correlativo de números. |
Date: | 2018-11-26 15:59:45 |
Message-ID: | CA+bJJbxdnGvuGbfAnMDFREWRZcmd1Tb0VE2NVep34Du3Qi4jhA@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Micky:
On Mon, Nov 26, 2018 at 4:34 PM Micky Khan <mcanchas(at)hotmail(dot)com> wrote:
> Tengo un campo de correlativo :
...
> El correlativo me sale cuando grabo (Lo cual esta bien)
> Ahora me piden que lo haga de otra manera.
> Que el numero ya salga cuando le doy nuevo y si no lo grabo quede libre para el o los siguientes,
> teniendo en cuenta que mas de un usuario va a accesar a esta tabla .
> Como podria hacerlo ?
Si han de ser realmente correlativos, no puedes:
- Si vas por el 1 y dos usuarios le dan a nuevo puedes:
a.- Darles el 2 a los dos, si los dos graban duplicado.
b.- Darles el 2 y el 3, si el que tiene el dos aborta o modificas el
del 3 ( al grabar, con lo que es como si los generases como ahora ) o
te quedan huecos.
Si admites que pueda haber huecos en la secuencia ( lo cual te puede
estar pasando si usas serial ), puedes darle a cada uno, p.e., el
nextval de una secuencia ( que realmente es lo que usan los serial por
dentro ).
> Una de ellas podria ser generar una cantidad suficiente de numeros(almacenarlos) y usarlos segun corresponda.
Si quieres que TODOS los numeros se usen eventualmente y no te importa
que sea fuera de orden ( p.e., vas por el 1, a da nuevo, le das el 2,
c da nuevo, le das el 3, c graba el 3, b aborta, d viene, le das el 2,
etc... ) puedes usar muchas tacticas. Pero casi todo depende de como
liberes los numeros ( el "si no lo grabo" ). Si solo consideras ahi
los casos en que el usuario se va de la "pantalla de nuevo", esta
puede liberar el numero. Si ademas quieres gestionar errores, tienes
que meter timeouts o algo similar ( depende de tu aplicacion, si tu
juego de clientes es finito e dientificable puedes, p.e, liberar el
numero de uno tras un piñazo cuando reconecta ).
p.e., puedes usar una tabla con un registro "ultimo_numero_usado", y
otra de "numeros_en_vuelo", con un flag de libre-ocupado. Para coger
un numero, primero bloqueas la tabla de ultim-numero-usado, luego
buscas uno libre en la de en-vuelo, si lo hay o pones ocupado y lo
devuelves. Si no lo hay incrementas el ultimo-usado y lo insertas como
ocupado. Cuando un cliente graba, en la transaccion de grabar, borras
el registro de la tabla de en vuelo. Si aborta ( controladamente ),
cambias el valor de ocupado a libre en la tabla de en-vuelo. SI
quieres controlar caidas de clientes puedes, p.e., poner un TS de
ocupacion en lugar del flag libre-ocupado, para liberar lo pones a
null, para asignar a alguien lo pones a now(), y cuando vas a buscar
libres consideras libres todo los que tengan el TS a null o mas viejo
que now() menos lo que quieras. El follon, si han de ser correlativos,
es gestionar los errores / aborts.
Si lo haces con cuidado el coger un numero es una transaccion rapida,
que no se para, y el grabar debe ser otra igual ( delete numero de
en-vuelo, insertar resto datos, commit ).
No es lo mas elegante, pero lo de preseleccionar el numero y que sea
correlativo, que le gusta mucho a la gente de contabilidad, PHBs y
similares, siempre es un follon.
Eso si, si han de ser correlativos Y han de asignarles al dar nuevo,
no puedes garantizar el orden de grabacion ( si dos piden nuevo les
has de dar el numero al pedir, y no sabes en que orden van a grabar,
ni si lo van a hacer ).
Francisco Olarte.
From | Date | Subject | |
---|---|---|---|
Next Message | Jaime Casanova | 2018-11-27 15:53:04 | Re: Correlativo de números. |
Previous Message | Micky Khan | 2018-11-26 15:34:10 | Correlativo de números. |