Ошибка: «Операция должна использовать обновляемый запрос» - MS Access - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть таблица Item в MS Access, которая выглядит следующим образом:

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

Я хочу обновить CostPrice в Prices таблицу из BatchCost в Query2 таблица.

Я использовал этот запрос:

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.

1 Ответ

0 голосов
/ 16 декабря 2018

Опять же, сохранение этих агрегированных данных, вероятно, плохая идея, но если вам необходимо ...

Открыть набор записей, просмотреть записи, запустить действие 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 () в объекте запроса и вызовите этот запрос (создание агрегата домена с условными критериями в выражении SQL в VBA сложно):

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

Сейчасрешить, в какую процедуру события вы хотите поместить код, возможно, нажатием кнопки.

...