Ver Mensaje Individual
  #4  
Antiguo 23-07-2003
Avatar de Cabanyaler
Cabanyaler Cabanyaler is offline
Miembro
 
Registrado: jun 2003
Ubicación: País Valencià
Posts: 339
Reputación: 21
Cabanyaler Va por buen camino
Vamos a ver, esto tienen su miga, yo pasé por lo mismo.

En principio, si es verdad que puedes hacerlo con un autoincrementativo, pero no soy amigo de utilizar este tipo de campos para campos claves y que además serán Claves ajenas en tablas detalle. Y por otro lado está que puede ser que el número devuelto quieras que este dentro de unos intervalos, con lo que el autoincrementativo, en este caso, no me parece demasiado amigo.

Una salida rapida es controlar si al grabar el número nuevo se produce la excepción que me comentas, capturarla y procesarla como mejor te convenga, como incrementar el numero avisando de ello, tirando atrás todo lo hecho, en fin como mejor creas conveniente, aunque esto no es lo que toca, obvio, ya que lo que debe ser es que te dé el número inmediato siguiente al último y de una manera correcta.

Para ello:

En principio, lo que yo hice es tener una tabla de intervalo exclusivamente para mantener el último número otorgado (ya sea un pedido, albarán, factura, número de cita de medico, turno en la carniceria...), con el LockType = ltOptimistic.

Cuando quiero dar de alta uno nuevo (albarán, pedido....), lo primero e inmediato que hago es una lectura de esa tabla de intervalo y retornar el valor + 1, y después incremento dicho valor en la tabla intervalo de control del último número, comprobando antes de hacer este post la existencia de (albarán, pedido....), para que no exista el número duplicado y te dé la excepción que te sale ahora.

En resumen, se busca tener siempre un número lo más actualizado posible en el tiempo, que indique el último en secuencia otorgado.

Esto lo consigues, minimizando el tiempo que transcurre desde que demandas el alta, lees el intervalo, lo incrementas, y grabas los cambios en el intervalo, agrupando en try..except o begin transacction... las operaciones de escritura en la tabla, de este modo se minimiza la posiblidad de que álguien lea e intente incrementar el intervalo al mismo tiempo.
Aún y así, si esto ocurre, y dos pc tienen retornado el mismo valor del intervalo, el intervalo no lo podrá grabar si controlas antes de hacerlo que no existe albarán o pedido con ese número, pero esto lo evitas si antes de retornar el valor del último + 1, como te digo, compruebas la existencia de algun albarán o pedido con ese número.

Bueno, sólo me queda desearte suerte, paciencia, y tiempo para hacer mil y una prueba menos una, ya que esa una que no hagas será la que se produzca en la vida real.

Nota: Ojo con el trabajo con datos en memoria y los Updatebatch, ya que estos estan en tu pc, no en el servidor ¿vale?.

Saludos.




__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí.
Responder Con Cita