我正在使用Access作为SQL Server的前端。我们有一个拆分表单,用户选择一个记录,在表单中插入一些新信息,然后继续下一个记录。我的经理希望看到用户修改记录需要多长时间。所以我希望有人在点击某条记录时启动计时器,然后在点击下一条记录时或在表单中选择完成时停止计时器。我希望这个信息导出到excel表。由于大多数用户每天修改超过100条记录,因此可能更容易获得每个用户的平均时间。无论如何这有可能吗?
答案 0 :(得分:1)
简单的解决方案:您可以在表单的 On Dirty 事件中编写函数,并将记录添加到具有当前记录的ID,用户名和当前时间(开始时间)的表中。 在表单的 On AfterUpdate 中,使用函数更新同一记录并将当前时间添加为(结束时间)。 当用户开始编辑或添加记录时,时间将在此表中注册。当他/她更新记录时,时间会被添加为结束时间。
现在你有一个包含ID,username,startTime,endingTime的表。通过查询,您可以计算每条记录花费的时间,从编辑,结束到更新。您可以随时将此表导出到Excel工作表。
复杂的方法:
我有类似的情况。如果用户在指定时间内闲置(对于网络流量问题),我被要求关闭数据库
我在表格的计时器事件中使用了波纹管功能。它每5秒读取一次活动表格的名称,并将其保存在静态变量中。此函数每隔5秒将Screen.activeform.name与此静态变量进行比较。 如果活动表单的名称与此静态变量不同,则表明用户处于活动状态(执行某些操作),因此它会重置计时器静态变量。否则意味着用户空闲并添加计时器。
当计时器达到应用程序选项中设置的指定数量时(比如5分钟),表示用户已空闲5分钟,我只需运行Application.Quit并关闭数据库。
我现在很忙,没有时间去做。您可以修改此函数以检查当前记录甚至是当前控件(而不是当前形式),并在重置静态计时器变量之前,将记录的计时器变量,用户名和ID导出到表中,并使用查询计算花费的时间并将其导出为excel。
希望它有所帮助。
如果我在本周末找到一个空闲时间,我会尝试建立一个简单的数据库,以显示其实际运作情况
MyTimer:
' IDLEMINUTES determines how much idle time to wait for before
' running the IdleTimeDetected subroutine.
IdleMinutes = fGetOption("Machine", "AutoLogOff", False)
If IdleMinutes = 0 Then Exit Sub
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
'Debug.Print ExpiredMinutes
If ExpiredMinutes >= IdleMinutes Then
' ...if so, then reset the expired time to zero...
ExpiredTime = 0
' ...and call the IdleTimeDetected subroutine.
IdleTimeDetected ActiveFormName
End If
Sub IdleTimeDetected(ActiveFormName As String)
DoCmd.Close acForm, ActiveFormName
CloseAllForms
Application.Echo True
Application.Quit
End Sub
答案 1 :(得分:0)
这是一个简单的示例数据库,可以帮助您。
此数据库是在Office 2013中编写的。我希望您可以打开它。 打开frm表单并开始编辑记录或开始插入新记录。 编辑/插入记录的开始和结束将在结果表中注册。您可以在一天结束时将此表导出到excel文件。
请注意,此数据库需要进行一些修改。 例如,您必须添加一些代码才能识别当前用户名 我想你可以管理这一部分