Ejemplo-TProvider



El ejemplo consiste en dos formularios, en el primero se visualiza la relación maestro detalle y por medio de una opción de menu (delta) nos permite ver los datos anteriores a la modificación y los datos actuales, para ello utilizamos un segundo formulario. Nos permite guardar o deshacer las modificaciones.
 

 unit Unit1;

 interface

 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   ExtCtrls, DBCtrls, Grids, DBGrids, Menus,StdCtrls,db;

 type
   TForm1 = class(TForm)
     MainMenu1: TMainMenu;
     Ver1: TMenuItem;
     Delta1: TMenuItem;
     DBGrid1: TDBGrid;
     DBGrid2: TDBGrid;
     DBNavigator1: TDBNavigator;
     DBNavigator2: TDBNavigator;
     Modificaciones1: TMenuItem;
     Commit1: TMenuItem;
     Rollback1: TMenuItem;
     procedure Commit1Click(Sender: TObject);
     procedure Rollback1Click(Sender: TObject);
     procedure Delta1Click(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
   end;

 var
   Form1: TForm1;

 implementation

 uses Unit2, Unit3;

 {$R *.DFM}

 procedure TForm1.Commit1Click(Sender: TObject);
 begin
   with Datamodule2 do
   begin
     if Clientdataset1.State in [dsEdit, dsInsert] then
       Clientdataset1.Post;
     if Clientdataset1.ChangeCount > 0 then
     begin
       Clientdataset1.ApplyUpdates(-1);
       Clientdataset1.Refresh;
       clientdataset1.LogChanges:=true;
       Clientdataset1.MergeChangeLog;
     end;
     if ClientDataset2.State in [dsEdit, dsInsert] then
       ClientDataset2.Post;
     if Clientdataset2.ChangeCount > 0 then
     begin
       Clientdataset2.ApplyUpdates(-1);
       ClientDataset2.Refresh;
       clientdataset2.LogChanges:=true;
       clientdataset2.mergechangelog;
     end;
   end;
 end;

 procedure TForm1.Rollback1Click(Sender: TObject);
 begin
   datamodule2.ClientDataset1.CancelUpdates;
   datamodule2.Clientdataset2.CancelUpdates;
 end;

 procedure TForm1.Delta1Click(Sender: TObject);
 begin
   //con la propiedad delta podemos ver los datos modificados
   // con su valor antiguo y nuevo
   Application.CreateForm(TForm3, Form3);
   try
     with Datamodule2 do
     begin
       if Clientdataset1.ChangeCount > 0 then
       begin
         Clientdataset3.Close;
         Clientdataset3.Data := Clientdataset1.Delta;
         Clientdataset3.Open;
       end;
       if Clientdataset2.ChangeCount >0 then
       begin
         Clientdataset4.Close;
         Clientdataset4.Data := Clientdataset2.Delta;
         Clientdataset4.Open;
       end;
     end;
     Form3.ShowModal;
   finally
     Form3.Free;
   end;
 end;
 end.

El ejemplo contiene un módulo de datos donde incluimos todos los componentes de acceso a datos. El código asociado al módulo de datos sería:
 

 unit Unit2;

 interface

 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   Db, Provider, BdeProv, DBClient, DBTables;

 type
   TDataModule2 = class(TDataModule)
     Database1: TDatabase;
     Table1: TTable;
     Table2: TTable;
     ClientDataSet1: TClientDataSet;
     ClientDataSet2: TClientDataSet;
     Provider1: TProvider;
     Provider2: TProvider;
     ClientDataSet3: TClientDataSet;
     ClientDataSet4: TClientDataSet;
     DataSource1: TDataSource;
     DataSource2: TDataSource;
     DataSource3: TDataSource;
     DataSource4: TDataSource;
     procedure ClientDataSet1ReconcileError(DataSet: TClientDataSet;
       E: EReconcileError; UpdateKind: TUpdateKind;
       var Action: TReconcileAction);
     procedure ClientDataSet2ReconcileError(DataSet: TClientDataSet;
       E: EReconcileError; UpdateKind: TUpdateKind;
       var Action: TReconcileAction);
   private
     { Private declarations }
   public
     { Public declarations }
   end;

 var
   DataModule2: TDataModule2;
 
 implementation
 
 uses unit4;
 {$R *.DFM}

 procedure TDataModule2.ClientDataSet1ReconcileError(
   DataSet: TClientDataSet; E: EReconcileError; UpdateKind: TUpdateKind;
   var Action: TReconcileAction);
 begin
   Action := HandleReconcileError(DataSet, UpdateKind, E);
 end;

 procedure TDataModule2.ClientDataSet2ReconcileError(
 DataSet: TClientDataSet; E: EReconcileError; UpdateKind: TUpdateKind;
 var Action: TReconcileAction);
 begin
   Action := HandleReconcileError(DataSet, UpdateKind, E);
 end;
 end.

Existe otro formulario que solamente tiene dos dbgrid donde se visualizaran los datos cuando pulsemos la opción Delta.

NOTA: El ejemplo se encuentra en el CD en:
           . \ejemplos\TProvider


(C) 1999 Database DM. la reproduccion total o parcial de este documento, asi como la divulgación de parte o la totalidad