Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.09.2006, 10:43
Simbar Simbar вне форума
Прохожий
 
Регистрация: 15.07.2006
Сообщения: 24
Репутация: 10
По умолчанию Необходимо доработать TADODataSet

В общем такой простой трабл. Необходимо В ADO сделать аналог TUpdateSQL в BDE. т.е. на события должны отрабатывать мои запросы. Проблема в том что объект долен работать как обычный TDataSet т.е. перекрыты все его стандартные обработчики. Может кто-нибудь видел что-либо подобное либо подскажет как к этому подступиться.
Ответить с цитированием
  #2  
Старый 19.09.2006, 17:32
Simbar Simbar вне форума
Прохожий
 
Регистрация: 15.07.2006
Сообщения: 24
Репутация: 10
Смех

Ладно сам себе отвечу.
Пришлось сделать небольшую связочку
Идею взял из статьи 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;
Ответить с цитированием
  #3  
Старый 19.09.2006, 18:00
Simbar Simbar вне форума
Прохожий
 
Регистрация: 15.07.2006
Сообщения: 24
Репутация: 10
По умолчанию

ОЧЕПЯТКИ:
procedure TADODataSetEx.NewAfterPost(DataSet: TDataSet);
begin
ApplyUpdates(-1);
Refresh;
end;
следует читать как
procedure TADODataSetEx.NewAfterPost(DataSet: TDataSet);
begin
ApplyUpdates(-1);
FQSelect.Close;
FQSelect.Open;
Refresh;
end;

Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:06.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter