hi
ich muss ein bisschen ausholen, um mein problem zu beschreiben; hoffentlich liest sich das einer durch:
meine anwendung soll es ermöglichen, dass mehrere benutzer gleichzeitig auf ein und dieselbe datenbank zugreifen; trotzdem sollen alle daten in jeder instanz des programms immer aktuell sein.
die anwendung verwendet ein grid zur darstellung der datensätze beim user. es sind immer maximal 20 records im dataset des users.
wie mache ich das mit dem aktualisieren:
ich habe in meiner datenbank 2 trigger definiert, die folgende events ablassen:
SQL-Code:
CREATE trigger dicentries_ad0 for dicentries
active after delete position 0
as
begin
post_event 'dicentries delete ' || old.id;
end
SQL-Code:
CREATE trigger dicentries_au1 for dicentries
active after update position 1
as
begin
post_event 'dicentries update ' || new.id;
end
sobald ein dataset beim user geöffnet wird, registriert sich der zugehörige eventalerter für die ihn betreffenden events:
Delphi-Quellcode:
procedure TDataModule1.DataSetDicEntriesAfterOpen(DataSet: TDataSet);
begin
//hier nicht relevanter code
self.RegisterForDicentries();
end;
Delphi-Quellcode:
procedure TDataModule1.RegisterForDicentries;
var
bm: TBookMark;
begin
try
bm := self.DataSetDicEntries.GetBookmark();
self.DataSetDicEntries.First();
while not self.DataSetDicEntries.Eof do
begin
self.DicentriesAlerter.Events.Add('dicentries delete ' + IntToStr(self.DataSetDicEntriesID.AsInt64));
self.DicentriesAlerter.Events.Add('dicentries update ' + IntToStr(self.DataSetDicEntriesID.AsInt64));
self.DataSetDicEntries.Next();
end;
self.DicentriesAlerter.RegisterEvents();
self.DataSetDicEntries.GotoBookmark(bm);
except
end;
end;
wenn das dataset geschlossen wird, wird die registrierung natürlich auch wieder aufgehoben:
Delphi-Quellcode:
procedure TDataModule1.DataSetDicEntriesBeforeClose(DataSet: TDataSet);
begin
try
self.DicentriesAlerter.UnRegisterEvents();
self.DicentriesAlerter.Events.Clear();
except
end;
end;
so, in der routine, die ein event behandelt, wird der entsprechende eintrag aktualisiert:
Delphi-Quellcode:
procedure TDataModule1.DicentriesAlerterEventAlert(Sender: TObject;
EventName: String; EventCount: Integer);
var
bm: TBookMark;
i: Int64;
begin
if Tokenize(EventName,' ')[1] = 'update' then
begin
bm := self.DataSetDicEntries.GetBookmark();
id := StrToInt64(Tokenize(EventName,' ')[2]);
self.DataSetDicEntries.First();
while self.DataSetDicEntriesID.AsInt64 <> id do
self.DataSetDicEntries.Next();
self.DataSetDicEntries.Refresh();
self.DataSetDicEntries.GotoBookmark(bm);
end
else
begin
self.DataSetDicEntries.Close();
self.DataSetDicEntries.Open();
end;
end;
So, wenn ich jetzt in meiner Anwendung (EINE Instanz der Anwendung) ZWEI Instanzen derselben Datenbank öffne (also mit zwei Instanzen des DataModule) und sich die geladenen Datensätze der beiden Datasets überschneiden, dann funktioniert das zwar mit dem Update problemlos, aber beim Delete hängt sich das Prog auf, als wäre es in irgendeiner Endlosschleife...
Weiß da einer vielleicht weiter?
Danke,
Martin
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.