1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
| unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.Grids, Vcl.DBGrids,
Vcl.StdCtrls, Vcl.Buttons, Datasnap.DBClient;
type
TForm2 = class(TForm)
ClientDataSetCtrlGrid: TClientDataSet;
ClientDataSetCtrlGridVALUE: TIntegerField;
DataSourceCtrlGrid: TDataSource;
btnFillDBCtrlGrid: TBitBtn;
DBGridFusion: TDBGrid;
btnFillDBGridFusion: TBitBtn;
ClientDataSetFusion: TClientDataSet;
ClientDataSetFusionVALUE: TIntegerField;
ClientDataSetFusionVALUEX: TStringField;
procedure btnFillDBCtrlGridClick(Sender: TObject);
procedure btnFillDBGridFusionClick(Sender: TObject);
procedure ClientDataSetCtrlGridCalcFields(DataSet: TDataSet);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.btnFillDBCtrlGridClick(Sender: TObject);
var
I: Integer;
begin
if not ClientDataSetCtrlGrid.Active then
ClientDataSetCtrlGrid.CreateDataSet();
for I := 0 to 9 do
begin
ClientDataSetCtrlGrid.Append();
ClientDataSetCtrlGridVALUE.AsInteger := ClientDataSetCtrlGrid.RecordCount + 1;
ClientDataSetCtrlGrid.Post();
end;
end;
//------------------------------------------------------------------------------
function AddCalculatedField(ADataSet: TDataSet; const Name: string; DataType: TFieldType; Size: Integer = 0; Required: Boolean = False): TField;
begin
// Avant de forcer la création d'un champ calculé, il faut créer les champs persistants définis.
if ADataSet.Fields.Count = 0 then
raise EDatabaseError.Create('Must create fields before add calculated field');
Result := ADataSet.FindField(Name);
if not Assigned(Result) then
begin
Result := DefaultFieldClasses[DataType].Create(ADataSet);
Result.FieldName := Name;
Result.Name := Name;
if ADataSet is TClientDataSet then
Result.FieldKind := fkInternalCalc
else
Result.FieldKind := fkCalculated;
Result.DataSet := ADataSet;
end;
end;
//------------------------------------------------------------------------------
procedure ConnectDataSet(ADataSetExtended: TDataSet; ADataSetConnected: TDataSet; const AKeyFields: string; const AFieldsNames: array of string);
var
I: Integer;
Field: TField;
ConnectedField: TField;
begin
if ADataSetExtended.Active then
raise EDatabaseError.Create('The extended DataSet must be close');
// Avant de forcer la création d'un champ lié, il faut créer les champs persistants définis.
if ADataSetExtended.Fields.Count = 0 then
raise EDatabaseError.Create('Must create fields before add calculated field');
if not ADataSetConnected.Active then
raise EDatabaseError.Create('The connected DataSet must be open');
for I := Low(AFieldsNames) to High(AFieldsNames) do
begin
Field := ADataSetConnected.FieldByName(AFieldsNames[I]);
ConnectedField := TFieldClass(Field.ClassType()).Create(ADataSetExtended);
ConnectedField.FieldName := 'ConnectTo' + AFieldsNames[I];
ConnectedField.FieldKind := fkLookup;
ConnectedField.Size := Field.Size;
ConnectedField.LookupDataSet := ADataSetConnected;
ConnectedField.LookupKeyFields := AKeyFields;
ConnectedField.LookupResultField := AFieldsNames[I];
ConnectedField.KeyFields := AKeyFields;
ConnectedField.Lookup := True;
ConnectedField.DataSet := ADataSetExtended;
end;
end;
procedure TForm2.btnFillDBGridFusionClick(Sender: TObject);
var
I: Integer;
begin
if not ClientDataSetFusion.Active then
ClientDataSetFusion.CreateDataSet();
for I := 0 to 9 do
begin
ClientDataSetFusion.Append();
ClientDataSetFusionVALUE.AsInteger := ClientDataSetFusion.RecordCount + 1;
ClientDataSetFusionVALUEX.AsString := IntToHex(ClientDataSetFusionVALUE.AsInteger, 8);
ClientDataSetFusion.Post();
end;
ConnectDataSet(ClientDataSetCtrlGrid, ClientDataSetFusion, 'VALUE', ['VALUE', 'VALUEX']);
AddCalculatedField(ClientDataSetCtrlGrid, 'CALC', ftInteger);
end;
procedure TForm2.ClientDataSetCtrlGridCalcFields(DataSet: TDataSet);
begin
DataSet.FieldByName('CALC').AsFloat := DataSet.FieldByName('Value').AsFloat * DataSet.FieldByName('ConnectToValue').AsFloat;
end;
end. |
Partager