Ver Mensaje Individual
  #10  
Antiguo 18-05-2018
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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;

  // Master table
  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;

  // Detail table
  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
  // add some data to master
  DM.tbMaster.Append;
  DM.tbMaster.FieldByName('ID').AsInteger  := 5;
  DM.tbMaster.FieldByName('TEXT').AsString := 'ROW 5';
  // add some data to detail
  DM.tbDetail.Append;
  DM.tbDetail.FieldByName('ID').AsInteger  := 6;
  DM.tbDetail.FieldByName('TEXT').AsString := '';
  DM.tbDetail.FieldByName('MAESTRO_ID').AsInteger := 5;
  // Save cache data
  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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita