AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Paradox-Datenbanken im Netzwerk nutzen
Thema durchsuchen
Ansicht
Themen-Optionen

Paradox-Datenbanken im Netzwerk nutzen

Ein Thema von eddy · begonnen am 6. Jun 2003 · letzter Beitrag vom 13. Jun 2003
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von eddy
eddy

Registriert seit: 4. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#1

Paradox-Datenbanken im Netzwerk nutzen

  Alt 6. Jun 2003, 23:17
Hallo MrSpock,

ich wende mich gleich an Sie, da ich aus den bereits vorhandenen Beiträgen herausgelesen habe, daß Sie Paradox-DB im Netz erfolgreich verwenden. (Natürlich nehme ich gern auch Hilfe von jedem anderen Nutzer dieses Forums an!)

Ich habe seit mehr als einem Jahr eine kleine Anwendung zur Adressen-, Artikel- und Projektverwaltung in Benutzung, die auf Paradox-DB basiert. Funktioniert so halbwegs, Tools zur Fehlersuche, automatischer Indexerzeugung usw. habe ich mir auch geschaffen.

Aufgrund diverser räumlicher Änderungen ist nun ein zweiter PC dazu gekommen, mit dem ich auf die gleichen Datenbestände zugreifen will.

Zum Test im Netzwerk habe ich folgende Komponenten angelegt:
DS1 : TDataSource (lies DS-Eins)
Tab1 : TTable
DB1 : TDatabase
Sess1 : TSession

Die Anzeige der Daten erfolgt in einem TDBGrid

Über einen Button erfolgt die Aktivierung:
Code:
procedure TForm1.sbAktivierenClick(Sender: TObject);
begin
  DB1.Connected := false;
  Sess1.Active := false;
  Tab1.Active := false;

  Tab1.DatabaseName := Edit1.Text;    // c:\adr\daten oder m:\adr\daten
  Tab1.SessionName := Sess1.SessionName;
  Tab1.TableName := fnAdr; //Adressen.DB

  DS1.DataSet := Tab1;

  DBGrid1.DataSource := DS1;

  DB1.DatabaseName := Edit1.Text; // c:\adr\daten oder m:\adr\daten
  DB1.SessionName := Sess1.SessionName;
  DB1.TransIsolation := tiDirtyRead;

  // während OnActivate wird in Abhängigkeit vom PC
  //   zuvor Sess1.NetFileDir zugewiesen
  // PC mit Datenbank: C:\adr\daten
  // PC ohne Daten: M:\adr\daten

  Sess1.Active := true;
  DB1.Connected := true;
  Tab1.Active := true;
end;
Die Adress-DB enthält einen Primär-Index ID (AutoInc) sowie einen Sekundär-Index Such (A, 40).

Auf beiden PC's erfolgt die Anzeige der Tabelle. Ich ändere auf einem der beiden PC's den aktuellen Suchbegriff von "Test" auf "Testxxxxxx" um und wechsle zum nächsten Datensatz.

Auf dem anderen PC bleibt aber "Test" stehen. Und damit bin ich bei meinem Problem angekommen: wie bringe ich meine Anwendung dazu, daß die Änderungen umgehend nach Wechsel des Datensatzes (und somit dem Abschluß der Änderungenen in diesem Satz) auf dem jeweils anderen PC angezeigt werden?


mfg
eddy
  Mit Zitat antworten Zitat
Benutzerbild von Specialwork
Specialwork

Registriert seit: 10. Jan 2003
Ort: Schwall
71 Beiträge
 
Delphi 8 Professional
 
#2

OnUpdateRecord

  Alt 7. Jun 2003, 01:00
Hallo Eddy,

Ich bin mir zwar nicht sicher, aber Du solltest Dir das Ereignis TQuery.OnUpdateRecord oder TTable.OnUpdateRecord in der Hilfe mal anschauen.

Gruß, Tom
Thomas van Veen
Es gibt keine Probleme, nur Lösungen, auf die man nicht gleich kommt !
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#3
  Alt 7. Jun 2003, 10:08
