无法更新加入的记录集 - MS Access
Posted
技术标签:
【中文标题】无法更新加入的记录集 - MS Access【英文标题】:Unable to update a joined recordset - MS Access 【发布时间】:2015-01-27 15:49:29 【问题描述】:以下代码给我一个错误:“无法更新。数据库或对象是只读的。”我有一个隐含的JOIN
,但删除了它,它仍然无法正常工作。任何帮助,将不胜感激。谢谢!
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim mysql As String
Dim rsSQL As String
rsSQL = "SELECT tblTable1.aaaID, tblTable1.bbbID, tblTable2.ccc, " & _
"Sum(tblTable2.ddd) AS Name, tblTable1.eee, tblTable2.fff " & _
"FROM (tblTable3 INNER JOIN tblTable1 ON tblTable3.aaaID = tblTable1.aaaID) " & _
"INNER JOIN tblTable2 ON tblTable3.aaaID = tblTable2.aaaID " & _
"GROUP BY tblTable1.aaaID, tblTable1.bbbID, tblTable2.ccc, tblTable1.eee, tblTable2.fff " & _
"HAVING (((tblTable1.aaaID)=88) AND ((tblTable1.bbbID)=1) AND ((tblTable2.fff)=True));"
Set db = CurrentDb
Set rs = db.OpenRecordset(rsSQL, dbOpenDynaset)
If Not rs.BOF And Not rs.EOF Then
rs.MoveFirst
Do Until rs.EOF
If rs!ccc = "xxx" Then 'This is a text value
rs.Edit 'Here is where the code fails
rs!eee = eee + Name '"eee" and "Name" are currency
rs.Update
Else
rs.Edit 'And here, too
rs!eee = eee - Name
rs.Update
End If
rs.MoveNext
Loop
Else
DoCmd.Close acForm, "frmForm1", acSaveYes
Exit Sub
End If
【问题讨论】:
【参考方案1】:您可以保持查询不变,只需更改更新即可。 而不是 rs.ccc= 做类似的事情:
strSQL = "UPDATE tblTable2 " _
& "SET eee= (" & rs.eee + rs.name & ")" _
& "WHERE PK= " & rs.pk & "
DoCmd.RunSQL strSQL
【讨论】:
抱歉,我不太清楚你的意思。你能再解释一下吗?你的意思是替换If
和Else
之间的语句?
您将取出rs.edit...rs.update
部分并将其替换为上面的这一点。这是一种更新与其他代码不同且不相关的表的方法(所以它有效,耶!)。您需要关闭SetWarnings
,然后再重新打开,以避免出现对话框。
太棒了!我必须使用一个 DLookup 来填充 eee
。如果有更好的方法请告诉我。但它的工作!非常感谢!【参考方案2】:
使用GROUP BY
构建的查询必须始终不可更新。你需要改变你的方法。使用 VBA 之外的查询来启动一个可行的查询(因为这样可以方便地进行测试)。
【讨论】:
我使用查询生成器来获取上述查询。所以我知道它有效。你所说的关于GROUP BY
是有道理的。是否可以从GROUP BY
获取字段值并将其分配给变量,然后通过DLookup
将变量添加到字段中? (仍然认为自己是 Access 新手)。
您走在正确的道路上。但DLookup()
不适用。使用(并接受)@yoelbenyossef 的答案。
(我所说的“可行查询”只是指可更新的。很抱歉造成混淆。)以上是关于无法更新加入的记录集 - MS Access的主要内容,如果未能解决你的问题,请参考以下文章
MS Access 2007 - 导入表后,记录集不再可更新
ms-access 2007 运行时和 lockWindowUpdate
SELECT 查询中的 MS Access“此记录集不可更新”