Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Ratschlag für Zeitfunktion

Begonnen von Carl, Januar 20, 2020, 16:32:20

⏪ vorheriges - nächstes ⏩

Carl

#15
Ich habe jetzt ein frmTime auf Basis einer tblTime mit den Feldern inmark und outmark angelegt. Beim Laden setze ich die inmark.


On Error GoTo Err_cmdInmark
     DoCmd.GoToRecord , , acNewRec
     Forms!frmTime!inmark = Now()
Exit_Form_Load:
     Exit Sub
Err_cmdInmark:
     MsgBox Err.Description
     Resume Exit_Form_Load


Wie kann ich bewirken, dass beim Entladen setzt er auf die selbe Weise einen Zeitstempel.

Kann man jetzt diesen Code verwenden, um das Eintragen der Zeitstempel umgekehrt erfolgen zu lassen, sofern eine Zeit von 5 Minuten Inaktivität erkannt wird?

https://docs.microsoft.com/en-us/office/vba/access/Concepts/Miscellaneous/detect-user-idle-time-or-inactivity


Carl

Hondo

Hallo Carl,
was meinst du mit Entladen? Das Form?
Wie wird das Form geöffnet/geschlossen?

Es wäre viel einfacher dir zu helfen wenn du eine funktionierende Test-Datenbank hochladen würdest.
Doch mal anderst gefragt - bringt es dich weiter wenn du auf der Protokollierung von Inaktivität herumreitest?

Es wäre doch viel einfacher wenn du deine Datenbank so gestaltest, dass beim Start des Fragebogens ein Zeitstempel geschrieben wird und beim Schließen genauso.
Wenn du deine Ergebnisse dann auswertest kannst du einfach berechnen wieviel Minuten vergangen sind, und die Fragebögen, die viel zu lange geöffnet waren einfach ignorierst bzw. als Ausreiser aus deiner Berechnung heraus nimmst.

Gruß Andreas



Carl

#17
Hallo Andreas.

Es ist wichtig zu sehen, dass es keine Datenbank ist, sondern immer nur eine einzelne Bearbeitung möglich ist. Die Gründe für diese Vorgabe kann ich nicht ändern.

Die Bearbeitung wird von allen Benutzern immer unterbrochen und dass soll in der tblTime erkannt werden. Ich habe hier zwei Formulare, in der die Funktionen kommentiert sind.

frmTime, das in tblTime beim laden eine [inmark] und beim entladen eine [outmark] setzt. Hierfehlt ein Timer, der Inaktivität erkennt und frmTime2 öffnet.

frmTime2, das in tblTime beim laden eine [outmark] setzt und beim klicken eines Buttons eine [inmark setzt]. (siehe Quelltexte.) Hier ist das Problem, dass frmTime2 den selben datensatz bearbeitet wie zuvor schon frmTime. Das soll nicht geschehen.

Ziel: tblTime soll vollständig mit inmark und outmarks aufgefüllt sein, um am Ende mit einer Abfrage die aktive Zeit zu erfassen.

Carl

Hondo

Was soll es sonst sein wenn keine Datenbank?
Du hast doch 2 Buttons: der eine um ein Themenkomplex zu öffnen -> Zeitstempel setzen
der andere um aus dem Themenkomplex wieder auszusteigen über zurück -> Zeitstempel setzen.
Wenn jemand die Anwendung schließt -> Check ob Zeitstempel für das beenden eines Themenkomplexes gesetzt, wenn nicht dann -> Zeitstempel setzen.
Beide Zeitstempel mit Angabe des Themenkomplexes sollte dir doch ausreichend Information liefern wer wie lange für einen Themenkomplex benötigt hat.
Wenn jetzt jemand ein Themenkomplex vorzeitig abbricht -> Zeitstempel
Und wenn er ihn wieder aufnimmt -> Zeitstempel
In einer Abfrage kannst du alle Zeitdifferenzen eines Themenkomplexes ausrechnen lassen und summieren. Dazu benötigst du das Formular das am Beginn aufpoppt gar nicht.
Das ist im Prinzip eine Art Versionsverwaltung light, in der Themenkomplexe ein- und ausgecheckt werden.
Das mit Inaktivität würde ich total vernachlässigen, das wird dir nichts bringen.

