FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
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:
Los parámetros de la transación son: Cita:
__________________
Guía de Estilo de los Foros Cita:
|
#2
|
||||
|
||||
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 |
#3
|
||||
|
||||
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:
|
#4
|
||||
|
||||
¿Y el contador es un generador o un +1 de un campo de una tabla?
|
#5
|
||||
|
||||
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:
|
#6
|
||||
|
||||
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). |
#7
|
||||
|
||||
Cita:
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. |
#8
|
||||
|
||||
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.
|
#9
|
||||
|
||||
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:
|
#10
|
||||
|
||||
Cita:
Saludos, Chris |
#11
|
||||
|
||||
Por otro lado, has probado a utilizar un procedimiento almacenado del tipo BEFORE INSERT?
|
#12
|
|||
|
|||
Hola...
Tal vez no tenga efecto, pero, intenta usando el método Commit en lugar de CommitRetaining... Saludos... |
#13
|
||||
|
||||
Cita:
Usuario 2: hace fra. 11 Usuario 1: elimina fra. 10 ¿qué número pones en el contador? |
#14
|
||||
|
||||
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:
|
#15
|
||||
|
||||
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:
|
#16
|
||||
|
||||
Hola Marcos.
Cita:
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). |
#17
|
||||
|
||||
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:
|
#18
|
||||
|
||||
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.
Un Saludo.
__________________
Guía de Estilo de los Foros Cita:
|
|
|
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 |
|