错误3218:无法更新;目前已锁定

时间:2015-05-06 18:21:26

标签: access-vba

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

系统 MS Access 2013
链接表到Office 365 Sharepoint

tblQuote - frmQuote
tblQuoteItems - sbfrmQuoteItems

无记录锁定

我正在尝试设置一个select all / deselect all按钮,当单击时运行db.Execute更新tblQuoteItems等于引用ID和引用版本。

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

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和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

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

1 个答案:

答案 0 :(得分:0)

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

Me.sbfrmQuoteItems.Form.Dirty = False

该行sbfrmQuoteItems应该是主窗体中SubForm- 控件的名称!