错误:“操作必须使用可更新的查询” - MS Access

Posted

技术标签:

【中文标题】错误:“操作必须使用可更新的查询” - MS Access【英文标题】:Error: "Operation must use an updateable query" - MS Access 【发布时间】:2018-12-15 12:46:10 【问题描述】:

我在 MS Access 中有一个表 Item,如下所示:

ID  ProductNumber   ItemNumber  Quantity    UnitPrice
1   P-0001          Item-001        5       $4.00
2   P-0001          Item-002        3       $12.00
3   P-0001          Item-003        2       $6.00
4   P-0002          Item-004        1       $8.00
5   P-0002          Item-005        6       $16.00
6   P-0002          Item-006        2       $7.00

我已使用查询Query1 来计算上表的成本

SELECT [Quantity]*[UnitPrice] AS Cost, *
FROM Item;

运行查询后,表如下所示。

ID  ProductNumber   ItemNumber  Quantity    UnitPrice   Cost
1   P-0001          Item-001        5       $4.00       20
2   P-0001          Item-002        3       $12.00      36
3   P-0001          Item-003        2       $6.00       12
4   P-0002          Item-004        1       $8.00       8
5   P-0002          Item-005        6       $16.00      96
6   P-0002          Item-006        2       $7.00       14

我使用了子查询Query2 来计算BatchCost

SELECT (Select Sum(T.Cost) 
From Query1 
AS T
Where T.ProductNumber = Query1.ProductNumber) AS BatchCost, *
FROM Query1;

运行查询后,表如下所示。

ID  ProductNumber   ItemNumber  Quantity    UnitPrice   Cost    BatchCost
1   P-0001          Item-001        5       $4.00         20    68
2   P-0001          Item-002        3       $12.00        36    68
3   P-0001          Item-003        2       $6.00         12    68
4   P-0002          Item-004        1       $8.00         8     118
5   P-0002          Item-005        6       $16.00        96    118
6   P-0002          Item-006        2       $7.00         14    118

我有另一张桌子Prices,看起来像这样:

ProductNumber   CostPrice
P-0001          $0.00
P-0002          $0.00

我想从Query2 表中的BatchCost 更新Prices 表中的CostPrice

我用过这个查询:

UPDATE Prices INNER JOIN Query2 ON Prices.ProductNumber=Query2.ProductNumber 
SET Prices.CostPrice =  Query2.[BatchCost]
WHERE (((Prices.ProductNumber)=[Query2].[ProductNumber]));

但出现错误:Operation must use an updateable query

当我在查询中使用另一个字段时,例如 UnitPrice 而不是 BatchCost,则查询有效。问题出在 BatchCost 字段中。

【问题讨论】:

聚合查询不能用于 UPDATE 操作。时期。不会工作。除非您的数据库变得如此之大以至于计算数据变得难以忍受,否则不要保存聚合数据。需要时计算。否则,使用 VBA 来完成。但是,可以在 INSERT 操作中使用。因此,另一种方法是从价格中删除记录,而不是在每次要更新此字段时插入所有记录。 保存汇总数据的最佳方法是什么?你能写一段VBA代码来更好地理解吗?我想计算BatchCost 并在Prices 表中更新它。 【参考方案1】:

同样,保存这些汇总数据可能不是一个好主意,但如果您必须...

打开一个记录集,循环遍历记录,运行 UPDATE 操作。比如:

Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT ProductNumber, Sum(Quantity * UnitPrice) AS SumCost FROM Item GROUP BY ProductNumber;")

While Not rs.EOF
    CurrentDb.Execute "UPDATE Prices(CostPrice) VALUES(" & rs!SumCost & ") WHERE ProductNumber = '" & rs!ProductNumber & "'"
    rs.MoveNext
Wend

或者没有记录集,也没有循环:

CurrentDb.Execute "DELETE FROM Prices"
CurrentDb.Execute "INSERT INTO Prices(ProductNumber, CostPrice) SELECT ProductNumber, Sum(Quantity * UnitPrice) AS SumCost FROM Item GROUP BY ProductNumber"

第二个选项可以是查询设计器中内置的两个查询对象,然后手动运行或从代码(宏或 VBA)调用。

或者在查询对象中使用 DSum() 并调用该查询(在 VBA 的 SQL 语句中使用条件标准构建域聚合很棘手):

UPDATE Prices SET CostPrice=DSum("Quantity*Price", "Item", "ProductNumber='" & [ProductNumber] & "'")

现在决定要将代码放入哪个事件过程,也许是一个按钮 Click。

【讨论】:

第二个正在工作。我已将数据插入到临时表中,然后更新为Prices 表。 @Adnan,修改答案以提供第三个选项。

以上是关于错误:“操作必须使用可更新的查询” - MS Access的主要内容,如果未能解决你的问题,请参考以下文章

操作必须使用可更新的查询。 (错误3073)Microsoft Access

访问数据库 - 操作必须使用可更新的查询。 (在本地工作正常)

部署后“操作必须使用可更新查询”

操作必须使用可更新的查询 - 访问

Oledb 异常未处理。操作必须使用可更新的查询

Access DB:操作必须使用可更新的查询