0

SQLServerのフロントエンドとしてAccessを使用しています。ユーザーがレコードを選択し、フォームに新しい情報を挿入してから、次のレコードに進む分割フォームがあります。私のマネージャーは、ユーザーがレコードを変更するのにかかる時間を確認したいと思っています。ですから、誰かがレコードをクリックしたときにタイマーを開始し、次のレコードをクリックしたとき、またはフォームで[完了]を選択したときにタイマーを停止したいと思います。この情報をExcelシートにエクスポートしてほしい。ほとんどのユーザーは1日あたり100を超えるレコードを変更しているため、各ユーザーの平均時間を取得する方が簡単な場合があります。とにかくこれは可能ですか?

4

2 に答える 2

1

簡単な解決策:フォームのOn Dirtyイベントに関数を記述し、現在のレコードのID、ユーザー名、および現在の時刻(開始時刻)を使用してテーブルにレコードを追加できます。フォームのOnAfterUpdateで、関数を使用して同じレコードを更新し、現在の時刻を(終了時刻)として追加します。ユーザーがレコードの編集または追加を開始すると、時刻がこのテーブルに登録されます。レコードを更新すると、終了時刻として時刻が加算されます。

これで、ID、ユーザー名、startTime、endingTimeを含むテーブルができました。クエリを使用すると、編集から更新まで、各レコードに費やされる時間を計算できます。このテーブルは、必要なときにいつでもExcelシートにエクスポートできます。

複雑な方法:

私も同じような状況でした。ユーザーが指定された時間アイドル状態になっている場合(ネットワークトラフィックの問題のため)、データベースを閉じるように求められました

フォームのタイマーイベントで以下の機能を使用しました。5秒ごとにアクティブなフォームの名前を読み取り、静的変数に保存します。この関数は、Screen.activeform.nameをこの静的変数と5秒ごとに比較します。アクティブなフォームの名前がこの静的変数と異なる場合は、ユーザーがアクティブである(何かをしている)ことを示しているため、タイマーの静的変数をリセットします。それ以外の場合は、ユーザーがアイドル状態でタイマーを追加することを意味します。

タイマーがアプリケーションのオプションで設定された指定量(たとえば5分)に達すると、ユーザーが5分間アイドル状態になり、Application.Quitを実行してデータベースを閉じることを意味します。

私は現在忙しくて、それに取り組む時間がありません。この関数を変更して、現在のレコードまたは現在のコントロール(現在の形式ではなく)をチェックし、静的タイマー変数をリセットする前に、タイマー変数、ユーザー名、およびレコードのIDをテーブルにエクスポートし、クエリで費やした時間を計算できます。エクセルにエクスポートします。

それが役に立てば幸い。

今週末に暇があれば、簡単なデータベースを作成して、実際にどのように機能するかを示します。

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    
于 2013-03-19T01:05:17.103 に答える
0

これがあなたを助けるための簡単なサンプルデータベースです。

サンプルデータベース

このデータベースはOffice2013で作成されています。開いていただければ幸いです。frmフォームを開き、レコードの編集を開始するか、新しいレコードの挿入を開始します。レコードの編集/挿入の開始と終了が結果テーブルに登録されます。1日の終わりに、このテーブルをExcelファイルにエクスポートできます。

このデータベースにはいくつかの変更が必要であることに注意してください。たとえば、現在のユーザー名を認識するためにいくつかのコードを追加する必要がありますこのセクションを管理できると思います

于 2013-03-21T00:29:12.710 に答える