Ver Mensaje Individual
  #2 (permalink)  
Antiguo 27/12/2014, 17:08
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Obtener siguiente Indice Incremental

En realidad lo que tienes no es un problema de BBDD, sino un problema de diseño de sistemas. En un sistema de facturación que va a funcionar en red es absolutamente imposible hacer una reserva de autoincremental sin generar este tipo de inconveniente, y otros mucho mayores.
Todo debido al principio mas sencillo de todo sistema concurrente: La coexistencia de N transacciones simultáneas.

En realidad, siendo que forzosamente la facturación es el cierre de toda operación, y esta debe ser consistente, y no puede crearse en una forma que la numeración presente discrepancias con la hora de creación del comprobante, esta se debe ejecutar como un proceso atómico, y por ende no puede tomarse el número de factura previamente. Debe siempre crearse en el momento de la emisión (requisitos legales en todas partes del mundo).
Los sistemas concurrentes en realidad solucionan parte del inconveniente creando un estado intermedio de la compra, en una tabla transaccional que luego relacionan con la de facturación, pero sólo a los efectos de la consistencia de datos.
Esta tabla transaccional solo debe ser consistente consigo misma, por lo que el orden numérico de su identificador es irrelevante.
¿Qué quiero decir con todo esto?
Bueno, simplemente creas una tabla de, digamos, "ordenDePedido", donde vas a cumulando todos los detalles necesarios para la emisión de la factura, y sólo al confirmar toda la operación tomas esos mismos datos y los vuelcas en la factura, en un sólo ciclo de proceso, recuperando en el acto el numero de factura que se genera .
¿Se entiende?
NUNCA usas una tabla de facturas como tabla de proceso previo. JAMÁS.
Usas siempre tablas intermedias y la ejecución de facturación es un proceso atómico de cierre final.

Una factura nunca debe tener procesos posteriores que modifiquen datos una vez emitido su identificador. Toda modificación de la operación asentada en una factura, siempre generará nuevos documentos a registrar en otras tablas, pero la factura en si se cierra junto con la generación de su identificador, y no se modifica.
Respecto a la consistencia tiempo-numero de factura, me refiero a que si si tienes dos facturas con números consecutivos, en todas las legislaciones que yo conozco, la factura de numero mayor siempre debe tener una fecha y hora posteriores, y eso puede no cumplirse en tu sistema (dependería de cuanto tarde la segunda transacción), con lo que existe margen para que la facturación sea legalmente considerada fraudulenta, si las horas de registración son inversas a la numeración. ¿Queda claro?

¿Se entiende la idea?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 27/12/2014 a las 17:14