2017-03-07 2 views
1

私はバックエンドが暗号化されていて、ペシミスティックなロックを許さないスプリットマルチユーザDbを持っています。バックエンドのテーブル内のタスクは、割り当てられたフィールドが未割り当てとして自動入力されて毎日事前にロードされます。従業員が開始タスクをクリックするか、次のタスクにジャンプするために提出すると、dlookupはdlookupを使用して次の未割り当てタスクを識別し、フィールドをその名前に更新します。スプリットマルチユーザMSアクセスDb。テーブルを上書きする問題

テーブルが十分に速く更新されていないように見えるため、テーブルが更新されて同じレコードを上書きすることを認識せずに複数の人のフロントエンド(accdeを使用)に遭遇しています。 60から2秒に自動リフレッシュを更新しましたが、希望の結果が得られません。

私は各コマンドボタンでクリックして実際のリンクテーブルをリフレッシュする方法はありますか?

以下は、「開始」ボタンのコードです。 [Submit/Next Task]ボタンは、同じ種類のコーディングを使用して次のタスクを探します。

Private Sub butagingicoms202_begin_Click() 
Dim strsql As String 
Dim AuditCheck As String 
Dim NYPhone As String 
Dim CAPhone As String 
Dim LastTask As String 
DoCmd.SetWarnings False 
    If IsNull(DLookup("[Sys]", "Aging_ICOMSWorkable", "assigned = 'unassigned'")) Then 
