Einzelnen Beitrag anzeigen

sancho1980

Registriert seit: 7. Feb 2006
429 Beiträge
 
#1

datensätze mit events aktualisieren (fibplus)

  Alt 5. Aug 2006, 13:10
Datenbank: firebird 1.5 • Zugriff über: fibplus
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] = 'updatethen
    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.
  Mit Zitat antworten Zitat