Ist das ein Test für Bürokräfte, Immigranten oder was?
Solle jetzt eigentlich genug Input für dich dabei sein um was daraus zu machen.
Gruß Andreas

DF6GL

#19
Hallo,

es gibt halt kein Event, weder Windows- noch Formular-Event, das bei einer  Unterbrechung auftritt.... (Timeout)

Einen solchen Timeout muss man selbst erzeugen.

Vorschlag:

Starte beim Laden des Forms eine Uhr (Zeitgeber) mit definierter Laufzeit und schreib die Zeit in die Tabelle. Ist die Zeit vergangen (Uhr abgelaufen), dann schreib die Zeitmarke in die Tabelle und starte die Uhr wieder. Für jedes Control und das Formular selber erzeuge eine "Bei Taste"-Ereignisprozedur, die die Uhr von neuem starten lassen  (Resetten) . Ebenso für die Mouse-Move-Ereignisse. 

Dann erhältst Du eine Liste (Datensätze), die die Zeitpunkte (abzüglich der Uhr-Laufzeit) zeigen, bei denen die letzte Aktivität stattgefunden hat.



Carl

Gute Idee, aber fällt mir schwer.

Ich wollte den Code unter dem Link von PhilS dazu nutzen, der Inaktivität detektiert und dann das frmTime2 starten, der auch den outmark setzt.

https://docs.microsoft.com/en-us/office/vba/access/Concepts/Miscellaneous/detect-user-idle-time-or-inactivity

Leider weiß ich nicht, wie ich ihn anpasse. Und auch scheint frmTime2 in den selben Datensatz wie frmTime zu schreiben.

Carl

DF6GL

Hallo,


Wozu brauchst Du weitere Forms?

Ändere die Prozedur IdleTimeDetected(ExpiredMinutes)  so ab, als dass anstatt der Anzeige einer MsgBox die aktuelle Zeit und Zeitdauer in eine Tabelle geschrieben wird.   Am Ende der Access-Session kann die Tabelle dann ausgewertet werden.

Wo ist da das Problem?



Carl

Das Problem liegt darin, dass ich es nicht hin bekomme. Dass ich es nicht kann. Ich verstehe es immer erst, wenn ich es irgendwo funktionierend sehe. Es sind in dem verlinkten Code ja auch zwei separat abzulegende Teile.

Carl

DF6GL

Hallo,

Du brauchst doch nur die Anleitung im Link zu verfolgen....

Was genau verstehst Du daran nicht?


Carl

Also der obere Code kommt in ein leeres ungebundenes Formular, das DetectIdleTime heißt. Und der untere Code?

Carl


Carl

Warum soll das betreffende Formular nicht an eine Tabelle gebunden sein? Carl

DF6GL

Hallo Carl,

also, es verwundert jetzt aber etwas...


Ich frage mal andersherum: warum sollte das Form an eine Tabelle gebunden werden?


Es hat doch nur die Funktion, einen Timer bereitzustellen und die Position des Fokus (in anderen Formularen mit z. B. "Screen.ActiveControl") festzustellen und daraus den Schluss zu ziehen, ob der Fokus bewegt wurde.


Carl

Ich habe es jetzt mal so mit einem einzigen Formular basierend auf tblTime gebastelt, siehe Anhang. Es werden manchmal aber bei Datensätzen keine outmarks gesetzt. Und ich bin mir nicht sicher, ob wirklich immer Arbeitszeit erfasst wird.

Carl

Hondo

Hallo Carl,
warum speicherst du ständig den aktuellen Datensatz bei Klick auf "zu schwer"? Binde doch einfach das Feld "zuschwer" an die Datenherkunft.
Und du musst unbedingt sprechende Bezeichner für die Steuerelemente wählen. Weißt du in 1 Woche noch was Befehl39 ist?
Dein ganzes Projekt erscheint mir ziemlich verworren - sorry dafür.
Gruß Andreas