如何使用未绑定访问表单解决写入冲突
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.Dirty
和frm.subform.Form.Dirty
的debug.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,好东西检查。检查子表单,除“允许删除”之外的所有值均为No
或No Locks
。虽然 Allow Deletions
允许 delete
(x) 按钮删除记录,但我继续并将其设置为子表单中的 No
并重试主表单的 Save
按钮。不幸的是,同样的Write Conflict
错误结果。以上是关于如何使用未绑定访问表单解决写入冲突的主要内容,如果未能解决你的问题,请参考以下文章
如何在连续子表单中使用未绑定复选框 - MS Access 2013