0

SQL Server 2008R2 バックエンドに対して Citrix の下で MS Access 2010 フロント エンドを実行しています。

かなり長い間機能しているフォームがあります。1 つのボタンの背後にあるコードが、突然「書き込み競合」エラーを生成し始めました。それは数日前の出来事で、変更されていないコード (オンラインのテキスト比較ツールで確認済み) を数時間かけて調べ、ここにいる別のプログラマーに調べてもらった後、私の唯一の解決策は、フロント エンドの製品版を入手して開始することでした。変更を再適用します。

2日間問題なく動作していましたが、エラーが再び発生しました。コードを変更していましたが、別の形式でした。他のフォームをテストするには、このフォームのプロセスを実行する必要があります。

書き込み競合を生成しているコードは次のとおりです。

Private Sub btnStart_Click()

Dim AuditID As String
Dim UserStatus As String
Dim SubmitPeerRev As Boolean
Dim PRPercent As Single
Dim ExaminerAudits As Integer
Dim ReviewAudits As Integer
Dim rs As DAO.Recordset
Dim UserName As String
Dim SQLString As String

    On Error GoTo Error_Handler

    UserStatus = funUserLookup("Status", Raw:=True)
    'get the percentage/whole number
    'this is the percentage that should be submitted for review
    If IsNull(DLookup("ItemValue", "tblConfig", "Item = '" & UserStatus & "'")) Then
        Form_frmMenu.MsgBoxTimed ("Your user ID is not configured correctly within the     AP_Audit DB." & vbCrLf & _
            "You cannot start an audit." & vbCrLf & _
            "Please contact your manager to get it set correctly.")
        Exit Sub
    Else
        PRPercent = CSng(DLookup("ItemValue", "tblConfig", "Item = '" & UserStatus & "'"))
    End If
    UserName = funUserLookup("Examiner")

    'get total audits done
    SQLString = "SELECT count(*) as A " & _
                "  FROM tblAuditAtt " & _
                " WHERE Examiner = '" & UserName & "'" & _
                "   AND month(aMonth) = " & Month(Now()) & _
                "   AND year(aMonth) = " & Year(Now())
    Set rs = CurrentDb.OpenRecordset(SQLString, dbOpenDynaset)
    ExaminerAudits = rs.Fields("[A]")

    'get peer-reviewed audits done
    SQLString = "SELECT count(*) as A " & _
                    "  FROM tblAuditAtt " & _
                    " WHERE TraineeExaminer = '" & UserName & "'" & _
                    "   AND Month(aMonth) = " & Month(Now()) & _
                    "   AND Year(aMonth) = " & Year(Now())
    Set rs = CurrentDb.OpenRecordset(SQLString, dbOpenDynaset)
    ReviewAudits = rs.Fields("[A]")
    Set rs = Nothing

    If DLookup("Started", "tblAuditAtt", "AttAudit_ID = " & Me.AttAudit_ID) Then
        Form_frmMenu.MsgBoxTimed "This audit was already started by someone else. Select a new one."
        Me.Requery
        Exit Sub
    End If
        'UserName = funUserLookup("Examiner")
        If ReviewAudits = 0 Then            'ensure 1 review - prevents divide by 0
            Me.TraineeExaminer = UserName
            Me.TraineeExaminer.Visible = True
            Me.TraineeExaminer.Top = 2280
            Me.Examiner.Visible = False
        ElseIf ExaminerAudits = 0 And PRPercent < 1 Then      'ensure 1 non-review if < 100% peer-review
            Me.Examiner = UserName
            Me.TraineeExaminer.Visible = False
            Me.Examiner.Visible = True
        ElseIf ExaminerAudits / (ExaminerAudits + ReviewAudits) > 0.99999999 - PRPercent Then
            'the tiny fraction is needed because 0 > 0 = false & 100% trainees would get a straight submit
            Me.TraineeExaminer = UserName
            Me.TraineeExaminer.Visible = True
            Me.TraineeExaminer.Top = 2280
            Me.Examiner.Visible = False
        Else
            Me.Examiner = UserName
            Me.TraineeExaminer.Visible = False
            Me.Examiner.Visible = True
        End If

    Me.StartDate = Format(Form_frmMenu.GetSQLTime, "mm/dd/yyyy")
    Me.Started = True
    Me.Dirty = False
    Form_frmMenu.ExecSP "AUDIT_AttAuditStart", 120, False, "@AuditID", adInteger, Me.AttAudit_ID
    'this is failing, for reasons yet unknown, so only continue if it hasn't
    If Nz(DLookup("AttAudit_A", "tblAuditAtt_A", "AttAudit_ID = " & Me.AttAudit_ID), 0) > 0 Then
        Me.btnStartEnd.Enabled = True
        Me.btnStartEnd.SetFocus
        Me.btnStart.Enabled = False
        Me.frmAttAudit_A_Sub.Requery
        SetSubFormView  'now that we know what type of audit & have questions, set up the proper view
    Else
        Me.TraineeExaminer = ""
        Me.Examiner = ""
        Me.StartDate = ""
        Me.Started = False
        Me.Dirty = False
        SQLString = Form_frmMenu.LogError(0, "Audit did not start properly", "User Defined", "frmAttAudit_A.btnStart_Click", "Stored procedure failed to insert records")
    End If

    Exit Sub

Error_Handler:
    If Form_frmMenu.LogError(err.Number, err.Description, err.Source, "frmAttAudit_A.btnStart_Click", SQLString) = "Next" Then
        Resume Next
    Else
            Resume
        End If

    End Sub

ノート:

  • 私は開発サーバーでこれを実行していますが、これらのテーブルを使用しているのは私だけです
  • タイムスタンプ列を追加しましたが、違いはないようです
  • バインドされたフォームフィールドが変更されるたびにコードを移動しましたがme.dirty = false、それは役に立ちません
  • これまでの唯一の解決策は、製品コードを取得し、手動ですべての変更を再適用することでした。
  • 挿入クエリが失敗する原因となっている別の奇妙な点があることがわかります。ストアドプロシージャを呼び出すように変更してから発生したかどうかはわかりませんが、docmd.runsqlステートメントがあったときに失敗していました
  • 別の投稿で、Citrix 環境でのフックを無効にするよう提案を受けました。

これを解決する方法に関する他の考えや提案はありますか? Access が吐き出すと決めたときに、数日ごとに作業をやり直す時間は本当にありません。

4

1 に答える 1