Micky: On Mon, Nov 26, 2018 at 4:34 PM Micky Khan <mcanc...@hotmail.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.