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);