Club Delphi  
    Paypal   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 27-06-2011
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
Problema con un Contador.

D7 y Firebird 2.5 conectando con las IBX.

Tengo un problema con un contador. Si abro altas facturas en dos equipos a la vez, el segundo que intenta grabar la factura no ve el contador actualizado y arroja un error de "Primary Key", repetida.

Al actualizar el contador hago "Post"

Este es el código:

Código Delphi [-]
procedure TDmConex.IBDtsConfAfterPost(DataSet: TDataSet);
begin
Actualizar_Transacion();
end;

Procedure Actualizar_Transacion();
begin
    if DmConex.IBTransaction.InTransaction then
    DmConex.IBTransaction.CommitRetaining;
end;

Los parámetros de la transación son:

Cita:
read_committed
rec_version
nowait
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
  #2  
Antiguo 27-06-2011
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 4.214
Poder: 24
newtron Va camino a la fama
Hola.

¿El número de factura lo asignas al grabar el siguiente en la tabla de contadores o haces algún proceso intermedio? porque si lees el número a asignar sin bloquear el registro es posible que desde dos puntos a la vez lean el mismo número y por eso tengas ese problema.

(Miedo me da darte consejos, si suelto alguna tontería me disculpas)

Saludos
Responder Con Cita
  #3  
Antiguo 27-06-2011
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
El número se asigna al grabar, por lo tanto la segunda debiera leer el nuevo número y sumarle uno pero no se por qué lee la anterior..........

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
  #4  
Antiguo 27-06-2011
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.671
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
¿Y el contador es un generador o un +1 de un campo de una tabla?
Responder Con Cita
  #5  
Antiguo 27-06-2011
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
El contador es un campo guardado en la tabla contadores, el problema es que apesar de haber hecho un "post" despues de sumarle uno los otros equipos de la red no lo ven.

La prueba consiste en hacer dos facturas a la vez y a la hora de grabar grabo una antes que otra, la segunda no lee el incremento sobre la tabla.

He probado a que antes de leer cierre el IbDatset y lo vuelva a abrir, pero nada.


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
  #6  
Antiguo 27-06-2011
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 26
guillotmarc Va por buen camino
Cita:
Empezado por marcoszorrilla Ver Mensaje
El contador es un campo guardado en la tabla contadores, el problema es que apesar de haber hecho un "post" despues de sumarle uno los otros equipos de la red no lo ven.

La prueba consiste en hacer dos facturas a la vez y a la hora de grabar grabo una antes que otra, la segunda no lee el incremento sobre la tabla.

He probado a que antes de leer cierre el IbDatset y lo vuelva a abrir, pero nada.


Un Saludo.
Solo te leerá el valor incrementado cuando abras una transacción nueva. Por lo tanto, para usar el contador tendrías que iniciar la transacción, incrementar el contador y cerrar la transacción, todo en el menor tiempo posible. Y aún así no vas a evitar que ocasionalmente varios puntos ejecuten simultáneamente el mismo proceso (y obtengan el mismo valor para el contador).

Tendrías que incrementar el nivel de aislamiento de la transacción involucrada (con un Isolation Level de Serializable no se podrían duplicar los valores del contador), o bien usar generadores, que en mi opinión es la opción recomendable en Firebird.

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).

Última edición por guillotmarc fecha: 27-06-2011 a las 17:38:53.
Responder Con Cita
  #7  
Antiguo 27-06-2011
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 26
guillotmarc Va por buen camino
Hola.

¿ Porqué no usas un generador ?, es bastante mejor ya que son independientes de las transacciones, por lo que no te vas a encontrar con que dos transacciones simultaneas puedan leer el mismo valor en la tabla y por tanto intenten incrementar el contador a la misma cantidad.

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
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
Contador PHP Deiv HTML, Javascript y otros 19 25-02-2008 15:15:38
Mostrar un Contador Deiv HTML, Javascript y otros 7 09-07-2007 04:04:34
Contador De Impresiones codigit Windows 0 27-11-2004 21:41:46
Contador en impresion Pablo Carlos Impresión 2 18-09-2004 19:07:16
Problemas con un contador. UTECYBER OOP 11 02-06-2004 05:49:24


La franja horaria es GMT +2. Ahora son las 03:50:02.


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