【问题标题】:Error 3218: Could not update; currently locked错误 3218:无法更新;当前锁定
【发布时间】:2015-05-06 18:21:26
【问题描述】:

我一直在查看与我相关的其他问题,但大多数都是关于多用户的,this one 接近但不完全。

系统 微软访问 2013
与 Office 365 Sharepoint 的链接表

tblQuote - frmQuote
tblQuoteItems - sbfrmQuoteItems

没有记录锁定

我正在尝试设置一个全选/取消全选按钮,单击该按钮会在等于报价 ID 和报价版本的 tblQuoteItems 上运行 db.Execute Update。

我在主窗体上有一个按钮,它调用以下过程。

Public Sub SelectLineItems(strTable As String, strID As String, _
                       intID As Integer, bln As Boolean, Optional intVersion As Integer)

Dim db As Database
Dim strSQL As String
Dim strVersion As String

Set db = CurrentDb

strSQL = "UPDATE " & strTable & " SET [Selected] = "

If intVersion > 0 Then
    strVersion = " AND [QuoteVersion] = " & intVersion
Else
    strVersion = ""
End If

If bln Then
    strSQL = strSQL + "False WHERE " & strID & " = " & intID & strVersion & ";"
Else
    strSQL = strSQL + "True WHERE " & strID & " = " & intID & strVersion & ";"
End If

db.Execute strSQL, dbFailOnError

db.Close
Set db = Nothing
Exit Sub

这很简单,没什么可疯狂的。当我在表单修改了记录并且它仍然具有焦点后尝试运行它时会出现问题。由于 dbFailOnError 我收到错误消息,如果我删除 dbFailOnError 它将更新除已通过表单修改的记录之外的每条记录。

如果我修改记录,然后通过单击鼠标手动选择不同的记录,则记录不再锁定,更新工作没有错误。

我尝试复制点击新记录的过程,并输入了以下代码

If Me.Dirty Then Me.Dirty = False

在我能想到的每一个事件中:

subform_Current, subform_Dirty, subform.Control.Dirty/Lost_focus/subform_Before and After Update, 子窗体控件在主窗体上的退出事件...等

将代码放在不同的区域没有任何区别,第一次调用代码时它会更新记录,我可以在表格中确认这一点,新值存在。

我已尝试重新查询子表单

我试过了

DoCmd.GoToRecord , , acFirst

然后将焦点设置到记录的第一个控件。

我什至尝试将更新从 db.Execute 更改为使用记录集对象

Dim db As Dao.Database
Dim rs As Dao.Recordset

Dim strSQL As String
Dim strVersion As String



If intVersion > 0 Then
    strVersion = " AND [QuoteVersion] = " & intVersion
Else
    strVersion = ""
End If

strSQL = "SELECT * FROM " & strTable & " WHERE " & strID & "= " & intID & strVersion

Set db = CurrentDb
Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)

    With rs
        Do Until .EOF
            .Edit
            !Selected = bln
            .Update
            .MoveNext
        Loop
    End With

rs.Close
db.Close
Set rs = Nothing
Set db = Nothing

但它会再次循环遍历每个未锁定的记录并更新,直到它到达被表单修改的那个,然后抛出相同的错误。

我试过打开记录集然后关闭它然后重新打开它。但似乎无关紧要的是持有锁定记录的表单。

对我有用的唯一解决方案是将子表单记录源设置为空,然后运行更新,然后将记录源重置为原来的状态。

Selected 列在 QuoteItems 表本身中,而不是在参考 QuoteItems ID 的自己的表中

我的问题是如何让表单通过模拟手动单击新记录而不重置子表单的记录源的操作的代码来释放记录。

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:

    您使用Dirty=False 的方法是正确的做法。但是您必须将其应用于子表单,因为这是记录锁定发生的地方。如果您的代码在主窗体中,则需要在代码之前添加此代码以更新记录。

    Me.sbfrmQuoteItems.Form.Dirty = False
    

    在该行中sbfrmQuoteItems 应该是主窗体中子窗体的名称-Control

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多