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
public
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