![]() |
Paradox-Datenbanken im Netzwerk nutzen
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:
Die Adress-DB enthält einen Primär-Index ID (AutoInc) sowie einen Sekundär-Index Such (A, 40).
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; 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 |
OnUpdateRecord
Hallo Eddy,
Ich bin mir zwar nicht sicher, aber Du solltest Dir das Ereignis
Delphi-Quellcode:
oder
TQuery.OnUpdateRecord
Delphi-Quellcode:
in der Hilfe mal anschauen.
TTable.OnUpdateRecord
Gruß, Tom |
@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. |
@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 |
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!
|
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. ![]() 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 |
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:
Delphi-Quellcode:
Dann wird jedem Scroll Event die Änderungen von anderen angezeigt.
Table1.Filtered := Table1.Filtered;
|
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:
Gibt es eigentlich einen Unterschied zwischen Tab.Active := true und Tab.Open?
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; Sobald sbRefresh gedrückt wird, erfolgt die gewünschte Aktuallisierung. @MrSpock:
Code:
ä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.
Table1.Filtered := Table1.Filtered;
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 |
Zitat:
Noch Abkürzungen findest Du hier ![]() Zitat:
![]() |
Hallo eddy,
Zitat:
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:52 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 by Thomas Breitkreuz