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