@Eddy: das, was Du hier beschreibst ist kein Problem von Paradox allein. Dies kann immer auftreten IMHO immer auf, wenn man mit Datenbanken arbeitet, auf die mehrere User gleichzeitig zugreifen. Die Daten, die Du im DBGrid siehst sind immer nur eine Momentaufnahme. Änderst ein ein User einen Datensatz, dann sehen das die anderen zunächst nicht sondern erst wenn dieser Datensatz erneut von der DB gelesen wird.
@Specialwork: Dieses Ereignis tritt ein, wenn in der lokalen Kopie ein Datensatz geändert wird, ist also keine Lösung für das geschilderte Problem.
  Mit Zitat antworten Zitat
woki

Registriert seit: 29. Mär 2003
563 Beiträge
 
Delphi 2006 Architect
 
#4
  Alt 7. Jun 2003, 10:48
@eddy:

Wie r_kerber schon sagte, die Datenbank (weder diese noch andere) übernimmt diese Funktion nicht, und schaut man sich die Philosophie relationaler Datenbanken an, erkennt man, daß sie das auch nicht kaum kann. Wenn das wirklich nötig ist, und ein regelmäßiges Abholen der Daten nicht reicht, wird man einen "Messagingmechnismus" implementieren müssen, über den die Clients sich über erfolgte Datenmodifikationen verständigen, aber ich kann mir nicht vorstellen, daß der Aufwand gerechtfertigt ist.

Gruß
Woki
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#5
  Alt 7. Jun 2003, 10:53
Vielleicht sollte Eddy mal erläutern, wobei ihn dieses Verhalten stört, dann könnte man vieleicht ein paar Tips geben. Die schlechte Lösung ist IMHO ein regelmäßiges automatisches aktualisieren der Daten auf den Clients, da dies nur unnötigen Datenverkehr im Netz erzeugt!
  Mit Zitat antworten Zitat
Mitchl55

Registriert seit: 20. Feb 2003
Ort: Meppen
159 Beiträge
 
Delphi 7 Enterprise
 
#6
  Alt 7. Jun 2003, 11:03
Hallo,

ich habe mit derselben Problematik zu tun. Bisher wird es so gelöst, das das Programm wenn es nicht benötigt wird einfach geschlossen wird und wenn es wieder benötigt wird erneut geöffnet! Blöde Sache und eigentlich nicht im Sinne des Erfinders.

Im Augenblick habe ich nicht die Zeit um eine Idee auszuprobieren, aber vielleicht hilft sie Dir ja weiter oder jemand kann sofort sagen das dieses nicht funktioniert!

Beispiel:

Wenn ich eine Form in einem Programm eingebunden habe, in der Editfelder, Comboboxen (Datenbanken) etc. vorhanden sind in denen ich Dinge eingetragen und ausgewählt habe bleiben bei jedem Aufruf der Form die alten Einstellungen erhalten nur wenn ich das Programm einmal beende und wieder neu starte habe ich die Form wie ich sie programmiert habe! Das ist glaube ich ein Problem ob die Form zur Laufzeit erzeugt wird oder erst wenn ich diese benötige.
http://www.delphipraxis.net/internal_redirect.php?t=3622&highlight=form+erzeug en

Also wäre es doch den Versuch Wert zu überprüfen, ob es etwas bringt, die Form jedesmal komplett zu schliessen und wieder neu zu erzeugen - hier ist es aber nicht mit FormX.close und FormX.open getan wenn ich das richtig verstanden habe... und vieleicht hilft Dir ja dir herausgesuchte Eintrag weiter.

Könnte klappen?... Halt mich auf dem Laufenden...

Gruß

Mitchl
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#7
  Alt 8. Jun 2003, 11:10
Hallo eddy,

geht es dir jetzt darum, dass du die Änderung, die ein anderer Nutzer gemacht hast mitbekommst oder sogar, dass der aktuelle Datensatz in beiden Anwendungen sychron bleibt?

Das zweite ist natürlich nicht so einfach.

Ansonsten hat die r_kerber bereits erklärt, was das Problem ist. Bei einer Desktop Datenbank wie Paradox wird ja eine Kopie der gesamten Tabelle übers Netz geschoben, wenn du darauf zugreifst. Du kannst also nicht sofort mitbekommen, wenn ein anderer Nutzer einen Datensatz ändert.

Die Zuweisung von Werten an bestimmte Eigenschaften, sorgt für ein update.
Wenn du z.B. der Eigenschaft "Filtered" der Tabelle eine Wert zuweist, wird die Tabelle "upgedated". Weise einfach mal dem Event AfterScroll von z.B. Table1 den folgenden Code zu:

