MS Access SQL查询中的可更新查询错误消息

时间:2018-01-14 16:43:26

标签: sql ms-access

我将非常感谢您的帮助,请理解为什么以下查询返回“操作必须使用可更新的查询”消息:

UPDATE QC_Costs
SET    QC_Costs.No_Makes = (SELECT Count(Temp_Tbl.Unique_ID) AS MakesCount
                            FROM   (SELECT GSR.Unique_ID,
                                           GSR.Month_Name,
                                           GSR.Year_No
                                    FROM   GSR
                                           INNER JOIN Products
                                                   ON Products.Unique_ID = GSR.Product_ID
                                    WHERE  ( ( ( Products.Item_category ) = "MAKE" )
                                             AND ( ( GSR.Transaction_Type ) = "Invoice" ) )) AS Temp_Tbl
                            WHERE  ( ( ( Temp_Tbl.Month_Name ) = QC_Costs.Month_Name )
                                     AND ( ( Temp_Tbl.Year_No ) = QC_Costs.Year_No ) )); 

我读过很多文章,如果未正确设置更新数据库的权限,则会显示此消息。我试图对文件夹权限进行这些更改(虽然一切看起来都很好),而我不完全理解的是,如果我编写一个不同的查询,我只想让QC_Costs表中的No_Makes字段为1,查询运行正常。这让我相信问题出在我的计数查询或子查询中,但当我将查询的这一部分转换为SELECT查询并自行运行时,它会返回一个结果。

我根本不是专家 - 我今天第一次尝试使用子查询 - 所以我真的很感激一些帮助。

对于上下文 - 我有一张满是发票和信用票据(GSR)的表格。另一个名为Products的表包含具有Item_Category字段的产品列表。 GSR通过Product_ID字段链接到Products。第三个名为QC_Costs的表有一个每个月的记录和一个名为No_Makes的字段。我想在GSR中捕获给定月份的MAKE产品的发票数量,并使用该数字更新QC_Costs表中的No_Makes字段。这个号码将用于我尚未编写的另一个查询中,或者可以添加到此一个查询中,其中一定数量的成本除以No_Makes,然后根据这些记录将该值发回GSR。

我希望以上内容有道理 - 如果我需要提供更多信息,请告诉我。

谢谢

编辑:

为了回应Parfait的回答,我写了以下内容并运行 - 谢谢:

UPDATE QC_Costs 
SET QC_Costs.QC_Cost_Allocation = 
DLookup("SumOfQC_Costs_To_Allocate", "Sum_Of_QC_Costs","Month_Name = " & [QC_Costs].[Month_Name] & " AND Year_No = " & [QC_Costs].[Year_No]) / 
DLookUp("CountofUniqueID","Count_Of_Makes","Month_Name = " & [QC_Costs].[Month_Name] & " AND Year_No = " & [QC_Costs].[Year_No]);

我非常接近,但是我收到一条消息,告诉每个记录会发生类型转换失败。目标字段的数据类型是Double,我已经确定分母Dlookup查询不是零,所以这个除法的答案应该是一个数字小数,所以任何人都可以向我解释如何解决错误的问题,好吗?

我现在不在提问题了,所以我为此道歉 - 如果我不得不重新发布一个新问题,请告诉我。

由于

1 个答案:

答案 0 :(得分:1)

MS Access更新查询不得为read-only才能运行。它与正确的权限无关。您尝试使用COUNT()分配给 No_Makes 的聚合查询不可更新。

考虑DLookup函数,该函数从保存的查询中外部检索您的值:

选择查询(另存为存储的查询对象)

SELECT Count(GSR.Unique_ID) AS CountUniqueID,
       GSR.Month_Name,
       GSR.Year_No
FROM   GSR
INNER JOIN Products
     ON Products.Unique_ID = GSR.Product_ID
WHERE (((Products.Item_category) = 'MAKE')
  AND  ((GSR.Transaction_Type) = 'Invoice'))
GROUP BY GSR.Month_Name,
         GSR.Year_No

更新查询

UPDATE QC_Costs
SET    QC_Costs.No_Makes = DLookup("CountUniqueID", "mySavedQuery", 
                                   "Month_Name='" & QC_Costs.Month_Name & "' 
                                    AND Year_No = " & QC_Costs.Year_No)

除此之外 - 通常说人们不应该在数据库表中保存计算或计算,因为它们可以很容易地从查询中检索报告。而是将表存储用于原始值。