![]() |
Datenbank: firebird 1.5 • Zugriff über: fibplus
datensätze mit events aktualisieren (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:
sobald ein dataset beim user geöffnet wird, registriert sich der zugehörige eventalerter für die ihn betreffenden events:
CREATE trigger dicentries_au1 for dicentries
active after update position 1 as begin post_event 'dicentries update ' || new.id; end
Delphi-Quellcode:
procedure TDataModule1.DataSetDicEntriesAfterOpen(DataSet: TDataSet);
begin //hier nicht relevanter code self.RegisterForDicentries(); end;
Delphi-Quellcode:
wenn das dataset geschlossen wird, wird die registrierung natürlich auch wieder aufgehoben:
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;
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:
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...
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; Weiß da einer vielleicht weiter? Danke, Martin |
Re: datensätze mit events aktualisieren (fibplus)
habe mittlerweile folgendes rausgefunden:
Zitat:
Danke, Martin |
Re: datensätze mit events aktualisieren (fibplus)
Hast Du dir mal den Aufrufstack für diesen Fall angesehen?
Ich denke dein Aufrufstack beinhaltet auch die "Änderungsmethode" und da wird es vermutlich probleme gegen da du dem Auslöser die Daten und dem Hintern wegziehst. Probier mal folgendes: Merk dir den Evenname und Eventcount und für die Arbeiten erst in einer Methode aus die du mittels PostMessage "aktivierst". Diese kommt erst wenn auch deine "Auslösermethode" abgearbeitet wurde. |
Re: datensätze mit events aktualisieren (fibplus)
Zitat:
Zitat:
Danke, Martin |
Re: datensätze mit events aktualisieren (fibplus)
Delphi-Quellcode:
procedure TDataModule1.DicentriesAlerterEventAlert(Sender: TObject;
EventName: String; EventCount: Integer); begin // Evtl. in Liste speichern da mehrere EventAlert kommen könnten vor abarbeitung FEventname := EventName; FEventCount := EventCount; PostMessage(self.Handle, WM_DicentriesAlerterEventAlert); end; procedure TDataModule1.DicentriesAlerterEventAlert(...) begin // Ursprünglicher Code von DicentriesAlerterEventAlert end; |
Re: datensätze mit events aktualisieren (fibplus)
Zitat:
Danke, ich wollt das direkt mal ausprobieren, aber da gibt's ein Problem: self.Handle gibt es nur für TForms und nicht für Datenmodule..was mach ich da? Und was hat es mit WM_DicentriesAlerterEventAlert auf sich?? |
Re: datensätze mit events aktualisieren (fibplus)
Fehlt noch was:
const DicentriesAlerterEventAlert = WM_USER + 101; type TDataModule1 = class(TDataModule)
Delphi-Quellcode:
Evtl. könntest Du dich mit einem (versteckten) Hilfsfenster behelfen.
procedure WMDicentriesAlerterEventAlert(...) message WM_DicentriesAlerterEventAlert;
... procedure TDataModule1.WMDicentriesAlerterEventAlert(...) begin // Ursprünglicher Code von DicentriesAlerterEventAlert end; |
Re: datensätze mit events aktualisieren (fibplus)
in welcher unit ist denn wm_user definiert?
|
Re: datensätze mit events aktualisieren (fibplus)
hab das jetzt hinbekommen und es lag tatsächlich daran! danke..trotzdem würd mich nochmal der hintergrund interessieren, von wegen ich zieh der "methode den hintern weg"...kannst du mir irgendwas zeigen, wo das beschrieben steht..dann musste jetz keine romane schreiben ^^
danke nochmal, martin |
Re: datensätze mit events aktualisieren (fibplus)
In Funktion Verursacher wird Methode CallMethodeWelchemeine2teMethodeAufruft aufgerufen welche ihrerseits
EventCalledBy_CallMethodeWelchemeine2teMethodeAufr uft aufruft. Nach der Abarbeitung von EventCalledBy_CallMethodeWelchemeine2teMethodeAufr uft kommt der Ablauf in die Funktion Verursacher zurück und du arbeitest dann mit einem ungültigen Zeiger weiter.
Delphi-Quellcode:
TForm1.Verursacher;
var MyLocalVar: TZeigeraufirgendwas; begin MyLocalVar := Zeigerwoandersher; CallMethodeWelchemeine2teMethodeAufruft MyLocalVar.Machwas; end; TForm1.EventCalledBy_CallMethodeWelchemeine2teMethodeAufruft; begin Zeigerwoandersher.Free; Zeigerwoandersher := DoCreatezeigerNeu; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz