![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Transaciones IBX
Tengo dos tablas (master/detail).
Utilizo Delphi7,Firebird 1.5, e IBQuery. Mi problema es que no puedo insertar más de un registro(Detail), porque no se confirman los datos hasta que realizo el Commit, y es entónces cuando se incrementa el código familia. No puedo individualizarlos porque va todo dentro de la misma transación. Pienso en una transación anidada, pero no se como hacerla y si es permitida. saludos y Gracias anticipadas. |
#2
|
||||
|
||||
Hola.
¿Podrias publicar el codigo del procedimiento almacenado 'P_INCFAMILIA? Saludos |
#3
|
||||
|
||||
Resp
No entiendo cual es tu problema. La tansaccion no termina hasta hacer commit o rollback.
Si tienes una integridada referencial entre master y detalles exister el registro relacionado con el master. Primero ten cuidado con el procedimiento qu eincremnte el codigo. Me imagino que usas un generador ya que este no respeta las transacciones y asi te evitas codigos duplicados en un hanbiente multiusuario. Te doy un ejemplo de como puedes hacer. Master 1: Lees el codigo del master Asiganas los dados y ejecutas el master Detalles 1 master 1 Asiganas los dados y ejecutas el detalle Detalles 2 master 1 Asiganas los dados y ejecutas el detalle y asi sucesivamente. Igual para el master 2 y sus detalles. Luego de todo esto puedes hacer el commit. Pero tambien puedes hacer el commit despues de insertar el ultimo detalle de un master. Asi puedes insertar todos los detalles que quieres a un master. Pero una vez mas te recuerdo lo del control d etransacciones ay que si el codigo no lo controlar con un generador te puede dar un error de bloqueo muerto o conflitos de calves primarias. Espero te sirva de ayuda.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa. |
#4
|
|||
|
|||
Este es el procedimiento
El problema es que en el bucle, no se incrementa el 'FDM.CodigosFAMILIA.AsInteger' y me sale violación clave primaria al insertar el siguiente registro. 'FDM.CodigosFAMILIA.AsInteger' se refresca después del commit. Gracias. |
#5
|
||||
|
||||
Hola.
En mi opinion deberias llevar el incremento del Codfamilia fuera del procedimiento.Me refiero a que lo Incrementes tu por codigo Saludos |
#6
|
||||
|
||||
resp
Usa un generador.
Si el generador se llama gen_Id_familia Haces Un select El primero te saca el valor actual y el otro incrmente en uno. y el error te ocurre ya que el valor se esta incrementando dentro del procedimiento y no fuera como te didjeron anteriormente.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa. |
#7
|
|||
|
|||
Muchas gracias por las respuestas.
Me inclinaré por uno de los métodos indicados. Saludos. |
#8
|
||||
|
||||
Recomiendo
Te Recomiendo usar la propiedad CachedUpdates en los IBDataSet sobre la realción maestro detalle que comentas, cuando guardes en vez de usar el POST lo cambias por CachedUpdates, y cuando vayas a aceptar la transacción primero Grabas el Detalle y posteriormente el Maestro, si me preguntas porque, te respondo asi me funcionó, que debería de ser primero el Maestro y después el Detalle y por último Aceptas la transacción....
Saludos.... |
#9
|
|||
|
|||
¡ ya lo conseguí !. No se si es muy ortodoxo pero...
Gracias por todo. |
#10
|
||||
|
||||
Resp
Recuerda que en un entorno mmulti usuraio si no usas generadores para el id primario te puede dar bloques muertos. o Conflitos de claves devido al control transacional.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa. |
#11
|
|||
|
|||
Gracias por la ayuda. Usaré generadores. Lo que ocurre es que el tema refresh
no me funciona, y no he leido en el foro algo definitivo. Saludos. |
![]() |
|
|
![]() |
|