【发布时间】:2018-05-25 00:14:33
【问题描述】:
我正在编辑表单上的记录。然后我想对表单下的整个记录集进行记录集操作。记录集操作然后遇到错误“错误 - 无法更新;当前被这台机器上的另一个会话锁定”...显然是因为正在编辑记录。
无论这是否是好的做法,我如何使用 vba 让应用程序取消、忽略或完成表单编辑操作,以便记录集操作可以继续......或者只是不可能,因为GUI 不能从 VBA 中“释放”(有点像在编辑 Excel 单元格时)?
【问题讨论】:
我正在编辑表单上的记录。然后我想对表单下的整个记录集进行记录集操作。记录集操作然后遇到错误“错误 - 无法更新;当前被这台机器上的另一个会话锁定”...显然是因为正在编辑记录。
无论这是否是好的做法,我如何使用 vba 让应用程序取消、忽略或完成表单编辑操作,以便记录集操作可以继续......或者只是不可能,因为GUI 不能从 VBA 中“释放”(有点像在编辑 Excel 单元格时)?
【问题讨论】:
这可能经常发生。简单的技巧是确保当前表单记录不“脏”或不等待更新。
这样你就可以走了:
if me.dirty = True then me.Dirty = False
' now call your update routines etc.
因为那些其他例程可能会更新您正在查看的屏幕/记录,所以您可以执行 me.Refresh 以确保显示任何更改。
以上将强制记录写入。事实上,如果我在一个表单中,并计划说为用户启动一些弹出表单,或者在下一个“步骤”中启动一个表单,我也倾向于强制写出当前表单 - 它不仅更安全,而且避免常见的“此记录已被另一个用户更改”。在大多数情况下,其他用户实际上就是您的代码。
因此,只需使用上面的一行代码保存记录 - 这通常可以消除此问题。请记住,您可以设置一个表单以在表单属性表的“数据”选项卡中锁定整个表,但这不太可能是您的问题。
【讨论】:
表单是数据绑定的吗?听起来不像。
Me!SomeField = ...
DoCmd.RunCommand acCmdSaveRecord
如果您的表单有控件绑定到“SomeField”,那么表单将自动更新。
1) 使用 SQL 代码更新记录。例如,您有应该在表单数据集中更新的记录 ID,因此您可以编写如下内容:
Call CurrentDB.Execute( _
"UPDATE SomeTable SET SomeField = SomeValue WHERE SomeTableID = " & Me!SomeTableID, dbSeeChanges)
2) 你可以看看Bookmark 属性——Recordset 和Form 都有这个属性,它描述了记录的位置。所以你可以写这样的东西(不是最好的例子,但可以帮助你得到一个想法):
Dim Rs as Recordset
Set Rs = Me.RecordsetClone 'make a reference copy of the form recordset
Rs.Bookmark = Me.Bookmark 'locate this recordset to the form current record
【讨论】: