Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-05-2003
Marina Marina is offline
Miembro
 
Registrado: may 2003
Ubicación: Córdoba - Argentina
Posts: 52
Poder: 21
Marina Va por buen camino
Actualización números de factura

Hola a todos!

Trabajo con Interbase 6, Delphi 4 Professional, conexión a través del BDE y CachedUpdates.

La aplicación se ejecuta en red y desde dos puestos de trabajo están facturando al mismo tiempo, el problema lo tengo al generar el número de la factura, el cual debe ser correlativo y por supuesto diferente en los dos puestos. No puedo usar generadores para obtener el número debido a que los tipos de comprobante son variables. Lo que tengo es una tabla con los tipos de comprobante y para cada tipo existe un campo donde se guarda el último número emitido; tengo que sumar 1 a este número y asignárselo al comprobante.
A su vez, el tipo y número de comprobante son los campos clave en el archivo de comprobantes. Este número tengo que grabarlo también en otra tabla relacionada pero que no tiene foreign key.

El problema que estoy teniendo es que desde los dos puestos se genera el mismo número y da el error Key violation.

Alguna ayudita, por favor.

Desde ya muchas gracias

Marina
Responder Con Cita
  #2  
Antiguo 08-05-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 23
kinobi Va por buen camino
Re: Actualización números de factura

Hola,

Cita:
Posteado originalmente por Marina
El problema que estoy teniendo es que desde los dos puestos se genera el mismo número y da el error Key violation.
una posible solución, de entre varias, sería capturar la excepción que se produce al hacer el post. En caso de ser una "key violation" (y lo sabes por el código de error de la excepción), puedes lanzar otra consulta para obtener un nuevo número e intentar repetir la inserción.

Saludos.
Responder Con Cita
  #3  
Antiguo 08-05-2003
lafirma lafirma is offline
Miembro
 
Registrado: may 2003
Ubicación: Honduras
Posts: 159
Poder: 21
lafirma Va por buen camino
Oye, porque no usas mejor un generador para cada tipo de comprobante? denro de un trigger beforeinsert puedes establecer el valor dependiendo del tipo de comprobante que estas insertando, asi te evitaras problemas con el uso de campos para ese fin.
__________________
Saludos

Douglas Cruz
Responder Con Cita
  #4  
Antiguo 09-05-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 23
kinobi Va por buen camino
Hola,

la función de los generadores es justamente la inversa: garantizan que no se producirán duplicados de claves, y en consecuencia que no habrá "Key violations", pero no garantizan una secuencia correlativa.

En pocas palabras, en un entorno multi-transacción (InterBase) es imposible conseguir una secuencia correlativa de enteros y que además no se puedan producir errores de claves duplicadas.

Saludos.
Responder Con Cita
  #5  
Antiguo 21-07-2005
Chaja Chaja is offline
No confirmado
 
Registrado: ago 2004
Ubicación: Mar del Plata
Posts: 238
Poder: 0
Chaja Va por buen camino
NUmeracion de Comprobantes

Hola:
Me enganche en este hilo buscando otra coas y bueno.
Mira yo tenia el mismo problema. Por lo pronto yo no uso como clave primaria el mismo numero del comprobante, si no que uso un id interno, que lo tomo de un generador, tanto en la cabecera como en las lineas. Ese Id que es un Integer lo uso como PK. Los numero de comprobantes lo tomo de una tabla que tiene (igual que vos) de un campo de numero el cual leo y le sumo uno. Cuando dos puesto de trabajo hacen el mismo tipo de comprobante, no me afecta ya que los dos tiene un id diferente y no hay conflictos, pero si van a tener el mismo numero de comprobante. Entonces en el momento de hacer un commit en la base de datos en el BeforePost hago una consulta de la tabla de comprobantes donde esta el numero de comprobante, si el numero difiere en el numero mas uno listo lo gravo pero si el otro gravo antes que yo la diferencia va ser menor ya que cuando gravo el comprobante actualizo el campo de numero con el ultimo ingresado. re-actualizo el numero de factura y vuelvo actualizar el numero de comprobante en la tabla de comprobantes. y dejo que grave.
No se si me entendistes.. cualquier cosa laromdp@infovia.com.ar

chau
Responder Con Cita
  #6  
Antiguo 21-07-2005
jam jam is offline
Miembro
 
Registrado: may 2003
Posts: 74
Poder: 21
jam Va por buen camino
Chaja tiene razón, el nº de factura no debe ser la clave primaria, y para generarlo se pueden utilizar varios métodos, yo el que uso es mediante un disparador que se activa al guardar los datos en el servidor, (cuando se ha confirmado la inserción del registro), luego hago un refresh y recupero el nº de factura.
Antes almacenaba el último número en una tabla, pero ahora lo que hago es obtenerlo con la consulta:
Código:
select max(n_factura)+1 from facturas
No se si el maestro Kinobi tiene un método mejor.
Responder Con Cita
  #7  
Antiguo 21-07-2005
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Pues yo creo que el número de factura ha de ser clave única, otra cosa es como obtener ese número único en el momento de la grabación.

Yo utilizo una tabla auxiliar y en el evento beforeInsert:
1º.- Pongo en edición el último número que es un campo de esta tabla auxiliar,, con lo cual garantizo que no pueda acceder nadie a él en ese momento.
2º.- Le sumo 1 y lo libero

Ahora ya tengo un número único para la factura que se está grabando, la consulta le veo un problema, si se da la casualidad que dos puestos acceden a hacer la consulta al mismo tiempo obtendrán el mismo número de factura.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #8  
Antiguo 21-07-2005
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 23
kinobi Va por buen camino
Hola,

Cita:
Empezado por marcoszorrilla
Pues yo creo que el número de factura ha de ser clave única,...
Estoy de acuerdo, no consigo recordar ningún caso en que una factura (entendido como un documento con valor contable) pueda tener un identificador duplicado. Ahora bien, también estoy en la tesis que se comenta anteriormente: el identificador (o número) de factura debe ser único (clave alternativa), pero no clave primaria. Las claves primarias no deberían tener valor semántico en el modelo de datos.

Saludos.
Responder Con Cita
  #9  
Antiguo 21-07-2005
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
De acuerdo, en donde digo clave única = Indexado sin duplicados en algunos contextos, porque como muy bien apuntas el número de factura debe de ser único.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #10  
Antiguo 21-07-2005
jam jam is offline
Miembro
 
Registrado: may 2003
Posts: 74
Poder: 21
jam Va por buen camino
Estoy de acuerdo con Kinobi, se me olvidó comentar que tengo un índice secundario asociado al nº de factura y si se intenta insertar un valor que ya existe se produce una excepción. Mi programa la captura y vuelve a intentarlo hasta que no se de ningun error.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Fallo Nº Factura y Linea Factura CarmaZone Tablas planas 5 26-05-2005 11:17:19
Ticket & Factura mosorio Varios 0 14-08-2003 18:25:53
Falla en actualización con CachedUpdates Marina Conexión con bases de datos 5 03-06-2003 20:55:05
Fallo en actualización con CachedUpdates Marina SQL 1 31-05-2003 17:24:02
Diseño de una factura con RAVE Er_Manué Impresión 0 28-05-2003 10:14:43


La franja horaria es GMT +2. Ahora son las 11:01:35.


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
Copyright 1996-2007 Club Delphi