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 が吐き出すと決めたときに、数日ごとに作業をやり直す時間は本当にありません。