Ладно сам себе отвечу.
Пришлось сделать небольшую связочку
Идею взял из статьи ClientDataset as a Replacement for Cached Updates
by Dan Miser
http://community.borland.com/article...,22571,00.html
Пока еще дописываю но вроде уже полностью функционирует.
Суть описана в статье. Пока работает на ура. Единственный недостаток при вставке записи слетает позицирование на нее. Может кто предложет как это решить.
Цитата:
TADODataSetEx = class (TClientDataSet)
private
FQSelect,
FQUpdate,
FQInsert,
FQDelete: TADOQuery;
Prov: TDataSetProvider;
function GetConnection:TADOConnection;
procedure SetConnection(Value: TADOConnection);
function GetDeleteSQL: TStrings;
function GetInsertSQL: TStrings;
function GetSelectSQL: TStrings;
function GetUpdateSQL: TStrings;
procedure SetDeleteSQL(Value: TStrings);
procedure SetInsertSQL(Value: TStrings);
procedure SetSelectSQL(Value: TStrings);
procedure SetUpdateSQL(Value: TStrings);
procedure NewApplyChanges(Sender: TObject;
SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;
UpdateKind: TUpdateKind; var Applied: Boolean);
procedure NewAfterPost(DataSet: TDataSet);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy;override;
procedure Open;
procedure Close;
property Connection : TADOConnection read GetConnection write SetConnection;
property DeleteSQL: TStrings read GetDeleteSQL write SetDeleteSQL;
property UpdateSQL: TStrings read GetUpdateSQL write SetUpdateSQL;
property InsertSQL: TStrings read GetInsertSQL write SetInsertSQL;
property SelectSQL: TStrings read GetSelectSQL write SetSelectSQL;
end;
implementation
constructor TADODataSetEx.Create(AOwner: TComponent);
begin
inherited;
FQSelect := TADOQuery.Create(nil);
FQUpdate := TADOQuery.Create(nil);
FQInsert := TADOQuery.Create(nil);
FQDelete := TADOQuery.Create(nil);
Prov := TDataSetProvider.Create(nil);
Prov.DataSet := FQSelect;
SetProvider(Prov);
Prov.BeforeUpdateRecord := NewApplyChanges;
AfterPost := NewAfterPost;
AfterDelete := NewAfterPost;
end;
destructor TADODataSetEx.Destroy;
begin
FQSelect.Free;
FQUpdate.Free;
FQInsert.Free;
FQDelete.Free;
Prov.Free;
inherited;
end;
function TADODataSetEx.GetConnection:TADOConnection;
begin
Result := FQSelect.Connection;
end;
procedure TADODataSetEx.SetConnection(Value: TADOConnection);
begin
FQSelect.Connection := Value;
FQUpdate.Connection := Value;
FQInsert.Connection := Value;
FQDelete.Connection := Value;
end;
function TADODataSetEx.GetDeleteSQL: TStrings;
begin
Result :=FQDelete.SQL
end;
function TADODataSetEx.GetInsertSQL: TStrings;
begin
Result :=FQInsert.SQL
end;
function TADODataSetEx.GetSelectSQL: TStrings;
begin
Result :=FQSelect.SQL
end;
function TADODataSetEx.GetUpdateSQL: TStrings;
begin
Result :=FQUpdate.SQL
end;
procedure TADODataSetEx.SetDeleteSQL(Value: TStrings);
begin
FQDelete.SQL.Assign(Value);
end;
procedure TADODataSetEx.SetInsertSQL(Value: TStrings);
begin
FQInsert.SQL.Assign(Value);
end;
procedure TADODataSetEx.SetSelectSQL(Value: TStrings);
begin
FQSelect.SQL.Assign(Value);
end;
procedure TADODataSetEx.SetUpdateSQL(Value: TStrings);
begin
FQUpdate.SQL.Assign(Value);
end;
procedure TADODataSetEx.NewApplyChanges(Sender: TObject;
SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;
UpdateKind: TUpdateKind; var Applied: Boolean);
var
i:integer;
begin
case UpdateKind of
ukModify:
begin
for i := 0 to FQUpdate.Parameters.Count - 1 do
if FQUpdate.Parameters[i].Direction = pdInput then
if not VarIsEmpty(DeltaDS.FieldByName(FQUpdate.Parameters [i].Name).NewValue) then
FQUpdate.Parameters[i].Value := DeltaDS.FieldByName(FQUpdate.Parameters[i].Name).NewValue
else
FQUpdate.Parameters[i].Value := DeltaDS.FieldByName(FQUpdate.Parameters[i].Name).OldValue;
FQUpdate.ExecSQL;
end;
ukDelete:
begin
for i := 0 to FQDelete.Parameters.Count - 1 do
if FQDelete.Parameters[i].Direction = pdInput then
if not VarIsEmpty(DeltaDS.FieldByName(FQDelete.Parameters [i].Name).NewValue) then
FQDelete.Parameters[i].Value := DeltaDS.FieldByName(FQDelete.Parameters[i].Name).NewValue
else
FQDelete.Parameters[i].Value := DeltaDS.FieldByName(FQDelete.Parameters[i].Name).OldValue;
FQDelete.ExecSQL;
end;
ukInsert:
begin
for i := 0 to FQInsert.Parameters.Count - 1 do
if FQInsert.Parameters[i].Direction = pdInput then
begin
if not VarIsEmpty(DeltaDS.FieldByName(FQInsert.Parameters [i].Name).NewValue) then
FQInsert.Parameters[i].Value := DeltaDS.FieldByName(FQInsert.Parameters[i].Name).NewValue
else
FQInsert.Parameters[i].Value := DeltaDS.FieldByName(FQInsert.Parameters[i].Name).OldValue;
end;
FQInsert.ExecSQL;
end;
end;
Applied := True;
end;
procedure TADODataSetEx.NewAfterPost(DataSet: TDataSet);
begin
ApplyUpdates(-1);
Refresh;
end;
procedure TADODataSetEx.Open;
begin
FQSelect.Open;
inherited;
end;
procedure TADODataSetEx.Close;
begin
inherited;
FQSelect.Close;
end;
end;
|