Auf herunterfahren des PCs reagieren und Datensatz update machen

Lit-Web

Aktives Mitglied
Hallo Leute,

ich bin dabei eine Arbeitszeiterfassung für unsere Entwickler zu programmieren, dafür nutze ich awt, swing.

Das ganze basiert auf einer Datenbank die auf einem Webserver liegt.

Das manuelle durch den Entwickler auslösende speichern der Daten funktioniert ohne Problem, beim kommen drückt er auf den Button und die Zeit wird gespeichert, beim gehen genau das selbe. Nun gehts aber darum, dass es dem Mitarbeiter auch passieren kann wenn er heim gehen will den geht Button zu drücken und den PC einfach herunter fährt. Da will ich nur mit einem kleinen Hintergrundprogramm reagieren und automatisch die geht Zeit ergänzen.

Meine Frage, geht das, also das überhaupt möglich so umzusetzen, wenn ja was muss ich mir dazu eventuell anschauen um eine Lösung erarbeiten zu können?

Vielen Dank für eure Zeit und Tipps. Gruß Lit-Web
 
Hab mal ein keines dirty Programm für einen Arbeitskollegen geschrieben, welches in etwa das gleiche macht. Allerdings ist gar keine Action erforderlich, ich update einfach im Hintergrund alle 30sec den Datensatz. Ist vielleicht nicht optimal, aber zielführend 😉
 
Hmm, danke für eure Antworten, aber das ist mir nicht wirklich verlässlich genug und alle 30 Minuten updaten kann eben automatisierte Verfälschungen zu ungunsten des Mitarbeiters mit sich bringen.

Ich denke ich werde, wenn der Mitarbeiter sich einloggt und am Vortag vergessen hat den geht Button zu drücken ihn mit einem Dialog begrüßen das er die letzte geht Zeit nachtragen soll.

Falls noch jemand eventuell eine bessere Idee hat, dann vielen Dank.
 
Speicher doch die Daten lokal z.B. in einer H2-embedded-Datenbank. Beim speichern setzt du ein Flag oder bereinigst die Datensätze komplett. Ansonsten bringst du bei Progrmamstart eine Meldung, dass noch Änderungen vorhanden sind. Das speichern könnte dann passieren, wenn der Anwender das Feld verlässt.

Muss natürlich keine Datenbank sein. Aber einfach, dass du den aktuellen State gesichert hast.
 
Sei mir nicht böse aber das verstehe ich grad nicht ganz, die Daten werden in einer Mysql Datenbank auf einen Firmeninternen Webserver gespeichert.

Also dem Server der im Intranet erreichbar ist.
 
Ich versuchs nochmal 😀.

Also, sobald der Anwender Änderungen im Programm machst speicherst du diese lokal (datenbank, xml, text-datei oder sonst etwas). Wird das Programm unerwartet beendet, dann hast du immernoch eine Datei mit dem letzten Änderungen. Dadurch kannst du diese beim Programmstart wiederherstellen. Drückt der Benutzer jetzt auf "speichern", dann sendest du die Daten an den Server.

Die Daten die du lokal hälst kannst du dann wieder löschen.
 
Ich versuchs nochmal 😀.

Also, sobald der Anwender Änderungen im Programm machst speicherst du diese lokal (datenbank, xml, text-datei oder sonst etwas). Wird das Programm unerwartet beendet, dann hast du immernoch eine Datei mit dem letzten Änderungen. Dadurch kannst du diese beim Programmstart wiederherstellen. Drückt der Benutzer jetzt auf "speichern", dann sendest du die Daten an den Server.

Die Daten die du lokal hälst kannst du dann wieder löschen.

Ok danke jetzt habe ich das verstanden.

Das wäre auch eine Idee, ich werde die Ideen meinem Chef mal nahe bringen und dann sehen was er dazu sagt.

Ich dachte erst ich kann mit einem Java Backendprogramm auf das Event herunterfahren aus dem Windows reagieren. Ich dachte das im Betriebssystem Hintergrund irgendwo etwas passiert wo ich mit dem Java Programm zugreifen kann.
 
Ich dachte erst ich kann mit einem Java Backendprogramm auf das Event herunterfahren aus dem Windows reagieren. Ich dachte das im Betriebssystem Hintergrund irgendwo etwas passiert wo ich mit dem Java Programm zugreifen kann.

Geht ja auch, nur nicht vllt immer so zuverlässig, wie du es haben möchtest (wie meine Vorredner beschrieben haben).
 
Ich würde das anders lösen. 2 Ansätze:

1) gpedit.msc Computerkonfigurationen -> Windowseinstellung -> Scripts Starten/Herunterfahren und dort ein kleines Javaprogramm ausführen was die An/Abmeldezeit in die DB einträgt. Hat den Vorteil, dass das beim Energiesparmodus des PC kein Event auslöst. Nachteil: versetzt sich der PC in den Schlafmodus weil der Entwickler in einem Meeting ist und der Mensch geht von dort direkt nach Hause (PC ist ja schon aus) klappt das nicht.

2) Vom Server aus die Workstation alle 10 Sekunden anpingen und solange sie online ist gilt das als Arbeitszeit. Nachteil: Geht der PC in den Energiesparmodus klappt das nicht mehr.

Aufpassen: Wenn der Anwender an diesem Tag schon einen Arbeitszeitbeginn eingetragen hat, darf der Wert nicht überschrieben werden (zb. nach einem Reboot).

Bernd
 
Mein Vorschlag:

In der Datenbank eine Zeile für jeden Entwickler und Tag (name, tag, anfang, ende)

Beim start des Programms schreibst du eine zeile rein mit dem entwickler, dem tag, und dem anfang und ende=anfang

dann machst du einen thread mit einer endlosschleife
Java:
    while (true) {
      //SQL: UPDATE setzte ENDE auf NOW(), das ist die Zeit in der der Entickler zuletzt gelebt hat WHERE TAG=HEUTE
      Thread.sleep(60 * 1000);
    }
Das liefert dir für jeden Tag eine Zeile mit dem Einschaltdatum und auf die Minute genau die Zeit, als der Thread noch lebte

Warum reicht das nicht?

Klar, wenn er vergisst das Programm zu beenden und seinen Rechner nicht ausschaltet war er eben bis Mitternacht da, aber das Problem kannst du nicht lösen. Er könnte ja auch vor dem Computer eingeschlafen sein 🙂
 
Wenn du dich auf Windows konzentrieren kannst, wäre ein anderer Weg über nativen Code (also Winapi, ggfs. mit JNA machbar). Hier in der MSDN gibt es einige Funktionen zu diesem Thema, vielleicht erfüllt dies eher deine Erwartungen. Einfach wird es bestimmt nicht ;-)

Aber ehrlich gesagt würde ich es über den ShutdownHook machen, ich denke das müsste ganz gut funktionieren.
 
Danke euch allen für die vielen Antworten, jetzt habe ich natürlich erst mal einiges dank euch zusammen was ich meinem Chef als Diskussionsgrunlage liefern kann. Das was und wie wird sich dann sicher noch entscheiden.

@Bleiglanz

Das was du da schreibst macht Sinn. Wenn das Problem einschläft vorm PC dann kann ich darauf nicht reagieren. Jedoch drücken die Benutzer beim kommen auf "kommt" und beim gehen auf "geht". Das speichert eben auch die Zeiten wenn die zum Mittag gehen, oder eine rauchen gehen.
Es geht eben nur um den Feierabend wenn sie vergessen auf "geht" zu drücken.
 

Neue Themen


Zurück
Oben