dbExpress - criando mestre-detalhe 3 camadas usando clientdataset (tdatasetfield) |
Top Previous Next |
|
Sistema em 3 camadas para mestre-detalhes com ClientDataSet
PaiFilho.dpr ==================================================================
program PaiFilho;
uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {DataModule2: TDataModule};
{$R *.res}
begin Application.Initialize; Application.CreateForm(TDataModule2, DataModule2); Application.CreateForm(TForm1, Form1); Application.Run; end.
Unit1.Pas =====================================================================
unit Unit1;
interface
uses Forms, DB, StdCtrls, Buttons, Classes, Controls, Grids, DBGrids;
type TForm1 = class(TForm) DBGrid1: TDBGrid; DBGrid2: TDBGrid; DataSource1: TDataSource; DataSource2: TDataSource; BitBtn1: TBitBtn; procedure BitBtn1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private a: TTransactionDesc; end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject); begin DataModule2.PaiCDS.ApplyUpdates(0); DataModule2.SQLConnection1.Commit(A); end;
procedure TForm1.FormCreate(Sender: TObject); begin a.TransactionID := 2; a.IsolationLevel := xilREADCOMMITTED; DataModule2.SQLConnection1.StartTransaction(a); DataModule2.PaiCDS.Active:= true; end;
end.
Unit1.dfm =====================================================================
object Form1: TForm1 Left = 205 Top = 211 BorderStyle = bsSingle Caption = 'Form1' ClientHeight = 405 ClientWidth = 688 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 object DBGrid1: TDBGrid Left = 0 Top = 0 Width = 688 Height = 237 Align = alTop DataSource = DataSource1 TabOrder = 0 TitleFont.Charset = DEFAULT_CHARSET TitleFont.Color = clWindowText TitleFont.Height = -11 TitleFont.Name = 'MS Sans Serif' TitleFont.Style = [] end object DBGrid2: TDBGrid Left = 0 Top = 237 Width = 688 Height = 120 Align = alTop DataSource = DataSource2 TabOrder = 1 TitleFont.Charset = DEFAULT_CHARSET TitleFont.Color = clWindowText TitleFont.Height = -11 TitleFont.Name = 'MS Sans Serif' TitleFont.Style = [] end object BitBtn1: TBitBtn Left = 548 Top = 368 Width = 75 Height = 25 Caption = 'BitBtn1' TabOrder = 2 OnClick = BitBtn1Click end object DataSource1: TDataSource DataSet = DataModule2.PaiCDS Left = 28 Top = 96 end object DataSource2: TDataSource DataSet = DataModule2.FilhoCDS Left = 24 Top = 304 end end
Unit2.pas =====================================================================
unit Unit2;
interface
uses SysUtils, Classes, DBXpress, FMTBcd, DBClient, Provider, DB, SqlExpr;
type TDataModule2 = class(TDataModule) SQLConnection1: TSQLConnection; PaiSQL: TSQLDataSet; FilhoSQL: TSQLDataSet; PaiDSP: TDataSetProvider; PaiCDS: TClientDataSet; FilhoCDS: TClientDataSet; PaiSQLCODIGO: TIntegerField; PaiSQLDESCRICAO: TStringField; PaiCDSCODIGO: TIntegerField; PaiCDSDESCRICAO: TStringField; PaiDS: TDataSource; FilhoSQLCODIGO: TIntegerField; FilhoSQLCODIGOPAI: TIntegerField; FilhoSQLDESCRICAO: TStringField; FilhoSQLQUANT: TIntegerField; PaiCDSFilhoSQL: TDataSetField; end;
var DataModule2: TDataModule2;
implementation
{$R *.dfm}
end.
Unit2.dfm =====================================================================
object DataModule2: TDataModule2 OldCreateOrder = False Left = 630 Top = 305 Height = 268 Width = 340 object SQLConnection1: TSQLConnection ConnectionName = 'Teste' DriverName = 'Interbase' GetDriverFunc = 'getSQLDriverINTERBASE' LibraryName = 'dbexpint.dll' LoginPrompt = False Params.Strings = ( 'DriverName=Interbase' 'Database=D:\paifilho\teste.gdb' 'RoleName=RoleName' 'User_Name=sysdba' 'Password=masterkey' 'ServerCharSet=win1252' 'SQLDialect=3' 'BlobSize=-1' 'CommitRetain=False' 'WaitOnLocks=True' 'ErrorResourceFile=' 'LocaleCode=0000' 'Interbase TransIsolation=ReadCommited' 'Trim Char=False') VendorLib = 'gds32.dll' Connected = True Left = 36 Top = 8 end object PaiSQL: TSQLDataSet CommandText = 'select * from TABLE1' MaxBlobSize = -1 Params = <> SQLConnection = SQLConnection1 Left = 112 Top = 8 object PaiSQLCODIGO: TIntegerField FieldName = 'CODIGO' end object PaiSQLDESCRICAO: TStringField FieldName = 'DESCRICAO' Size = 50 end end object FilhoSQL: TSQLDataSet CommandText = 'SELECT * from TABLE2 where codigo = :codigo' DataSource = PaiDS MaxBlobSize = -1 Params = < item DataType = ftInteger Name = 'CODIGO' ParamType = ptInput Size = 4 end> SQLConnection = SQLConnection1 Left = 176 Top = 8 object FilhoSQLCODIGO: TIntegerField FieldName = 'CODIGO' Required = True end object FilhoSQLCODIGOPAI: TIntegerField FieldName = 'CODIGOPAI' end object FilhoSQLDESCRICAO: TStringField FieldName = 'DESCRICAO' Size = 30 end object FilhoSQLQUANT: TIntegerField FieldName = 'QUANT' end end object PaiDSP: TDataSetProvider DataSet = PaiSQL Options = [poPropogateChanges] Left = 108 Top = 56 end object PaiCDS: TClientDataSet Active = True Aggregates = <> Params = <> ProviderName = 'PaiDSP' Left = 108 Top = 112 object PaiCDSCODIGO: TIntegerField FieldName = 'CODIGO' end object PaiCDSDESCRICAO: TStringField FieldName = 'DESCRICAO' Size = 50 end object PaiCDSFilhoSQL: TDataSetField FieldName = 'FilhoSQL' end end object FilhoCDS: TClientDataSet Active = True Aggregates = <> DataSetField = PaiCDSFilhoSQL Params = <> Left = 176 Top = 60 end object PaiDS: TDataSource DataSet = PaiSQL Left = 108 Top = 168 end end
Base.sql ======================================================================
/* Tables definitions */ CREATE TABLE TABLE1 (CODIGO INTEGER, DESCRICAO VARCHAR (50) CHARACTER SET WIN1251 COLLATE WIN1251);
CREATE TABLE TABLE2 (CODIGO INTEGER NOT NULL, CODIGOPAI INTEGER NOT NULL, DESCRICAO VARCHAR (30) CHARACTER SET WIN1251 COLLATE WIN1251, QUANT INTEGER);
/* Primary keys definition */ ALTER TABLE TABLE2 ADD CONSTRAINT PK_TABLE2 PRIMARY KEY (CODIGO, CODIGOPAI);
/* Indices definition */ CREATE UNIQUE INDEX PK_TABLE2 ON TABLE2 (CODIGO, CODIGOPAI); |