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 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: 3.481
Poder: 21
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 Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.107
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi 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: 24
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
  #7  
Antiguo 27-06-2011
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
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
  #8  
Antiguo 27-06-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.107
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Otra opción, aunque algo "chapuzera", es grabar el número, si da error porque ya existe, incrementarlo y grabar de nuevo, y así en un bucle hasta que llegue a uno que no exista.
Responder Con Cita
  #9  
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
Gracias Marc:

Uso contador en vez de Generador porque en algunos casos se puede eliminar una factura y volver el contador atrás, volver a hacer otra en su lugar y restaurar el contador por donde iba.

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 27-06-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Cita:
Empezado por marcoszorrilla Ver Mensaje
Gracias Marc:

Uso contador en vez de Generador porque en algunos casos se puede eliminar una factura y volver el contador atrás, volver a hacer otra en su lugar y restaurar el contador por donde iba.

Un Saludo.
Marcos, también puedes volver atrás a los generadores. Pero me parece que es algo delicado hacer esto. Tienes que tener mucho cuidado, porque tú puedes anular la fact. #21000, pero otro usuario ya creó la fact. # 21001. Si regresaras el generador a #21000, tendrás un problema porque ya existe una factura con un número mayor.

Saludos,
Chris
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #11  
Antiguo 27-06-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Por otro lado, has probado a utilizar un procedimiento almacenado del tipo BEFORE INSERT?
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #12  
Antiguo 27-06-2011
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

Tal vez no tenga efecto, pero, intenta usando el método Commit en lugar de CommitRetaining...


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #13  
Antiguo 27-06-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.107
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por marcoszorrilla Ver Mensaje
Gracias Marc:
Uso contador en vez de Generador porque en algunos casos se puede eliminar una factura y volver el contador atrás, volver a hacer otra en su lugar y restaurar el contador por donde iba.
Un Saludo.
Usuario 1: hace fra. 10
Usuario 2: hace fra. 11
Usuario 1: elimina fra. 10

¿qué número pones en el contador?
Responder Con Cita
  #14  
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
Son casos especiales y en este caso se avisa a los otros 5 usuarios que no hagan factura, "porque se va a hacer una chapucilla", se pone el contador una antes de la que se quiere hacer, se hace la factura se vuelve el contador igual a la última factura y arreglado.

Hay veces en que una factura de albaranes se deshace porque el cliente pide que se le quite un albarán o se le cambie un precio, en este caso también se pone el contador donde corresponda para poder volver a hacer la factura con el mismo número que tenía........

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
  #15  
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
En cuanto a usar Commit, no me sirve porque me cierra todas las tablas implicadas.

Hay que tener en cuenta que uso una tabla temporal para la cabecera y otra para el detalle y cuando se pulsa el botón grabar es cuando se transfiere todo a la tabla facturas y LineasdeFactura y acto seguido sin preguntar imprime la factura, al cerrarse las tablas este proceso se perdería.

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
  #16  
Antiguo 27-06-2011
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Hola Marcos.

Cita:
Empezado por marcoszorrilla Ver Mensaje
Gracias Marc:

Uso contador en vez de Generador porque en algunos casos se puede eliminar una factura y volver el contador atrás, volver a hacer otra en su lugar y restaurar el contador por donde iba.

Un Saludo.
Como comentan Chris y Casimiro, en un generador tienes las mismas opciones para volver atrás que sobre un contador.

Puedes poner un incremento de -1 para bajar el generador un número, o bien, si quieres asignar un nº concreto al generador puedes usar ALTER SEQUENCE nombre_generador RESTART WITH <valor>

Así pues los problemas con contadores y generadores, son los mismos : que te deshagan una factura cuando ya han generado nuevas facturas posteriores.

En todo caso, si prefieres seguir usando contadores, entonces utiliza una segunda transacción para asignar/recuperar el nº del contador. De esta forma podrás realizar el Commit inmediatamente y será visible para el resto de equipos.

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #17  
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
Gracias Marc, lo de la segunda transación es algo que venía pensando y creo que al final voy a optar por esta opción. Ya comentaré. Aunque me interesa seguir viendo otras aportaciones.

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
  #18  
Antiguo 28-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
De momento y a falta de más pruebas creo que la segunda transacion que la he ligado únicamente al IbDataset de Contadores parece que me ha resuelto el problema.

Código Delphi [-]
Procedure Actualizar_Transacion();
begin
    if DmConex.IBTransaction.InTransaction then
    DmConex.IBTransaction.CommitRetaining;
end;


Procedure Actualizar_Transacion1();
begin
    if DmConex.IBTransaction1.InTransaction then
    DmConex.IBTransaction1.Commit;
end;

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
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 01:51:14.


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