Hola.
Cuando la estructura del algoritmo se complejiza y estamos en una situación nueva, es muy útil crearse un ejemplo simple para cotejar con lo echo.
Te hice uno basado en
Firebird+IBX, espero te sirva de guía.
Tablas:
Código SQL
[-]
SET TERM ^ ;
CREATE TABLE MAESTRO(
ID INTEGER NOT NULL,
TEXT VARCHAR(30) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
CONSTRAINT PK_MAESTRO PRIMARY KEY(ID)
)^
CREATE TABLE DETALLE (
ID INTEGER NOT NULL,
TEXT VARCHAR(30) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
MAESTRO_ID INTEGER NOT NULL,
CONSTRAINT PK_DETALLE PRIMARY KEY(ID),
CONSTRAINT FK_DETALLE FOREIGN KEY(MAESTRO_ID) REFERENCES MAESTRO(ID)
) ^
SET TERM ; ^
DataModule:
Código Delphi
[-]
unit Unit2;
interface
uses SysUtils, Classes, DB, IBCustomDataSet, IBDatabase;
type
TDataModule1 = class(TDataModule)
IBDatabase1: TIBDatabase;
IBTransaction1: TIBTransaction;
tbMaster: TIBDataSet;
tbDetail: TIBDataSet;
dsMaster: TDataSource;
dsDetail: TDataSource;
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
private
public
end;
var
DM: TDataModule1;
implementation {$R *.dfm}
procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
IBTransaction1.DefaultDatabase := IBDatabase1;
tbMaster.Database := IBDatabase1;
tbMaster.SelectSQL.Text := 'SELECT * FROM MAESTRO';
tbMaster.RefreshSQL.Text := 'SELECT ID, TEXT FROM MAESTRO WHERE ID = :ID';
tbMaster.ModifySQL.Text := 'UPDATE MAESTRO SET ID = :ID, TEXT = :TEXT WHERE ID = :OLD_ID';
tbMaster.InsertSQL.Text := 'INSERT INTO MAESTRO(ID, TEXT) VALUES(:ID, :TEXT)';
tbMaster.DeleteSQL.Text := 'DELETE FROM MAESTRO WHERE ID = :OLD_ID';
dsMaster.DataSet := tbMaster;
tbMaster.CachedUpdates := True;
tbDetail.Database := IBDatabase1;
tbDetail.SelectSQL.Text := 'SELECT * FROM DETALLE WHERE MAESTRO_ID = :ID';
tbDetail.RefreshSQL.Text := 'SELECT ID, TEXT, MAESTRO_ID FROM DETALLE WHERE ID = :ID';
tbDetail.ModifySQL.Text := 'UPDATE DETALLE SET ID = :ID, TEXT = :TEXT, MAESTRO_ID = :MAESTRO_ID WHERE ID = :OLD_ID';
tbDetail.InsertSQL.Text := 'INSERT INTO DETALLE(ID, TEXT, MAESTRO_ID) VALUES(:ID, :TEXT, :MAESTRO_ID)';
tbDetail.DeleteSQL.Text := 'DELETE FROM DETALLE WHERE ID = :OLD_ID';
tbDetail.DataSource := dsMaster;
dsDetail.DataSet := tbDetail;
tbDetail.CachedUpdates := True;
end;
procedure TDataModule1.DataModuleDestroy(Sender: TObject);
begin
tbDetail.CachedUpdates := False;
tbMaster.CachedUpdates := False;
end;
end.
(el DataModule deberá ser el primero en Auto-create forms )
Prueba:
Código Delphi
[-]
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls,
DBCtrls, Grids, DBGrids, StdCtrls;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
GroupBox2: TGroupBox;
DBGrid2: TDBGrid;
DBNavigator2: TDBNavigator;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation {$R *.dfm}
uses Unit2;
procedure TForm1.FormCreate(Sender: TObject);
begin
DBGrid1.DataSource := DM.dsMaster;
DBNavigator1.DataSource := DM.dsMaster;
DBGrid2.DataSource := DM.dsDetail;
DBNavigator1.DataSource := DM.dsDetail;
DM.tbMaster.Open;
DM.tbDetail.Open;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DM.tbDetail.Close;
DM.tbMaster.Close;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
DM.tbMaster.Append;
DM.tbMaster.FieldByName('ID').AsInteger := 5;
DM.tbMaster.FieldByName('TEXT').AsString := 'ROW 5';
DM.tbDetail.Append;
DM.tbDetail.FieldByName('ID').AsInteger := 6;
DM.tbDetail.FieldByName('TEXT').AsString := '';
DM.tbDetail.FieldByName('MAESTRO_ID').AsInteger := 5;
DM.tbDetail.DataSource := nil;
try
DM.IBDatabase1.ApplyUpdates([DM.tbMaster, DM.tbDetail]);
finally
DM.tbDetail.DataSource := DM.dsMaster;
end;
end;
end.
Resultado:
Saludos
Pd: Si el código de prueba te pudiera ser útil avisame y te lo adjunto.