LastTask = True 
Else 
LastTask = False 
End If 
If LastTask = True Then 
MsgBox "All tasks have been assigned. Please move on to your next assigned project" 
DoCmd.SetWarnings True 
DoCmd.Close acForm, "Aging_ICOMS202DailyWorkable_frm" 
Else 
Call RandomTime 
butagingicoms202_submit.Visible = True 
Me.butagingicoms202_submit.SetFocus 
butagingicoms202_queue.Visible = True 
butagingicoms202_begin.Visible = False 
txtagingicoms202_sysacct = DLookup("[sysacct]", "Aging_ICOMSWorkable", "[SYS]=202 AND [Assigned] = 'unassigned' AND [SecondaryTask]<>'50 Day' AND [SecondaryTask]<>'Spec Review' AND [SecondaryTask]<>'Low Bal Rpt'") 
DoCmd.RunSQL "UPDATE Aging_ICOMSWorkable SET assigned = '" & Me.txtagingicoms202_assigned & "' WHERE sysacct = [txtagingicoms202_sysacct]" 
txtagingicoms202_acct = DLookup("[AccountNumber]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
txtagingicoms202_sys = DLookup("[Sys]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
txtagingicoms202_name = DLookup("[Name]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
'txtagingicoms202_fn = DLookup("[FirstName]", "Aging_ICOMSWorkable", "[Assigned] = 'unassigned'") 
'txtagingicoms202_ln = DLookup("[LastName]", "Aging_ICOMSWorkable", "[Assigned] = 'unassigned'") 
txtagingicoms202_task = DLookup("[Task]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
txtagingicoms202_tt = DLookup("[Task]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
txtagingicoms202_assignment = DLookup("[SecondaryTask]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
'NYPhone = DLookup("[NYSTATE]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & me.txtagingicoms202_assigned &"'") 
'CAPhone = DLookup("[PW CAL PHONE?]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & me.txtagingicoms202_assigned &"'") 
txtagingicoms202_TotalAR = "$" & Format(DLookup("[Total A/R Balance]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'"), "0.00") 
txtagingicoms202_PDbal = "$" & Format(DLookup("[Delinquent Balance]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'"), "0.00") 

'txtagingicoms202_secassign = DLookup("[Secondary Task]", "Aging_ICOMSWorkable", "[Assigned] = 'unassigned'") 
txtagingicoms202_starttime = Now() 
strsql = "UPDATE Aging_ICOMSWorkable SET Start_Time = '" & Me.txtagingicoms202_starttime & "' WHERE sysacct = [txtagingicoms202_sysacct]" 
DoCmd.RunSQL strsql 
Me.comagingicoms202_res.RowSource = "SELECT [ResolutionCodes] FROM [Resolutions]" & "WHERE [tasktype] = '" & Me.txtagingicoms202_tt & "'" 
Me.comagingicoms202_res.Requery 
DoCmd.SetWarnings True 
End If 
End Sub 

答えて

0

これはテストされていないコードですが、そのトリックを行う必要があります。

  • 私はあなたがコメントした行を削除します。
    Private Sub butagingicoms202_begin_Click() 
        Dim strsql As String 
        Dim AuditCheck As String 
        Dim NYPhone As String 
        Dim CAPhone As String 
        doCmd.SetWarnings False 
        If IsNull(DLookup("[Sys]", "Aging_ICOMSWorkable", "assigned = 'unassigned'")) Then 
        MsgBox "All tasks have been assigned. Please move on to your next assigned project" 
        doCmd.SetWarnings True 
        doCmd.Close acForm, "Aging_ICOMS202DailyWorkable_frm" 
        Else 
        Call RandomTime 
        butagingicoms202_submit.Visible = True 
        Me.butagingicoms202_submit.SetFocus 
        butagingicoms202_queue.Visible = True 
        butagingicoms202_begin.Visible = False 
    ' txtagingicoms202_sysacct = DLookup("[sysacct]", "Aging_ICOMSWorkable", "[SYS]=202 AND [Assigned] = 'unassigned' AND [SecondaryTask]<>'50 Day' AND [SecondaryTask]<>'Spec Review' AND [SecondaryTask]<>'Low Bal Rpt'") 
    ' doCmd.RunSQL "UPDATE Aging_ICOMSWorkable SET assigned = '" & Me.txtagingicoms202_assigned & "' WHERE sysacct = [txtagingicoms202_sysacct]" 
        doCmd.RunSQL "UPDATE Aging_ICOMSWorkable SET assigned = '" & Me.txtagingicoms202_assigned & "' WHERE sysacct = " & _ 
           DLookup("[sysacct]", "Aging_ICOMSWorkable", "[SYS]=202 AND [Assigned] = 'unassigned' AND [SecondaryTask]<>'50 Day' " & _ 
                 "AND [SecondaryTask]<>'Spec Review' AND [SecondaryTask]<>'Low Bal Rpt'") 
        txtagingicoms202_acct = DLookup("[AccountNumber]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
        txtagingicoms202_sys = DLookup("[Sys]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
        txtagingicoms202_name = DLookup("[Name]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
        txtagingicoms202_task = DLookup("[Task]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
        txtagingicoms202_tt = DLookup("[Task]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
        txtagingicoms202_assignment = DLookup("[SecondaryTask]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'") 
        txtagingicoms202_TotalAR = "$" & Format(DLookup("[Total A/R Balance]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'"), "0.00") 
        txtagingicoms202_PDbal = "$" & Format(DLookup("[Delinquent Balance]", "Aging_ICOMSWorkable", "sysacct = '" & Me.txtagingicoms202_sysacct & "' AND assigned = '" & Me.txtagingicoms202_assigned & "'"), "0.00") 
    
        txtagingicoms202_starttime = Now() 
        strsql = "UPDATE Aging_ICOMSWorkable SET Start_Time = '" & Me.txtagingicoms202_starttime & "' WHERE sysacct = [txtagingicoms202_sysacct]" 
        doCmd.RunSQL strsql 
        Me.comagingicoms202_res.RowSource = "SELECT [ResolutionCodes] FROM [Resolutions]" & "WHERE [tasktype] = '" & Me.txtagingicoms202_tt & "'" 
        Me.comagingicoms202_res.Requery 
        doCmd.SetWarnings True 
        End If 
    End Sub 
    

    は私が3つの変更を行いました。本当に必要な場合は、
  • LastTask変数とそれを設定したIfステートメントを削除しました。私はあなたのIsNullの状態をチェックする文を1つのIfの文に組み込み、作業キューの最後にいるか、そうでなければ割り当てロジックに入った場合に警告メッセージを表示します。これは2人が最後の仕事をつかむことを試みるとき競争状態を誘発するかもしれない遅れのいくつかを減らすでしょう。
  • A)次の使用可能なタスクを識別し、B)それを現在のユーザーに割り当てます。私はこれらを1つのステートメントにまとめて、UPDATEステートメントを識別して割り当てます。誰かがそうしないように更新している瞬間に、更新しようとしているレコードをロックすると思います。
    • これはテストされていない部分です。コードをデバッグし、有効なコードであることを確認するために何が何に渡されているのかを正確に確認する必要があるかもしれません。そうでない場合は、Accessが解析できるものが得られるまで少し微調整してください。
    • あなたはこのレコードのレースに終わり、私たちのうちの一人しか勝てない場合に備えて、いくつかのエラー処理をラップしたいと思うでしょう。緩やかに - 次のタスクを手に入れるために、もう一度実行することができます。
    • 私はこれについて考えるので、処理するタスクがなくても誰かを無限ループに入れないように、エラー処理にLastTaskコードを入れたいと思うかもしれません。 DLookup()の代わりにIf SELECT COUNT(*)... > 0をテストすると、LastTaskがより迅速に実行される可能性があります。私は手元に書類がありませんが、DLookup()の機能はかなり遅いことが知られています。

追加コードのカップルの提案をクリーンアップ:

  • Callは廃止用語であり、下位互換性のためにのみ含まれています。あなたがRandomTimeに変更した場合、Call RandomTimeはうまく動作します。
  • フォームコントロールにわかりやすい名前がありますが、これは優れていますが、「句読点」や大文字小文字がないため、読みにくくなります。たとえば、butagingicoms202butAgingIcoms202(私の推奨)に変更するか、but_aging_icoms_202に変更することが考えられます。これは、人が解析しやすいためです。
+0

ありがとうFreeMan - 私はこれらのアップデートに取り組み、結果に戻ってきます。私はここで細部を本当に感謝します。 – Matt

+0

お手伝いします!これが役に立つと分かった場合は、上矢印をクリックすることを忘れないでください。これがあなたの答えを提供していると思われる場合は、準備ができたらチェックマークをクリックしてください。 – FreeMan

+0

私はこれに取り組んでいるうちに、別の考えが私の心に浮かんだ。私はaccに変換する前にFEを介してレコードロックを設定することができます。最初の更新後にレコードを「ロック」し、タスクを提出してから「リリース」する方法もありますか?私は修正されたコードを考えてエラー処理を追加しましたが、これは上書きの問題を解決するための最終ステップかもしれません。 – Matt

関連する問題