无法更新加入的记录集 - 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 

【讨论】:

抱歉,我不太清楚你的意思。你能再解释一下吗?你的意思是替换IfElse之间的语句? 您将取出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“此记录集不可更新”

MS Access VBA 和 SQL Server - 记录集更新时 ODBC 调用失败

MS Access“更新后”事件:引发错误

MS Access 直通查询更新