Error: "Operation must use an updateable query" - MS Access
Error: "Operation must use an updateable query" - MS Access
我在 MS Access 中有一个 table Item
,如下所示:
ID ProductNumber ItemNumber Quantity UnitPrice
1 P-0001 Item-001 5 .00
2 P-0001 Item-002 3 .00
3 P-0001 Item-003 2 .00
4 P-0002 Item-004 1 .00
5 P-0002 Item-005 6 .00
6 P-0002 Item-006 2 .00
我已经使用查询 Query1
来计算以上 table
的成本
SELECT [Quantity]*[UnitPrice] AS Cost, *
FROM Item;
在 运行 查询后 table 看起来像这样。
ID ProductNumber ItemNumber Quantity UnitPrice Cost
1 P-0001 Item-001 5 .00 20
2 P-0001 Item-002 3 .00 36
3 P-0001 Item-003 2 .00 12
4 P-0002 Item-004 1 .00 8
5 P-0002 Item-005 6 .00 96
6 P-0002 Item-006 2 .00 14
我使用子查询 Query2
来计算 BatchCost
SELECT (Select Sum(T.Cost)
From Query1
AS T
Where T.ProductNumber = Query1.ProductNumber) AS BatchCost, *
FROM Query1;
在 运行 查询后 table 看起来像这样。
ID ProductNumber ItemNumber Quantity UnitPrice Cost BatchCost
1 P-0001 Item-001 5 .00 20 68
2 P-0001 Item-002 3 .00 36 68
3 P-0001 Item-003 2 .00 12 68
4 P-0002 Item-004 1 .00 8 118
5 P-0002 Item-005 6 .00 96 118
6 P-0002 Item-006 2 .00 14 118
我还有一个 table Prices
看起来像这样:
ProductNumber CostPrice
P-0001 [=15=].00
P-0002 [=15=].00
我想从 Query2
table 中的 BatchCost
更新 Prices
table 中的 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 操作。类似于:
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] & "'")
现在决定要将代码放入哪个事件过程,也许是单击按钮。
我在 MS Access 中有一个 table Item
,如下所示:
ID ProductNumber ItemNumber Quantity UnitPrice
1 P-0001 Item-001 5 .00
2 P-0001 Item-002 3 .00
3 P-0001 Item-003 2 .00
4 P-0002 Item-004 1 .00
5 P-0002 Item-005 6 .00
6 P-0002 Item-006 2 .00
我已经使用查询 Query1
来计算以上 table
SELECT [Quantity]*[UnitPrice] AS Cost, *
FROM Item;
在 运行 查询后 table 看起来像这样。
ID ProductNumber ItemNumber Quantity UnitPrice Cost
1 P-0001 Item-001 5 .00 20
2 P-0001 Item-002 3 .00 36
3 P-0001 Item-003 2 .00 12
4 P-0002 Item-004 1 .00 8
5 P-0002 Item-005 6 .00 96
6 P-0002 Item-006 2 .00 14
我使用子查询 Query2
来计算 BatchCost
SELECT (Select Sum(T.Cost)
From Query1
AS T
Where T.ProductNumber = Query1.ProductNumber) AS BatchCost, *
FROM Query1;
在 运行 查询后 table 看起来像这样。
ID ProductNumber ItemNumber Quantity UnitPrice Cost BatchCost
1 P-0001 Item-001 5 .00 20 68
2 P-0001 Item-002 3 .00 36 68
3 P-0001 Item-003 2 .00 12 68
4 P-0002 Item-004 1 .00 8 118
5 P-0002 Item-005 6 .00 96 118
6 P-0002 Item-006 2 .00 14 118
我还有一个 table Prices
看起来像这样:
ProductNumber CostPrice
P-0001 [=15=].00
P-0002 [=15=].00
我想从 Query2
table 中的 BatchCost
更新 Prices
table 中的 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 操作。类似于:
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] & "'")
现在决定要将代码放入哪个事件过程,也许是单击按钮。