【发布时间】: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 的自己的表中
我的问题是如何让表单通过模拟手动单击新记录而不重置子表单的记录源的操作的代码来释放记录。
【问题讨论】: