AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi datensätze mit events aktualisieren (fibplus)
Thema durchsuchen
Ansicht
Themen-Optionen

datensätze mit events aktualisieren (fibplus)

Ein Thema von sancho1980 · begonnen am 5. Aug 2006 · letzter Beitrag vom 7. Aug 2006
 
sancho1980

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

datensätze mit events aktualisieren (fibplus)

  Alt 5. Aug 2006, 12: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz