我一直在查看与我相关的其他问题,但大多数是关于多用户的,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
我的问题是如何让表单通过代码模拟手动点击新记录而不重置子表单记录源的操作来释放记录。
答案 0 :(得分:0)
使用Dirty=False
的方法是正确的做法。但是你必须将它应用于子表单,因为这是记录锁定发生的地方。如果您的代码是主表单,则需要在代码之前添加此代码以更新记录。
Me.sbfrmQuoteItems.Form.Dirty = False
该行sbfrmQuoteItems
应该是主窗体中SubForm- 控件的名称!