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

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-03-2007
Avatar de morta71
morta71 morta71 is offline
Miembro
 
Registrado: may 2006
Ubicación: Girona - España
Posts: 30
Poder: 0
morta71 Va por buen camino
Error Foreyng key en Master-Detail

Hola a todos,

hace un tiempo que vengo aprendiendo con Firebird, y ahora me llego el turno de las tablas maestro-detalle.

Bien el caso es que no sé como evitar el error "violation of FOREYNG KEY constraint".

Esto realizando las pruebas con la siguiente base de datos:

Código SQL [-]
 CREATE DATABASE 'C:\FDBDATA\PRUEBAS.fdb'
 USER 'SYSDBA' PASSWORD 'masterkey';
 
 CREATE GENERATOR ID_MASTER;
 SET GENERATOR ID_MASTER TO 0;
 
 CREATE TABLE LINEAS (
     ID           INTEGER NOT NULL,
     LINEA        INTEGER NOT NULL,
     DESCRIPCION  VARCHAR(20)
 );
 
 CREATE TABLE MASTER (
     ID      INTEGER NOT NULL,
     NOMBRE  VARCHAR(20)
 );
 
 ALTER TABLE LINEAS ADD CONSTRAINT PK_LINEAS PRIMARY KEY (LINEA, ID);
 ALTER TABLE MASTER ADD CONSTRAINT PK_MASTER PRIMARY KEY (ID);
 
 ALTER TABLE LINEAS ADD CONSTRAINT RELATION_200 FOREIGN KEY (ID) REFERENCES MASTER (ID);
 
 CREATE TRIGGER MASTER_BI0 FOR MASTER
 ACTIVE BEFORE INSERT POSITION 0
 AS
 begin
   NEW.ID = GEN_ID(ID_MASTER, 1);
 end;

He creado un formulario con el DBEdit para el campo NOMBRE de la tabla Master, y un DBGrid para la tabla Lineas. Las tablas tienen la propiedad CachedUpdates activada.

En algún sitio lei que daba problemas al actualizar si la propiedad DataSource de la tabla subordinada 'detalles' estaba asisgnada en el momento del post, así que en el evento click del botón grabar hay el siguiente código:

Código Delphi [-]
procedure TForm1.Button3Click(Sender: TObject);
begin
  DataModule2.Lineas.DataSource := nil;

  DataModule2.Master.Post;
end;


El código del DataModule son los siguiente:

Código Delphi [-]
 unit Unit2;
 
 interface
 
 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   IBDatabase, Db, IBCustomDataSet;
 
 type
   TDataModule2 = class(TDataModule)
     IBDatabase: TIBDatabase;
     IBTransaction: TIBTransaction;
     Master: TIBDataSet;
     Lineas: TIBDataSet;
     dsMaster: TDataSource;
     dsLineas: TDataSource;
     procedure DataModuleCreate(Sender: TObject);
     procedure MasterAfterCancel(DataSet: TDataSet);
     procedure MasterAfterDelete(DataSet: TDataSet);
     procedure MasterAfterPost(DataSet: TDataSet);
     procedure LineasBeforeEdit(DataSet: TDataSet);
     procedure DataModuleDestroy(Sender: TObject);
     procedure LineasNewRecord(DataSet: TDataSet);
   private
     { Private declarations }
   public
     { Public declarations }
   end;
 
 var
   DataModule2: TDataModule2;
 
 implementation
 
 {$R *.DFM}
 
 procedure TDataModule2.DataModuleCreate(Sender: TObject);
 begin
   IBDatabase.Open;
   Master.Open;
   Lineas.Open;
 end;
 
 procedure TDataModule2.MasterAfterCancel(DataSet: TDataSet);
 begin
   Master.CancelUpdates;
   Lineas.CancelUpdates;
 end;
 
 procedure TDataModule2.MasterAfterDelete(DataSet: TDataSet);
 begin
   IBDatabase.ApplyUpdates([Lineas, Master]);
   IBTransaction.CommitRetaining;
 end;
 
 procedure TDataModule2.MasterAfterPost(DataSet: TDataSet);
 begin
   Lineas.Post;
 
   IBDatabase.ApplyUpdates([Master, Lineas]);
   IBTransaction.CommitRetaining;
 
   Lineas.DataSource := dsMaster;
 end;
 
 procedure TDataModule2.LineasBeforeEdit(DataSet: TDataSet);
 begin
   Master.Edit;
 end;
 
 procedure TDataModule2.DataModuleDestroy(Sender: TObject);
 begin
   IBTransaction.Rollback;
   IBDatabase.Close;
 end;
 
 procedure TDataModule2.LineasNewRecord(DataSet: TDataSet);
 begin
   Lineas.FieldByName('ID').AsInteger := Master.FieldByName('ID').AsInteger;
 end;
 
 end.


¿Puede alguien orientarme dónde estoy fallando, o que puedo hacer para solucionar el error "violation of FOREYNG KEY constraint"?

Saludos
Responder Con Cita
 



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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Dá error "Master has detail records" cuando no debería darlo! JuanBCT Tablas planas 3 06-08-2005 03:48:37
DBLookupComboBoxs Master/Detail o Detail/Master yusnerqui OOP 5 29-07-2005 18:40:20
master/detail, imprimiendo master en cada hoja acalderonr Impresión 4 29-11-2003 14:46:07
interbase:¿como crear un master-detail-detail? ElSanto24 Firebird e Interbase 2 22-10-2003 10:24:45
Master/Detail/Detail/Detail/etc... hgiacobone Tablas planas 2 24-07-2003 17:20:31


La franja horaria es GMT +2. Ahora son las 16:34:19.


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