记录用户在Microsoft Access中修改表单的时间

时间:2013-03-18 18:18:59

标签: ms-access ms-access-2007

我正在使用Access作为SQL Server的前端。我们有一个拆分表单,用户选择一个记录,在表单中插入一些新信息,然后继续下一个记录。我的经理希望看到用户修改记录需要多长时间。所以我希望有人在点击某条记录时启动计时器,然后在点击下一条记录时或在表单中选择完成时停止计时器。我希望这个信息导出到excel表。由于大多数用户每天修改超过100条记录,因此可能更容易获得每个用户的平均时间。无论如何这有可能吗?

2 个答案:

答案 0 :(得分:1)

简单的解决方案:您可以在表单的 On Dirty 事件中编写函数,并将记录添加到具有当前记录的ID,用户名和当前时间(开始时间)的表中。 在表单的 On AfterUpdate 中,使用函数更新同一记录并将当前时间添加为(结束时间)。 当用户开始编辑或添加记录时,时间将在此表中注册。当他/她更新记录时,时间会被添加为结束时间。

现在你有一个包含ID,username,startTime,endingTime的表。通过查询,您可以计算每条记录花费的时间,从编辑,结束到更新。您可以随时将此表导出到Excel工作表。

复杂的方法:

我有类似的情况。如果用户在指定时间内闲置(对于网络流量问题),我被要求关闭数据库

我在表格的计时器事件中使用了波纹管功能。它每5秒读取一次活动表格的名称,并将其保存在静态变量中。此函数每隔5秒将Screen.activeform.name与此静态变量进行比较。 如果活动表单的名称与此静态变量不同,则表明用户处于活动状态(执行某些操作),因此它会重置计时器静态变量。否则意味着用户空闲并添加计时器。

当计时器达到应用程序选项中设置的指定数量时(比如5分钟),表示用户已空闲5分钟,我只需运行Application.Quit并关闭数据库。

我现在很忙,没有时间去做。您可以修改此函数以检查当前记录甚至是当前控件(而不是当前形式),并在重置静态计时器变量之前,将记录的计时器变量,用户名和ID导出到表中,并使用查询计算花费的时间并将其导出为ex​​cel。

希望它有所帮助。

如果我在本周末找到一个空闲时间,我会尝试建立一个简单的数据库,以显示其实际运作情况

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)

这是一个简单的示例数据库,可以帮助您。

Sample Database

此数据库是在Office 2013中编写的。我希望您可以打开它。 打开frm表单并开始编辑记录或开始插入新记录。 编辑/插入记录的开始和结束将在结果表中注册。您可以在一天结束时将此表导出到excel文件。

请注意,此数据库需要进行一些修改。 例如,您必须添加一些代码才能识别当前用户名 我想你可以管理这一部分