Ich verstehe dein Problem nicht.
Wenn du in deinem Programm eine einheitliche Uhrzeit willst, dann hol sie dir von der DB.
Wie, ist oben beschrieben.
Wenn du eine andere Uhrzeit willst, dann erklär, wie sie aussehen soll.
--
If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch --
Petaod, es geht nicht darum wie ich den Timestamp erzeuge, sondern dass mehrere Rechner im Netzwerk eine identische Uhrzeit haben.
Aus der Datenbank (Access-MDB-File) wie oben beschrieben bekomm ich nicht die Uhrzeit des Rechners wo die Datenbank liegt, sondern des Rechners der auf die Datenbank zugreift. Das ist das Problem. Das habe ich bereits ausprobiert. Ist also nicht die Lösung.
Es geht mir darum um zu verhindern, dass ein Rechner im Netzwerk extrem von der Uhrzeit der anderen Rechner abweicht. Da in den meisten Fällen eine leere BIOS-Stützbatterie für extreme Zeitabweichungen verantwortlich ist, geht in den meisten Fällen die Zeit des betroffenen Rechners nach.
Ich habe die Lösung meines Problems schon gefunden, obwohl es nicht meine Eingangsfrage mit exakter Zeitsynchronisation klärt.
Andy, das sollten sie. Aber ich kanns nicht erzwingen. Wenn ein Anwender
nicht darauf achtet, dass die Uhrzeiten seiner Rechner identisch sind,
dann hat der Anwender probleme mit der Finanz, da die Buchungszeilen in
der Datenbank mit falschen Zeitstempeln erstellt wurden.
Beispiel (vereinfacht):
ID / Zeit / Rechner / Produkt
1 10:30 KasseA 1 Cola
2 10:32 KasseA 2 Schnitzel
3 08:15 KasseB 1 Pizza
4 10:33 KasseA 1 Weinschorle
KasseB geht über 2 Stunden nach. So darf das nicht sein.
Lösung:
Ich prüfe beim Start der KasseB ob das lokale Computerdatum von KasseB
niedriger ist als das Datum des letzten Buchungseintrages in der
Datenbank. Dann kann ich eine entsprechende Meldung ausgeben. So kann
ich zwar die Uhrzeit der Rechner nicht synchronisieren, aber bei
extremen Abweichungen fällt es sofort auf.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „dive26“ ()
Du könntest auch in die DB etwas schreiben und das Modification Date der Datenbankdatei abfragen.
--
If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch --
Ich gehe mal davon aus, du hast eine Server und eine Client Anwendung. Warum packst du nicht die Serveranwendung mit einem Installations Assistenten, zusammen mit einem NTP-Server. Wenn der Kunde nun den Server Installiert, wird Automatisch der NTP-Server installiert. Du kannst in den Wizzard Programmen auch einstellen, dass eine Anwendung Startet sobald man Windows Startet.
Den Server für die Uhrzeit kannst ja ganz einfach selbst schreiben mit den Sockets. Habe leider kein VS hier, sonst würde ich dir einen Beispielcode schreiben.
Also es handelt sich um einen Server im lokalen Netz auf dessen Netzlaufwerk eine Access DB liegt auf die du von VB.NET Clients aus drauf zugreifst? Ist das so korrekt?
Kannst du am Client in der CMD eingeben:
net time \\servername
und schauen was zurückgegeben wird? Dann ginge es mit der API NetRemoteTOD.
Alternativ kannst du WMI verwenden, um die Zeit am Server abzufragen. Beides erfordert allerdings, das keine Firewall zwischen Server und Client existiert die alle Ports blockiert und das am Server der RPC Dienst läuft.
Das ist meine Signatur und sie wird wunderbar sein!
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mono“ ()
Danke für die Tipps. Jedoch ist alles nicht machbar. "Server<>Client" Anwendung ist etwas übertrieben beschrieben. Eine Kasse "spielt" den Server und die Clients greifen auf einen freigegebenen Ordner und auf die darin befindlichen Daten und Datenbanken zu.
Meine Software ist so geschrieben, dass diese jeder User mit nur geringen Computerkenntnissen installieren kann. Alle oben beschriebenen Wege wären ein Mehraufwand den ich meinen Kunden nicht zumuten möchte - würden auch die wenigsten hinbekommen. Das ist mein Service. Andererseits muss die Software auch dann "richtig rechnen", wenn die Uhrzeit (warum auch immer) auf einem Rechner falsch ist. Und hier sehe ich nicht den Kunden in der Pflicht, sondern mich als Programmierer der Software. Meine Kunden verlassen sich darauf, dass meine Software mit solchen Widrigkeiten umgehen kann. Ich erwarte mir das auch
Danke Euch. Die Variante die ich meinen Kunden zumuten kann und die das ursprüngliche Problem löst (nicht stringente Zeit-Buchungseinträge in der Datenbank) habe ich damit gefunden.
Technische Möglichkeiten gibt es viele, aber es muss auch durchführungstechnisch für die Kunden passen.
Die 2 von mir genannten Dinge kannst du in VB.nET in deiner Anwendung einbauen. In einer "normalen" Umgebung funktioniert beides. Es müsste schon jemand bewusst den RPC Dienst abdrehen oder die Ports dafür blocken.
Aber wenn du eine für dich gute Lösung hast, ist es ja eh wurst.^^
Das ist meine Signatur und sie wird wunderbar sein!
Wie wollen dann die User die Uhrzeit bitte mit der Server Uhrzeit vergleichen,
wenn du ja meinst das nicht jeder deiner User eine Internet Verbindung hat.
Oder versteh ich da gerade was Falsch?
Um die Uhrzeit von zwei Rechnern zu vergleichen brauche ich ja kein Internet. Nur eine Verbindung zwischen den beiden Rechnern. Netzwerkverbindung ist nicht gleich Internetverbindung
Habs aber schon auf meine weise gelöst wie oben beschrieben.
Das Problem ist ja auch (hatte ich z.B. heute von einem Kunden berichtet bekommen). Kunde hat Windows 10 und mitten unter dem Arbeiten hat sich auf einmal die Windows-Uhrzeit um 2 Stunden verstellt. Laut Kunde hat niemand manuell verstellt und automatische Internet-Zeitsynchronisation war auch aktiv. Sowas ist auch schwer zu handhaben.