Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Tablas relacionadas + commit (https://www.clubdelphi.com/foros/showthread.php?t=9451)

brandolin 23-04-2004 14:13:08

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.

pijo 23-04-2004 17:20:19

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?

jachguate 23-04-2004 17:23:03

Cita:

Empezado por brandolin
El tema tiene sentido ya que estoy grabando algo violando un foreign declarado.

No hay forma de violar los foreign keys activos en la bd. Supongo que vos tampoco estas tratando de hacer eso, o si?? Como no lo creo, solo te sugiero que encerres todo en un Try/except, y si eleva la excepción del KeyViolation, mandes a freir papas al usuario...

Hasta luego.

;)

brandolin 23-04-2004 21:59:48

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.

floren 23-04-2004 22:55:11

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

jachguate 24-04-2004 20:00:54

Cita:

Empezado por brandolin
si doy los mensajes pero el so se completa el proceso, y es para eso que quiero buscar la solucion.

Esta parte no la entendí... que quiere decir "el so completa el proceso"??? :confused:

Hasta luego.

;)

sanxpue 27-04-2004 02:13:18

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
-> post
-> Llama el numero del generador, asignaselo al campo de relacion de la tabla
    detalle
-> inserto en tabladetalla
-> post (*)
-> commit

y haber que tal jala

uper 27-04-2004 23:41:16

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

brandolin 28-04-2004 00:57:39

Cita:

Empezado por sanxpue
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
-> post
-> Llama el numero del generador, asignaselo al campo de relacion de la tabla
    detalle
-> inserto en tabladetalla
-> post (*)
-> commit

y haber que tal jala

en realidad no jala nada, yo probe esto y no funciono, debo tener algo mal. El commit debe realizarce en la tabla master y luego en cada detalle.

Mi idea original era hacer un solo commit, pero no pasa nada...

floren 28-04-2004 07:31:34

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)
values
(:MAS_IDPrimario, :Campo1)

Estando la propiedad DataSource de la tabla esclava apuntando al TDataSource de la maestra. Los TTransacion son comunes a todas las tablas y hago un único commit tras insertar datos en la maestra y en la esclava.

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

__cadetill 28-04-2004 10:54:22

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

floren 28-04-2004 11:12:04

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 04:22:38.

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