Autor Beitrag
Micha339
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mo 14.04.14 23:28 
Hallo zusammen,

ich benötige bitte ein paar Gedankenanstöße. Ein mittels Delphi 2007 erstelltes Programm greift auf eine zentrale Datenbank (PostgreSQL) zu. Das Programm lädt dabei zum Start so ziemlich alle erforderlichen Tabellen in den Arbeitsspeicher (TDataSources -> TPgTables). Bei Daten-Änderungen werden diese auch an die Datenbank zurück übermittelt. Allerdings bekommt dies ein anderer Rechner im Netzwerk, auf dem ebenfalls das Programm läuft eben nicht mit.

Im Hinblick auf PostgreSQL habe ich von "Notify Trigger" gelesen, weiß aber nicht, wie ich es umsetze mit Delphi 2007. Kann mir jemand dazu Tipps geben (auch unter dem Aspekt, ob/wie dieses Notify bei mehreren, gleichzeitig im Netzwerk aktiven Programmen funktioniert)?

Wie setzt man derartiges mit MS SQL (Express) um? Möglich, dass Kenner die Antwort darauf leicht im Netz finden, ich habe diesbezüglich nichts gefunden, was mir wirklich hilft. Für Tipps danke ich im Voraus.

Gruß
Micha


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am So 27.04.2014 um 12:43
FBrust
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 30
Erhaltene Danke: 2



BeitragVerfasst: Di 15.04.14 07:44 
Hallo,

eine mögliche Vorgehensweise wäre z. B.

- Daten erst unmittelbar vor der Anzeige bzw. vor der Verarbeitung laden. Auf diese Weise hast Du immer den aktuellsten Stand.
- Vor dem Speichern prüfen (z. B. mit einem TimeStamp), ob der zu ändernde Datensatz geändert wurde, falls ja: Hinweis an den
Anwender, falls nein: Speichern (mit Aktualisierung des Timestamps).

Das wäre jetzt ein allgemeingültiger Vorschlag ins Blaue hinein.


Gruß
Frank

Für diesen Beitrag haben gedankt: Micha339
Micha339 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Di 15.04.14 08:33 
Hallo,

user profile iconFBrust hat folgendes geschrieben Zum zitierten Posting springen:


eine mögliche Vorgehensweise wäre z. B.

- Daten erst unmittelbar vor der Anzeige bzw. vor der Verarbeitung laden. Auf diese Weise hast Du immer den aktuellsten Stand.
- Vor dem Speichern prüfen (z. B. mit einem TimeStamp), ob der zu ändernde Datensatz geändert wurde, falls ja: Hinweis an den
Anwender, falls nein: Speichern (mit Aktualisierung des Timestamps).


Timestamp ist mir so oft über den Weg gelaufen und dennoch habe ich gar nicht daran gedacht. Besten Dank. Das wäre etwas, was ich beim Hinzufügen oder Ändern berücksichtigen kann. Ein Problem sehe ich aber weiterhin: Auf einem Rechner wird ein Datensatz gelöscht. Auf den anderen Rechnern bekommt man davon nichts mit:

Beispiel, damit es einfach ist: Kundendatenbank:
Vorgang: Auf einem Rechner wird ein Kunde gelöscht.

1. Auf einem anderen Rechner wird dieser Kunde gerade bearbeitet und die Änderung gespeichert und somit der Kunde in der DB wieder erzeugt. Eine Lösung wäre das "BeforePost"-Ereignis abzufangen, prüfen, ob der Kunde existiert und wenn nicht, dann Abbruch. Geht das auch einfacher (mir fällt dazu nichts anderes im Moment ein, weil ich dann nämlich noch eine Variable mitführen müsste, ob der Kunde grundsätzlich neu angelegt wurde oder es sich um eine Änderung handelt)?

2. Auf anderen Rechnern ist Kundenübersicht aktiv. Ich kann doch nicht laufend ein Polling durchführen und prüfen, ob die Daten noch aktuell sind. Gibt's eine Art Push-System im Netzwerk, was die anderen Rechner über einen Vorgang (hier Löschen) informiert?

Gruß
Micha
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Di 15.04.14 08:42 
Ich hab keine Ahnung, ob es das bei PostgreSQL gibt. Bei Firebird kann man in der Datenbank sogenannte Events auslösen. Dann kannst Du z.B. in einem Trigger (z.B. Delete-Trigger der Kundentabelle) POST_EVENT 'DEL_KD'; aufrufen.
Die Clients können sich für die Events, die sie mitbekommen möchten, registrieren. Dafür gibt es entsprechende Delphikomponenten, die beim Eintreffen eines solchen Datenbankevents dann ein Ereignis auslösen. Und dort könntest Du dann die Kundenübersicht aktualisieren.

Zum ersten Teil:
Da musst Du überlegen, was Du willst. Entweder sperrst Du den Kundendatensatz bei Bearbeitungsbeginn und gibst ihn erst bei Bearbeitungende wieder frei. Somit kann er nicht gelöscht werden, während er in Bearbeitung ist. Doof ist, wenn der User den Kunden bearbeitet und dann in die Mittagspause geht und so der Datensatz ewig gesperrt ist.

Oder Du lässt es wie es ist. Dann gewinnt halt derjenige, der zuletzt seine Änderung an die DB übermittelt. Da hast Du sehr kurze Sperrzeiten.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)

Für diesen Beitrag haben gedankt: Micha339
Micha339 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Di 15.04.14 14:04 
Danke, ich werde einmal schauen, ob sich unter PostgreSQL mehrere Clients für einen Trigger registrieren können.
JohannPeter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Sa 26.04.14 15:26 
Hallo
Funktioniert der TimeStamp auch bei Paradox- und Access-Datenbanken?
Vielen Dank für eure Hilfe :)