我的问题.
我编写了一个存储过程来计算通过Ms Access前端(到MSSQL2000数据库)的表单呈现的多个字段.
一旦我调用Me.Form.Requery来获取更改的值.我可以发出令人恼火的消息,即我造成了写冲突.
自您开始编辑以来,其他用户已更改此记录.如果保存记录,则将覆盖其他用户所做的更改.将更改复制到剪贴板将允许您查看其他用户输入的值,然后在您决定进行更改时将更改粘贴回来.
我知道我改变了数据,因此我希望抑制消息或阻止消息发生.
Dav*_*ton 14
(我想我应该在一篇文章中发表评论,因为我实际上是在回答这个问题)
您收到写冲突消息的原因是您通过表单和存储过程编辑记录来创建写冲突.要避免该错误,只需在执行存储过程之前将记录保存在表单中.从上面发布的代码段中,它应该是:
Me.Dirty = False
cmd.Execute , , adCmdStoredProc
Run Code Online (Sandbox Code Playgroud)
这是一个常见的Access错误,它是由尝试通过绑定表单和直接SQL更新编辑数据引起的.在通过SQL更新相同记录之前,需要保存表单的编辑缓冲区.
换句话说,您应该感谢错误消息正在发生,否则,您将丢失其中一个或另一个更改.
不过我对设计提出质疑.如果您以绑定的形式打开记录,则对表单中加载的数据进行编辑,而不是运行SQL来更新它.我不确定为什么你需要一个存储过程来更改你已经在表单中编辑过的记录 - 这听起来像是一个设计错误(即使解决方案非常简单).
我有一个链接到后端 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
Run Code Online (Sandbox Code Playgroud)
结束子
我花了很长时间寻找解决方案 - 我希望它对其他人有帮助