已经搜索过,还没有找到一个似乎合适的解决方案。也许这里有人可以提供一些想法。
背景
在MS Access 2010中构建的应用程序,其表格链接到Access 2010数据库,最终可能会链接。
表单包含“编辑”部分(未绑定)和“列表”部分(绑定子表单)。
在整个应用程序中使用了这种类型的许多形式。
所有表单都使用通用UpsertRecord()
方法根据各自的字段插入/更新记录。
问题
单击“保存”按钮时,将显示“写入冲突”错误。
写冲突
自您开始编辑以来,其他用户已更改此记录。如果保存记录,则将覆盖其他用户所做的更改。 将更改复制到剪贴板将允许您查看其他用户输入的值,然后在您决定进行更改时将更改粘贴回来。
触发错误的行是表单recordsource设置为SQL字符串的地方。
.RecordSource = strSQL
我的解释
虽然表单可以直接更新底部子表单而不点击“保存”,但这不足以避免用户无意中更改数据。
所以,我试图通过点击事件强制“保存”,而点击事件又调用公共公共UpsertRecord()
方法来保存数据。该方法工作正常,但是会触发Write Conflict,因为表单认为它也在单独更改数据(没有'保存'点击)。
尝试的解决方案
我尝试设置一个私有变量m_SaveOK
,以防止使用带有下面代码的Form_BeforeUpdate()
事件而无需单击按钮事件,但这也会触发写冲突。
If Not m_SaveOK Then
Cancel = True
End If
还尝试在执行qry.SQL直接保存之前保存表单数据,但是这也失败了。该代码基本上是在直接保存之前检查脏并使用frm.Dirty = False
强制保存表单。
If frm.Dirty Then
frm.Dirty = False
End If
表单图片
这就是表格的样子。单击子窗体中记录的铅笔(编辑)按钮将填充顶部控件。
单击“保存”按钮时,记录将保存到数据库中,并重新获取表单以刷新子表单列表。
无论如何,我很欣赏有关如何防止表单尝试保存记录与Save
按钮点击事件的一些想法。
提前感谢您的帮助!
更新
子窗体属性设置为不允许添加和编辑(删除是可以的,因为这是列表中'X'按钮的用途),并且没有设置锁定。
在添加一些评估debug.print
和frm.Dirty
的{{1}}语句之后,我将其缩小为主要形式,而子格式为frm.subform.Form.Dirty
并导致冲突。
使用“保存”按钮正确更新底层表,但表单仍为Dirty
。因此,虽然我目前没有触发Dirty
错误,但Write Conflict
状态会导致其他错误&在按钮触发保存后添加Dirty
时,表单退出时出现不良行为 - You can't save this record at this time...
和2101 The setting you entered isn't valid for this property.
。
所以我仍然在解决这个问题,并希望得到任何其他想法。
答案 0 :(得分:1)
对于子表单,属性Allow Additions, Allow Deletions, Allow Edits
应该设置为No,Record Locks
设置为No Locks。这样子表单就不应该再干扰了。