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 23-04-2004
brandolin brandolin is offline
Miembro
 
Registrado: jul 2003
Ubicación: Mendoza
Posts: 324
Poder: 21
brandolin Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 23-04-2004
pijo pijo is offline
Miembro
 
Registrado: sep 2003
Ubicación: Barcelona, casi
Posts: 56
Poder: 21
pijo Va por buen camino
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?
__________________
Ánimos.
Responder Con Cita
  #3  
Antiguo 23-04-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #4  
Antiguo 23-04-2004
brandolin brandolin is offline
Miembro
 
Registrado: jul 2003
Ubicación: Mendoza
Posts: 324
Poder: 21
brandolin Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 23-04-2004
floren floren is offline
Miembro
 
Registrado: dic 2003
Posts: 31
Poder: 0
floren Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 24-04-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

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"???

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 27-04-2004
sanxpue sanxpue is offline
Miembro
 
Registrado: jul 2003
Posts: 196
Poder: 21
sanxpue Va por buen camino
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
__________________
saludos desde Puebla Mexico..
asanxt@hotmail.com
"como siempre a sus ordenes y siempre con buena cara"
'lolita me excitas, perversa piel de melocotón'
Responder Con Cita
  #8  
Antiguo 27-04-2004
uper uper is offline
Miembro
 
Registrado: abr 2004
Posts: 296
Poder: 21
uper Va por buen camino
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
Responder Con Cita
  #9  
Antiguo 28-04-2004
brandolin brandolin is offline
Miembro
 
Registrado: jul 2003
Ubicación: Mendoza
Posts: 324
Poder: 21
brandolin Va por buen camino
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...
Responder Con Cita
  #10  
Antiguo 28-04-2004
floren floren is offline
Miembro
 
Registrado: dic 2003
Posts: 31
Poder: 0
floren Va por buen camino
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
Responder Con Cita
  #11  
Antiguo 28-04-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
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
Responder Con Cita
  #12  
Antiguo 28-04-2004
floren floren is offline
Miembro
 
Registrado: dic 2003
Posts: 31
Poder: 0
floren Va por buen camino
Buscando otra cosa, he visto esto que tal vez te sea de utilidad para lo tuyo

http://www.interbase.com.mx/articulo..._interbase.php
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


La franja horaria es GMT +2. Ahora son las 14:55:43.


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