Hallo, ich habe mal eine Frage zu einer Zeitfunktion.
Gegeben ist ein Fragebogen, der über mehrere Sitzungen ausgefüllt werden kann. Ich möchte, dass die Zeit, die der Proband mit dem Fragebogen verbringt, in etwa erfasst wird. Es soll ungefähr abgeschätzt werden. Da dache ich mir, dass in einer extra Tabelle fortlaufend Zeitstempel eingetragen werden
* beim Öffnen der DB
* wenn die letzte Eingabe länger als 10 Minuten her ist
* wenn darauf folgend die nächste Eingabe gemacht wird
* beim schließen der DB
Jetzt die Fragen:
* Haltet Ihr dieses Vorgehen für sinnvoll? Wenn nein, welche Alternativen?
* Ist das technisch umsetzbar und wenn ja, wie? Mit welchen Funktionen?
vielen Dank im Voraus
Carl
Hallo,
ich würde das nur im Öffnen/schließen Ereignis des Formulars machen wo der Fragebogen sich befindet.
Ob das sinnvoll ist musst du entscheiden. Machbar ist das schon.
Letzte Eingabe länger als 10 Minuten...
ist auch machbar. z.B. wenn du einen Button für "weiter" zur nächsten Frage o.Ä. hast, kannst du beim Klicken auf diesen Button einen Zähler starten. Me.Timerevent = 600000 für 10 Minuten z.B.
Im Timerevent kannst du dann darauf reagieren, z.B. Formulareingabe abbrechen oder MsgBox ausgeben + neuen Timer starten zum prüfen ob auf MsgBox reagiert wird in x Minuten etc.
Wenn du aber das statistisch auswerten möchtest, brauchst du das nicht. Dann eleminierst du einfach die Ausreiser zum bereinigen deiner Stichprobe.
Gruß Andreas
Danke, ich denke mal drüber nach. Das mit dem Popup und dem Weiter-Button finde ich auf den ersten Blick am besten. Es geht im Wesentlichen darum zu registrieren, ob er den Platz verlässt oder träumend aus dem Fenster schaut.
Carl
ZitatEs geht im Wesentlichen darum zu registrieren, ob er den Platz verlässt oder träumend aus dem Fenster schaut.
Das wäre aber einem Timer egal. Da solltest Du eher einen Druckschalter am Stuhl auswerten.
Hallo,
ZitatEs geht im Wesentlichen darum zu registrieren, ob er den Platz verlässt oder träumend aus dem Fenster schaut.
Das wäre ohnehin verboten bzw. mindestens Mitbestimmungspflichtig. Und der Mitarbeiter muss informiert werden.
Das ist ein heises Eisen.
Es ist ein Proband bei Testaufgaben.
VG Carl
Zitat von: Hondo am Januar 20, 2020, 19:43:51
Hallo,
ich würde das nur im Öffnen/schließen Ereignis des Formulars machen wo der Fragebogen sich befindet.
Hallo,
hier mal ein Versuch:
* Ich habe jetzt eine
tblTime angelegt, mit den Feldern [inmark] und [outmark]. Beim Öffnen des
frmHauptFormular soll darin ein DS erstellt werden, der jetzt() in [inmark] schreibt. Dabei soll der DS angehängt werden.
* dann möchte ich im
frmHauptformular einen timer, der nach 10 Minuten Inaktivität ein
frmpopup_unterbrechen lädt. Beim Laden soll ein jetzt() in die [outmark] geschrieben werden.
* wenn der Proband im
frmpopup_unterbrechen auf die Schaltfläche "OK" klickt, soll diese Schaltfläche einen neuen DS in
tblTime erstellen mit einem jetzt() in der [inmark].
* beim Schließen des
frmHauptformular soll wieder herum eine [outmark] gesetzt werden.
Später wird über eine Abfrage die Zeit zusammen gerechnet.
Ist das so sinnvoll? Mit welcher Funktionen lege ich einen neuen DS beim öffnen der HF mit jetzt() an? Er muss sich ja die ID merken und an das Popup übergeben, oder?
Carl
Hallo,
wenn du eine Version deiner DB hier hochlädst, könnten wir daran arbeiten und dir genau zeigen wie was geht.
Gruß Andreas
Ich habe hier mal eine ausgespeckte Datei angehängt. Die Abfragen sind noch drin und zeigen die 10 Aufgabenblöcke.
Ich versuche dann, Eure Vorschläge selbst einzubasteln.
Carl
Sorry, damit kann niemand was anfangen.
bitte testen und nochmal korrigiert hochladen.
Alles bleibt leer, da die Formulare fehlen.
Andreas
Kurze Anmerkung außerhalb des aktuellen Thread-Kontexts: Es gibt ein Beispiel von Microsoft, wie man Inaktivität des Users feststellen kann. - Detect user idle time or inactivity (https://docs.microsoft.com/en-us/office/vba/access/Concepts/Miscellaneous/detect-user-idle-time-or-inactivity)
Auch von mir nochmal die Anmerkung, dass die Überwachung von Mitarbeitern oder sonstigen Personen arbeitsrechtlich und datenschutzrechtlich problematisch ist und nicht ohne deren Wissen und Zustimmung erfolgen sollte.
Danke für den interessanten Link. Ich versuche es mal damit.
Zu Deinen Bedenken: Es geht nicht um Überwachung und die Patienten arbeiten auch nicht. Sie machen Aufgaben und man muss ermitteln, wie lange sie mit den Aufgaben beschäftigt waren. Jeder webbasierte IQ-Test stoppt die Zeit mit, um die Ergebnisse berechnen zu können. Das wissen die auch. Man könnte den Timer auch anzeigen, aber ich möchte sie nicht unter Zeitdruck setzten, denn jeder soll selbst seinen Rhythmus finden. Man muss halt nur schauen, wie lange sie insgesamt brauchen. Auch weil sie zwischendurch immer mal was anderes machen, aufs Klo gehen, zum Frühstück, aus dem Fenster schauen usw..
Carl
Zitat von: Hondo am Januar 21, 2020, 21:15:19
Sorry, damit kann niemand was anfangen.
bitte testen und nochmal korrigiert hochladen.
Alles bleibt leer, da die Formulare fehlen.
Andreas
Die Funktion soll doch an das Index-Formular und das vorhandene Popup gebunden werden. Die anderen Formulare möchte ich da garnicht mit einbinden, da kommen manchmal welche dazu.
Carl
ZitatAuch weil sie zwischendurch immer mal was anderes machen, aufs Klo gehen, zum Frühstück, aus dem Fenster schauen usw..
Mit dem nun vorhandenen Timer bei Inaktivität könnte man einen Bildschirmschoner aufblenden und dabei die Zeitnahme unterbrechen. Um zu arbeiten, muss man ja wenigstens die Oberfläche sehen können.
Mit Beenden des Bildschirmschoners dann folglich die Zeitaufnahme weiterführen.
Und falls die Frage kommt: Nein, so etwas habe ich noch nicht umgesetzt. Aber wenn man einen Plan hat und etwas Motivation dazu, kann man gezielt nach Lösungen suchen
Ich habe mir das mal angesehen, aber dieser Code detektiert die Zeit, die jemand idle ist. Damit kann man vielleicht ein Popup auslösen, das seinerseits eine Funktion erhält.
* Ich möchte primär, dass die Zeit des Programmstarts und des Schließen des Programms in eine Tabelle tblTime geschrieben wird. Weil es mehrere Öffnungen und Schließungen geben kann, soll pro Start ein DS mit einer [inmark] angelegt werden und beim Schließen eine [outmark] gesetzt werden.
* Und genau dieser Vorgang soll auch durch ein Popup ausgelöst werden können, wobei hier aber das Öffnen des Popups den DS mit der [outmark] schließt und das Schließen des Popups den neuen DS mit einer [inmark] anlegt.
Carl
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
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
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
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
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.
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
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?
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
Hallo,
Du brauchst doch nur die Anleitung im Link zu verfolgen....
Was genau verstehst Du daran nicht?
Also der obere Code kommt in ein leeres ungebundenes Formular, das DetectIdleTime heißt. Und der untere Code?
Carl
auch dorthin....
Warum soll das betreffende Formular nicht an eine Tabelle gebunden sein? Carl
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.
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
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
Hallo Andreas.
Weiß ich. Das war auch ein Grund, warum ich die Datenbank nicht schicken wollte, weil ich weiß, dass ich nicht besonders gut drin bin. Aber Programmieren mache ich auch nur nebenbei.
zuschwer ist doch an die Tabelle gebunden
Hast Du mal die Zeitfunktion angeschaut, frmTime3?
Carl
Hallo, ich habe diesen Code gebastelt. Er funktioniert schon ganz gut.
Was kann man hier eventuell verbessern bzw. sieht jemand Fehler oder Ineffizienzen?
Option Compare Database
Private Sub Form_Load()
On Error GoTo Err_cmdInmark
DoCmd.GoToRecord , , acNewRec
Forms!frmTime3!inmark = Now()
Exit_Form_Load:
DoCmd.Save acForm, "frmTime3"
Exit Sub
Err_cmdInmark:
MsgBox Err.Description
Resume Exit_Form_Load
End Sub
Private Sub Form_Timer()
' IDLEMINUTES determines how much idle time to wait for before
' running the IdleTimeDetected subroutine.
Const IDLEMINUTES = 1
Static PrevControlName As String
Static PrevFormName As String
Static ExpiredTime
Dim ActiveFormName As String
Dim ActiveControlName As String
Dim ExpiredMinutes
On Error Resume Next
' Get the active form and control name.
ActiveFormName = Screen.ActiveForm.Name
If Err Then
ActiveFormName = "No Active Form"
Err = 0
End If
ActiveControlName = Screen.ActiveControl.Name
If Err Then
ActiveControlName = "No Active Control"
Err = 0
End If
' Record the current active names and reset ExpiredTime if:
' 1. They have not been recorded yet (code is running
' for the first time).
' 2. The previous names are different than the current ones
' (the user has done something different during the timer
' interval).
If (PrevControlName = "") Or (PrevFormName = "") _
Or (ActiveFormName <> PrevFormName) _
Or (ActiveControlName <> PrevControlName) Then
PrevControlName = ActiveControlName
PrevFormName = ActiveFormName
ExpiredTime = 0
Else
' ...otherwise the user was idle during the time interval, so
' increment the total expired time.
ExpiredTime = ExpiredTime + Me.TimerInterval
End If
' Does the total expired time exceed the IDLEMINUTES?
ExpiredMinutes = (ExpiredTime / 1000) / 60
If ExpiredMinutes >= IDLEMINUTES Then
' ...if so, then reset the expired time to zero...
ExpiredTime = 0
' ...and call the IdleTimeDetected subroutine.
IdleTimeDetected ExpiredMinutes
End If
End Sub
Sub IdleTimeDetected(ExpiredMinutes)
On Error GoTo Err_handler
' Dim Msg As String
' Msg = "No user activity detected in the last "
' Msg = Msg & ExpiredMinutes & " minute(s)!"
' MsgBox Msg, 48
'hier wird die outmark gesetzt
DoCmd.GoToRecord , , acLast
Forms!frmTime3!outmark = Now()
DoCmd.Save acForm, "frmTime3"
'hier wird eine msgbox gezeigt
Msg = MsgBox("Möchten Sie weiter arbeiten?", vbYesNo)
If Msg = vbYes Then
DoCmd.GoToRecord , , acNewRec
Forms!frmTime3!inmark = Now()
DoCmd.Save acForm, "frmTime3"
ElseIf Msg = vbNo Then
DoCmd.Close acForm, "frmTime3", acSaveYes
DoCmd.Quit
End If
Exit_Form_Close:
Exit Sub
Err_handler:
MsgBox Err.Description
Resume Exit_Form_Close
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error GoTo Err_cmdOutmark
DoCmd.GoToRecord , , acLast
Forms!frmTime3!outmark = Now()
DoCmd.Save acForm, "frmTime3"
Exit_Form_Close:
Exit Sub
Err_cmdOutmark:
MsgBox Err.Description
Resume Exit_Form_Close
End Sub
Private Sub zurueck_Click()
'DoCmd.Close acForm, "frmTime", acSaveYes
DoCmd.Save acForm, "frmTime3"
Forms!frmTime3!zurKontrolle.Requery
End Sub
Carl