Re: Correlativo de números.

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.

In response to

Browse pgsql-es-ayuda by date

  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.