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
Antwort Antwort
Seite 1 von 2  1 2      
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
sancho1980

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

Re: datensätze mit events aktualisieren (fibplus)

  Alt 6. Aug 2006, 13:10
habe mittlerweile folgendes rausgefunden:

Zitat:
OnEventAlert wird in einem eigenen Thread ausgeführt, um eine echte asynchrone Ereignisverarbeitung zu ermöglichen. Die IBEvents-Komponente stellt aber durch den entsprechenden Quelltext sicher, dass immer nur eine Ereignisbehandlungsroutine ausgeführt werden kann.
Das Quote stammt zwar aus den Docs zu IBX, aber ich nehme an, dass trifft auf FIB auch zu. Habe durch Probieren einfach mal rausgefunden, dass in dem Handler zu OnEventAlert bestimmte Dinge einfach mal nicht gehen und das Prog einfrieren (zum Beispiel das Öffnen und Schließen von Datasets). Meine Vermutung ist, dass es damit zusammenhängt, dass die Procedure in einem eigenen Thread ausgeführt wird. Jetzt dachte ich, vielleicht kann ich den Thread irgendwie beenden und die entsprechenden Jobs regulär im Programm ausführen...aber wie könnt ich das anstellen? Wenn ich aus dem Handler eine neue Procedure aufrufe bin ich immer noch im selben Thread, oder? Hat jemand von dem ganzen Thread-Zeugs Ahnung?

Danke,

Martin
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: datensätze mit events aktualisieren (fibplus)

  Alt 6. Aug 2006, 15:08
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
sancho1980

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

Re: datensätze mit events aktualisieren (fibplus)

  Alt 6. Aug 2006, 15:17
Zitat von Bernhard Geyer:
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.
Kannst du das bitte bisschen genauer erklären? Was meinst du mit Änderungsmethode. Und wie ist das mit dem Hintern wegziehen gemeint?

Zitat von Bernhard Geyer:
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.
Wie stell ich das an? Kannst du das mal mit bisschen Pseudocode skizzieren?

Danke,

Martin
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: datensätze mit events aktualisieren (fibplus)

  Alt 6. Aug 2006, 16:11
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;
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
sancho1980

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

Re: datensätze mit events aktualisieren (fibplus)

  Alt 6. Aug 2006, 16:34
Zitat von Bernhard Geyer:
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;

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??
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: datensätze mit events aktualisieren (fibplus)

  Alt 6. Aug 2006, 17:06
Fehlt noch was:

const
DicentriesAlerterEventAlert = WM_USER + 101;

type
TDataModule1 = class(TDataModule)
Delphi-Quellcode:
procedure WMDicentriesAlerterEventAlert(...) message WM_DicentriesAlerterEventAlert;

...

procedure TDataModule1.WMDicentriesAlerterEventAlert(...)
begin
  // Ursprünglicher Code von DicentriesAlerterEventAlert
end;
Evtl. könntest Du dich mit einem (versteckten) Hilfsfenster behelfen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
sancho1980

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

Re: datensätze mit events aktualisieren (fibplus)

  Alt 6. Aug 2006, 17:17
in welcher unit ist denn wm_user definiert?
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
sancho1980

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

Re: datensätze mit events aktualisieren (fibplus)

  Alt 6. Aug 2006, 17:30
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
Um Rekursion zu verstehen, muss man zunächst Rekursion verstehen.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: datensätze mit events aktualisieren (fibplus)

  Alt 6. Aug 2006, 17:46
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;
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 06:51 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