如何使用未绑定访问表单解决写入冲突

Posted

技术标签:

【中文标题】如何使用未绑定访问表单解决写入冲突【英文标题】:How to Resolve Write Conflict w/ Unbound Access Form 【发布时间】:2016-08-24 18:36:30 【问题描述】:

已经四处搜索,但尚未找到似乎适合的解决方案。也许这里有人可以提供一些想法。

背景

在 MS Access 2010 中构建的应用程序具有链接到 Access 2010 数据库的表,最终可能会链接。

表单包含一个“编辑”部分(未绑定)和一个“列表”部分(绑定子表单)。

这种类型的许多形式在整个应用程序中使用。

所有表单都使用通用的UpsertRecord() 方法根据各自的字段插入/更新记录。

问题

单击“保存”按钮时,会显示写入冲突错误。

写冲突

自从您开始编辑此记录后,其他用户已对其进行了更改。如果您保存记录,您将覆盖其他用户所做的更改。 将更改复制到剪贴板可让您查看其他用户输入的值,然后在您决定进行更改时将更改粘贴回去。

触发错误的行是表单记录源设置为 SQL 字符串。

.RecordSource = strSQL

我的解释

虽然表单可以直接更新底部的子表单列表而无需点击“保存”,但为了避免用户无意中更改数据,这是不可取的。

因此,我试图通过单击事件强制“保存”,该事件又调用公共UpsertRecord() 方法来保存数据。该方法工作正常,但会触发写入冲突,因为表单认为它也在自行更改数据(没有“保存”点击)。

尝试的解决方案

我已尝试设置一个私有变量 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”按钮的用途),并且没有设置锁定。

在添加了一些评估frm.Dirtyfrm.subform.Form.Dirtydebug.print 语句后,我将其缩小到主表单,而子表单为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. 在按钮触发保存后添加frm.Dirty = False 时。

所以我仍在解决这个问题,如果有任何其他想法,我将不胜感激。

【问题讨论】:

我只是想知道frm.Dirty = False 上的frm 是否引用了子表单。如果没有,请尝试,frm![theSubform].Form.Dirty = False 不,实际上不是。因此,您建议子表单是尝试更新与未绑定编辑表单的罪魁祸首。我得仔细看看。谢谢! 完全不相关,但在标签中使用site && location 以在表单视图中获取site & location @Andre 感谢您的评论。会检查的。 【参考方案1】:

对于子表单属性Allow Additions, Allow Deletions, Allow Edits 应设置为 No,Record Locks 设置为 No Locks。这样子表单就不能再干扰了。

【讨论】:

谢谢@Tieme,好东西检查。检查子表单,除“允许删除”之外的所有值均为NoNo Locks。虽然 Allow Deletions 允许 delete (x) 按钮删除记录,但我继续并将其设置为子表单中的 No 并重试主表单的 Save 按钮。不幸的是,同样的Write Conflict 错误结果。

以上是关于如何使用未绑定访问表单解决写入冲突的主要内容,如果未能解决你的问题,请参考以下文章

在子表单访问中绑定组合框

如何在连续子表单中使用未绑定复选框 - MS Access 2013

如何使用 Access VBA 将具有默认值的未绑定文本框的值设置为空字符串

例外:使用 strcpy_s 时访问冲突写入位置

从一个未绑定的表单 vba 访问添加多条记录

访问 VBA:如何在表单中获取输入并在查询中使用它们