![]() |
Tablas relacionadas + commit
Hola a todos:
Tengo unas tablas del tipo maestro-detalle. En un proceso de insercion masiva de registros quiero insertar registros en las dos tablas y al final de toda la insercion hacer un commit, el tema que hago: -> inserto en tablamaster -> post -> inserto en tabladetalla -> post (*) -> commit (*) aqui me salta un error del tipo "lock conflict on no wait transaction violoation or foreign key constraint "integ_53" on tabla XXXX" El tema tiene sentido ya que estoy grabando algo violando un foreign declarado. EL problema es como se podria hacer este tipo de cosas. Aguna experiencia al respecto. Gracias. |
No se me ocurre que puede ser ...
Sólo se me ocurre una pregunta que hacerte: ¿Las dos consultas estan asociadas a la misma transacción de escritura?
|
Cita:
Hasta luego. ;) |
Obvio que no quiero violar el foreign, y estan dentro de un try, el tema es que si doy los mensajes pero el so se completa el proceso, y es para eso que quiero buscar la solucion.
Al principio si estaban relacionadas al mismo componente IBTransaction y no tenia problemas, luego los separe en dos diferentes, alli empezo todo. Obviamente, volvi a atras y quedo en uno solo y el problema siguio. Lo que sucede es que tambien he heco otros cambios en el codigo por lo que no se lo atribuyo al estar en el mismo componente. |
Sería interesante que antes de hacer el segundo post comprobaras que el campo que esté como foreign key tome el valor adecuado. Si haces un post en la tabla esclava y no le asignas ese valor, posiblemente te grite eso.
Saludos |
Cita:
Hasta luego. ;) |
pero claro¡¡
claro que te va a marcar ese error, ya que cuando construiste tu tabla de detalle llamas a una llave foranea y cuando le das el post a la tabla de detalle no encuentra la liga con la tabla maestra
supongamos que en la tabla maestra tienes un campo ID que lo creas con un trigger para que se autoincremente y ese ID es la relacion que tienes con la tabla detalle entonces Código:
-> inserto en tablamaster |
algo asi
que tal a todos, por lo que se es, cuando se tienen tablas de este estilo maestro-detalle primero se autoincrementa la tabla primaria aun cuando no tenemos nada en el detalle es como el tratado en tablas en paradox, cuando se insertan datos en el detalle ya sea por medio de la grilla o en forma indivual se llama el procedimiento a que se guarde primero la tabla primaria (Post) despues cuando se van agregando los datos en el detalle en el evento de la tabla secundaria onnewrecord se pasa el valor tomado de la primaria a la secundaria
modulo.tbdetalleIdpedido.value:=modulo.tbprimariaIdpedido.value; es decir que ya se tiene presente el valor ID solo lo almacena en la tabla secundaria. espero haber aportado en algo, en caso de que se quede el valor nullo en la secundaria tabla no reculta la relación y ocurre un erro por que esta ligada las tablas. bye a todos |
Cita:
Mi idea original era hacer un solo commit, pero no pasa nada... |
No llevo mucho con FB, así que hablaré bajito:
Por si te sirve, te comento que nos compramos los componentes FibPlus y éstos, dentro de las sentencias SQLs, en INSERT, puedes dar el siguiente valor Código:
insert into tabla_esclava (idPrimario, Campo1) MAS_ hace que el campo idPrimario tome el valor del primario de la maestra (al estilo Paradox). Entiendo que es una solución propietaria de esta gente de Devrace, pero tal vez te oriente. Saludos |
Si estás usando IBX, quizás el truco 4 de mi web te sirva para aclararte algunas ideas
http://www.clubdelphi.com/users/cadetill/truco4.php |
Buscando otra cosa, he visto esto que tal vez te sea de utilidad para lo tuyo
http://www.interbase.com.mx/articulo..._interbase.php |
La franja horaria es GMT +2. Ahora son las 07:31:25. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi