Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Problemas con facturas (https://www.clubdelphi.com/foros/showthread.php?t=16525)

davidgaldo 01-12-2004 08:20:03

Problemas con facturas
 
Hola tengo una bd en sqlserver, y una aplicación para realizar facturas. Pues bien un tabla lleva las cabeceras de las facturas y otra las lineas de la factura.
Cada factura tiene un nº correlativo, pues bien, imaginemos que tengo un usuario haciendo una factura con su nº correspondiente, y antes de guardar llega otro usuario para hacer otra factura, esta factura tendrá el mismo nº que la anterior ya que la anterior no fue guardada, como puedo solventar ese problema de concurrencia????

rpadin 01-12-2004 08:36:03

Depende de como lo esteas haciendo
 
Buenos días.

Si es en sqlserver, y utilizas sus autonuméricos, no tienes ese problema. Otra cosa bien distinta es si tu generas en tu código los números, si es así, yo te aconsejo una tabla donde lleves el control de las claves que generas, y vayas pidiendo los números a ella.

Un saludo
Ramiro

davidgaldo 01-12-2004 09:19:24

como es eso de los códigos autonuméricos??? y en el caso de la tabla, cuando debo actualizarla con el nuevo nº??

afxe 01-12-2004 09:30:05

Yo hago algo parecido, pero sin usar tablas. Cuando doy a insertar factura hago un SELECT MAX(NUMERO) FROM FACTURAS_CAB, con alguna clausula WHERE por empresa, serie de facturación, etc... Y muestro ese número en pantalla, sin embargo, antes de postear el registro, vuelvo a hacer el mismo SELECT y vuelvo a actualizar el número de factura inmediatamente antes de postear, por si alguien ha metido nuevas facturas mientras se hacía la actual. (Importante que no se lancen mas instrucciones entre este nuevo select y el comiteo de la transacción, por razones obvias -si tardas en comitear, puede que alguien le de tiempo a meter una factura-). Con este método, si cancelas el alta de facturas no dejas huecos en la numeración.

También que es importante que, aunque tu número de factura sea una clave única, no sea clave primaria. Usa un autoincremental para la clave primaria, que será la que se usará para enlazar los detalles de la factura, de manera que puedas cambiar el nº de factura como te dé la gana sin tener que hacer modificaciones en cascada a los detalles de la factura. Además, puedes tener huecos en la clave primaria, cosa que no te puedes permitir en la numeración de las facturas.

Según los puristas, esto no se debe hacer, ya que si se graba en el mismo milisegundo dos facturas, o se consulta el SELECT MAX y hay una transanción en curso cambiando el nº de factura justo después de devolverme el valor del SELECT MAX, tendré un bonito mensaje de clave duplicada. Y es verdad, esto puede pasar una vez cada mil en una red con 30 o 40 equipos metiendo facturas, por lo cual no está de más meter un Try... except para informar del fallo y que repitan la factura....

En conclusión, todo depende de la concurrecia de datos que tengas prevista. Si van a entrar docenas de facturas por segundo, usa tablas de control (que también tienen sus problemas si no las usas bien) o autoincrementales; si son decenas por minuto, usa el SELECT MAX.

Espero haberte ayudado.

Saludos.

Cabanyaler 01-12-2004 16:14:02

Hola, apoyo totalmente la filosofía del compañero Axfe. Yo lo hago de una manera casi similiar, pero para más control de bloqueo lo que también hago es tener una tabla aparte con los números actuales (mi caso no es de facturas, pero se aplica igualmente), y cuando pido el último número entregado para asignar ese + 1 como "factura" hago el post en esa tabla que controlo el último número para dicha "factura", ahorrando así el tiempo (mínimo por otro lado) que pueda tardarme el SELECT para obtener el último número del conjunto de datos que contengan las "facturas" o el documento que sea.
Además pon todos los try que se te ocurran, nunca están de más y en este caso sobradamente justificados.

Suerte. ;)

AGAG4 01-12-2004 17:02:01

Te remociendo
 
Te recomiendo hacer un procedimiento almacenado para Tomar el ultimo Folio Real que tomará la factura, yo uso un folio Interno primeramente para solventar la relacion Maestro-detalle y cuando el usuario se decide Guardarla Mando a llamar un Store Procedure donde me devuelve el ultimo folio de factura y a la vez guarda en una Tabla Independiente la Relacion de los Ultimos folios de Todos los Documentos(Maestro-Detalle) que tengo.

Espero te sirva.

Saludos

rpadin 01-12-2004 18:32:07

Una alternativa ... y mucho más segura ... a mi umilde entender
 
Buenas

En SQL Server, y sólo en esta ... si haceis por ejemplo:

Tenemos la tabla mitabla con los campos:
id como autonumérico
campo1 número
campo2 número

si executas toda esta instrucción
"insert mitabla(campo1, campo2) values (1,2);select @@identity"
insertará en la tabla "mitabla" y como salida devolverá el último valor insertado en el campo "id" que previamente definimos como autonumérico.

Un saludo desde Galicia
Ramiro

davidgaldo 02-12-2004 08:05:01

gracias a todos por vuestra ayuda.

Un saludo tb desde Galicia(Viveiro).


La franja horaria es GMT +2. Ahora son las 02:10:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi