Personalmente creo que la solución más segura es utilizar transacciones para conseguir que la operación sea "unitaria"; No comentas qué SGBD estás utilizando, pero si además esa operación puedes hacerla en el servidor, mejor aun.
Cita:
Empezado por webmasterplc
...lo hago consultando el ultimo registro de una tabla y le sumo uno...
|
De todas formas, el código que estás utilizando para esa operación no es el óptimo.
(1º) Supongo que debes tener índice definido por el campo IDOrden; Si no es así defínelo.
(2º) No hace falta hacer el SELECT de toda la tabla, cuando en realidad sólo necesitas un registro. Porque luego debes hacer el recorrido hasta el final (Last) cosa que es muy costosa. Puedes utilizar alguna de estas variantes para obtener un único registro.
SELECT Max(IDOrden)....
SELECT TOP(1) .... ORDER BY DESC
Cita:
Empezado por Casimiro Notevi
Tienes varias alternativas, por ejemplo, cuando vayas a grabar y ya exista el número entonces le asignas uno más. Si existe, le asignas uno más... y así hasta que por fin ya no exista. O sea, sería un simple bucle.
|
El problema es que tal y como tiene la tabla ahora, podría leer (y le daría que no existe) y al escribir podría ser que alguien ya hubiera escrito (en ese espacio de tiempo). Creo que Casimiro
asume que no se permiten duplicados (y saltaría un error); Cosa que por el problema que tienes no debe ser así.
Deberías
definir un índice único (en la Base de Datos) por el campo IDOrden, cosa que no debes tener ahora si estás obteniendo duplicados.
Cita:
Empezado por mcs
Y porqué simplemente no asignas el número de factura cuando vas a grabar? La operación de grabar debe ser algo rápido, y por lo tanto el número no va a estar bloqueado mucho tiempo...
|
Creo que eso es lo que está haciendo ahora, pero para grabar el número debe consultar primero cual es el último; Y entre la consulta y la grabación es cuando se le cuela otra máquina y se producen los repetidos.