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 24-09-2003
ElSanto24 ElSanto24 is offline
Miembro
 
Registrado: ago 2003
Ubicación: Elche
Posts: 14
Poder: 0
ElSanto24 Va por buen camino
problemas al borrar una tabla detalle en interbase 7

Hola a todo el mundo que lea esto..hace algun tiempo escribí un post referente a la actualización de interbase, ahora mi problema es algo más grave....intentaré exponer con total claridad:

he creado en el ibconsole una tabla de clientes tal como sigue

create table clientes (
codcli integer not null,
....,
....,
primary key (codcli))

y por otro lado tengo otra tabla creada tb en IB llamada direcciones de entrega que no es más que un detalle de la tabla anterior...su codigo es el siguiente

create table direntrega(
codcli integer not null,
coddirentrega integer not null,
...,
...,
...,
primary key (codcli,coddirentrega)

y aquí es donde viene el meollo del tema...originalmente puse en este mismo create table lo siguiente

foreign key (codcli) references clientes(codcli) on delete cascade on update cascade

ok...hasta aquí no debiera de estar mal (por favor, corregidme)

he aqui que cuando estoy en mi aplicacion cliente, al borrar un registro del master (estan bien enganchados los datasets) me da el error

violation foreing key constraint "....." on table direntrega

esto solo ocurre cuando:
abro el formulario del master
creo un registro
pulso el boton del formulario detalle
creo un registro
salgo del formulario detalle (hago commitRetaining) y en el ibconsole se ve como se actualiza todo
y una vez que he vuelto al formulario master
y le doy a borrar registro
plaf!!!!
mensajito!!!!!

Esta es una llamada de desesperacion porque no sé qué puede ocurrir.

Una alternativa que tambien he probado es utilizando triggers tal como sigue

create trigger tborrar on clientes active after delete as
begin
delete from direntrega where codcli=old.codcli
end

y ...evidentemente si utilizo trigger borro el foreign key...pero aun así...mensajito....

Alguien ha estado en la misma situación?
Alguien tiene implementado en interbase un master detalle y sea tan amable de postear su código que elimina?
Alguien me puede explicar la filosofia de interbase en cuanto a cómo actúa para el ejemplo de eliminación de registros?

Sé que si se lanza el trigger en el server, en mi cliente (programa delphi) no se va a mostrar el dataset del detalle actualizado por ello en el evento afterdelete del dataset de clientes hago un
dsfdirentrega.close
dsfdirentrega.open
y posteriormente commitRetaining o RollbackRetaining (un try)

En fin....por favor ayudadme si teneis esa sabiduria...es importante pq stoy en una fase donde ahora me enfrento a muchos master/detail

Gracias de antemano
__________________
El camino para llegar al conocimiento de las cosas pasa por el aprendizaje humilde de lo que nos rodea
Responder Con Cita
  #2  
Antiguo 24-09-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
Hola.

No uso las actualizaciones y borrados en cascada en la integridad referencial, por lo que no te puedo decir que es lo que está fallando en la primera prueba que haces.

Respecto al trigger, el problema es que lo pones en el After Delete. Si usas el trigger Before Delete no deberias tener ese problema. (Ocurre que borras los detalles después de borrar el maestro, en lugar de hacerlo antes).

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #3  
Antiguo 24-09-2003
ElSanto24 ElSanto24 is offline
Miembro
 
Registrado: ago 2003
Ubicación: Elche
Posts: 14
Poder: 0
ElSanto24 Va por buen camino
hola marc:

He seguido tu consejo, en lugar de ponerlo after delete lo lo puse before delete, lo probé...y aparentemente funcionaba pues no aparece el mensaje de antes, pero realmente no lo está haciendo bien, cuando voy al ibconsole veo que los registros que debia haber borrado de la tabla detalle permanecen mientras que el registro maestro a desaparecido...así que, una pena pero no funciona correctamente

A alguien se le ocurre otra posibilidad....

pensando un poco llego a la conclusion de que no es tan descabellado ponerlo after delete pues, mientras lanzo la peticion al servidor, hasta que no haga commit no se va a reflejar, el commit o el rollback lo hago en el evento afterdelete...la pregunta es...¿ se dispara antes el trigger? o lo hace el evento delphi?, si la respuesta es que el trigger se dispara antes entonces no hay problema en que lo pusiera after delete creo yo...sin embargo si la respuesta fuera que el evento de delphi se lanza antes entonces si que habria problemas.....

He probado el ejemplo que viene del MastApp un ejemplo de delphi con maestro detalle y ....sorprendentemente tambien me aparece error de foreign key....a vosotros os ocurre?, estoy empezando a pensar que pueda llegar a ser el interbase que tengo....pero, no tiene sentido..no me lo explico....

en fin...para más inri y desesperacion mia, he creado un trigger "after delete" con un post_event tal que así:
create trigger aviso for clientes active after delete
as
begin
post_event 'aviso';
end

despues en delphi
hago lo siguiente

IBEvents1.Events.Add('AVISO');
IBEvents1.Registered:=true;

y en el OnEvent hago:

procedure TFPrincipal.IBEvents1EventAlert(Sender: TObject;
EventName: String; EventCount: Integer; var CancelAlerts: Boolean);
begin
showmessage('hola mundo');
end;

hay algo que me falte???
porque pasa de mi face por el forro...y ya no se que pensar

alguna idea?
gracias
__________________
El camino para llegar al conocimiento de las cosas pasa por el aprendizaje humilde de lo que nos rodea
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 08:24: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
Copyright 1996-2007 Club Delphi