Table1.Filtered := Table1.Filtered; Dann wird jedem Scroll Event die Änderungen von anderen angezeigt.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von eddy
eddy

Registriert seit: 4. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#8
  Alt 8. Jun 2003, 16:01
Hallo Leute,

vielen Dank für Eure schnelle Anteilnahme. Da hab' ich mir ja wohl eine schwere Nuß zum Knacken rausgesucht.

Kann mir mal noch jemand verraten, was IMHO heißt? Ist bestimmt ganz einfach, wenn man's weiß.

Die im Beispiel genannten Änderungen sind ein ärgerliches Übel. Wenn ein Nutzer eine Änderung vornimmt, erscheint diese nicht. Noch extremer und richtig störend wird es aber erst, wenn Datensätze gelöscht oder hinzugefügt werden.

Ich habe ein bischen herumprobiert. Mit folgendem Code, z.Zt. noch über einen Button zu aktivieren, wird DBGrid akutallisiert.

Code:
procedure TForm1.sbRefreshClick(Sender: TObject);
var
  aktrec : integer;
begin
  Screen.Cursor := crHourGlass;
  Tab.DisableControls;
  aktrec := Tab.RecNo;
  Tab.Active := false;
  Tab.Active := true;
  Tab.RecNo := aktrec;
  Tab.EnableControls;
  Screen.Cursor := crDefault;
end;
Gibt es eigentlich einen Unterschied zwischen Tab.Active := true und Tab.Open?

Sobald sbRefresh gedrückt wird, erfolgt die gewünschte Aktuallisierung.

@MrSpock:
Code:
Table1.Filtered := Table1.Filtered;
ändert ja eigentlich gar nichts, aber nachdem ich die Einfügung in Tab1AfterScroll vorgenommen habe, läuft das Testprogramm nicht mehr. AfterScroll wird nicht mehr verlassen (F7) und irgenwann gibt's einen Stack-Überlauf.

Es kann doch nicht sein, daß man sich um solche Dinge auch noch selbst kümmern muß - oder doch? Ich war immer der Meinung, daß Netzwerkfähigkeit bedeutet, daß solche Dinge automatisch ablaufen.

mfg
eddy
  Mit Zitat antworten Zitat
Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#9
  Alt 8. Jun 2003, 19:49
Zitat von eddy:
Kann mir mal noch jemand verraten, was IMHO heißt?
in my humble opinion - meiner bescheidenen Meinung nach
Noch Abkürzungen findest Du hier DFÜ-Token und Smileys
Zitat von eddy:
Gibt es eigentlich einen Unterschied zwischen Tab.Active := true und Tab.Open?
Habe ich hier schon mal kurz erläutert.
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#10
  Alt 8. Jun 2003, 20:31
Hallo eddy,

Zitat:
@MrSpock:
Code:
Table1.Filtered := Table1.Filtered;
ändert ja eigentlich gar nichts,
Das ist richtig, aber als Nebeneffekt wird die Tabelle upgedated. Es wäre auch möglich mit Table1.Close; Table1.Open; dasselbe zu erreichen, dann musst du dir aber die alte Position merken und diese wieder einstellen und zusätzlich, damit man davon nicht sieht mit DisableControls bzw. EnableControls verhindern, dass das Grid etwas davon anzeigt. Deshalb habe ich mit der Zuweisung nichts geändert, sondern nur ein Update erzwingen wollen. (Bei mir funktioniert es auch.) Bei dir wird offensichtlich das Scrollevent immer wieder erzeugt, wenn die Tabelle upgedatet wird, auch dort könnte man noch tricksen, aber in diesem Fall ist vielleicht das o.g. Vorgehen vorzuziehen.

Das Netz kann das für dich ja nicht so einfach machen, da du ja nur auf eine Momentaufnahme schaust. Um zu verhindern, dass bei jedem Scrollevent ein Update stattfindet, könntest du auch folgendes machen. Immer wenn ein Datensatz geändert oder hinzugefügt wurde (z.B. im AfterPost) könntest du die aktuelle Zeit in eine Tabelle im Netz eintragen. Im AfterSroll schaust du dann in diese Tabelle. Ist daie Zeit neuer als die letzte Änderung, die du schon mitbekommen hast, ist ein Update nicht notwendig, sonst machst du das Update wie oben beschrieben.
Albert
Live long and prosper


MrSpock
  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 08:07 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