抑制Access VBA中的写冲突消息

时间:2009-02-23 17:09:12

标签: ms-access

我的问题。

我编写了一个存储过程来计算通过Ms Access前端(到MSSQL2000数据库)的表单呈现的字段数。

一旦我调用 Me.Form.Requery 来获取更改的值。我可以发出令人恼火的消息,即我造成了写冲突。

  

自您开始编辑以来,其他用户已更改此记录。如果保存记录,则将覆盖其他用户所做的更改。   将更改复制到剪贴板将允许您查看其他用户输入的值,   然后,如果您决定进行更改,请将更改粘贴回来。

我知道我改变了数据,因此我希望抑制消息或阻止消息发生。

9 个答案:

答案 0 :(得分:12)

(我想我应该在一篇文章中发表评论,因为我实际上是回答了这个问题)

您收到写入冲突消息的原因是您通过表单和存储过程编辑记录来创建写入冲突。要避免该错误,只需在执行存储过程之前将记录保存在表单中。从上面发布的代码段中,它应该是:

Me.Dirty = False
cmd.Execute , , adCmdStoredProc

这是一个常见的Access错误,它是由尝试通过绑定表单和直接SQL更新编辑数据引起的。在通过SQL更新相同记录之前,需要保存表单的编辑缓冲区。

换句话说,您应该感谢错误信息的发生,否则,您将失去其中一个或另一个更改。

我对设计提出质疑。如果您以绑定的形式打开记录,则对表单中加载的数据进行编辑,而不是运行SQL来更新它。我不确定为什么你需要一个存储过程来更改你已经在表单中编辑过的记录 - 这听起来像是一个设计错误(即使解决方案非常简单)。

答案 1 :(得分:2)

我遇到了类似的问题。

示例:

假设记录中有一个字段aForm!text = "Hello"

如果用户单击按钮,则执行VBA代码

aForm!text = "Hello World!"

当我关闭记录时,收到错误消息“此记录已更改...”

解决方案:

如果您按aForm.RefreshaForm.Requery刷新表单,则可以避免写入冲突。

答案 2 :(得分:2)

我有一个链接到后端SQL数据库的访问表单。链接到子表单的表上的触发器更新表单中的字段。如果我在更改子窗体中的值后在表单中编辑相同的记录,则会收到错误消息“写入冲突此记录已更改....”。

触发器更新的字段无法直接在表单上更改,因此可以选择“保存记录”,但我无法弄清楚如何自动选择“保存记录”。

正如其他人所说,避免错误的方法是在编辑记录之前重新查询表单,但这会使用户体验不太顺畅。

我终于找到了解决方法:

在表单的类模块中输入:

Private Sub Form_Error(DataErr As Integer,Response As Integer)

If DataErr = 7787 Then
Response = acDataErrContinue
Me.Recordset.MovePrevious
Me.Recordset.MoveNext
End If

End Sub

我花了很长时间寻找解决方案 - 我希望它可以帮助其他人

答案 3 :(得分:1)

我遇到了同样的问题,两个控件以两种不同的形式链接到后端链接表中的同一字段。我通过仅将一个控件字段链接到表来解决此问题,并且当其中一个更新时,另一个控件将信息写入了另一个控件中。

有效。您可能会问为什么我需要两种形式的两个控制字段?输入所有数据后,一个记录数据,其他人使用它进行计算。这样一来,用户将无法访问进行计算的表单。当然,我可以从将数据注册到VBA代码行的表单中访问要进行计算的数据,以供在计算表单中参考。希望对您有所帮助。对我有用。

答案 4 :(得分:0)

我找到解决此问题的方法是重置记录源

Me.RecordSource = ""
cmd.Execute , , adCmdStoredProc
Me.RecordSource = "SELECT SourceFields FROM SomeTable "

但这看起来很糟糕。

答案 5 :(得分:0)

执行类似这样的存储过程时会发生什么:

db.Execute "<SP_NAME>", dbSeeChanges

答案 6 :(得分:0)

检查您尝试更新的表格上是否有触发器。如果是这样,请确保在执行时它不会在文本窗口中返回任何内容。

我遇到了同样的问题而无法解决它直到触发开始时我添加了“SET NOCOUNT ON”。

触发器没有外部更新,因为它是“AFTER INSERT,DELETE”触发器,但我的问题已经解决了。

答案 7 :(得分:0)

如果这些答案都不起作用,那就试试吧。在您遇到错误的表单中,插入此代码。

Private Sub Form_Deactivate()
     DoCmd.RunCommand acCmdSaveRecord
End Sub

基本上,错误是编辑相同信息的两种形式。所以你必须在离开任何一个表格后告诉Access保存。

来源:https://support.microsoft.com/en-ca/kb/304181

答案 8 :(得分:0)

我有同样的问题。我通过从主表单(主表)中的从表单(从表)中的代码更改了字段,并且在关闭表单之前总是收到警告:“记录已被另一个用户更改...”
状态错误
从属形式的错误语法(字段更新后的操作)为:

Private Sub Value1_AfterUpdate()
    Me.Parent.Controls("Result").Value = 123.52 
End Sub


然后在检测到父表单后,另一个“用户”更改了其字段。

解决方案:
强制主表单更改其自身的值。 将主表单用作类:
1)为值定义私有变量,这些变量应从从属形式更改
2)以主表格的形式定义Public let和get属性-即“ Public Property Let letResult(ByVal myVal为double)...”
3)在主表单中定义公共过程Write_Values,该过程从私有值(从Public属性let ...获取的值)设置主表单中字段的值

4)以从属形式定义语法,该语法将值发送给主形式的let属性。
5)最后,从属形式调用主形式的公共过程Write_Values

示例代码主表单:

Private myResult As Double
Public Property Let letResult(ByVal myval As Double)
    myResult = myval
End Property
Public Sub Write_Values()
    Me.Result.Value = myResult
    DoCmd.RunCommand acCmdSaveRecord
    Me.Dirty = False
End Sub

示例代码从属形式:

Private Sub Value1_AfterUpdate()
    Me.Parent.letResult = 123.52
    Me.Parent.Write_Values
End Sub