设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 3811|回复: 8
打印 上一主题 下一主题

[查询] 更新查询时提示“操作必须使用一个可更新的查询”

[复制链接]
跳转到指定楼层
1#
发表于 2011-8-30 12:07:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


有二个表,第一个表是每日入库情况,第二个表是最新价格表
需要把每日入库情况里的最新记录(即最新的价格和入库日期)更新到《最新价格表》内
自己做了个更新查询,但不能成功执行,提示“操作必须使用一个可更新的查询”
请看附件
请高手帮忙,最好能有详细的解答
谢谢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2011-8-30 15:31:58 | 只看该作者
供参考:
UPDATE 最新价格表 SET 最新价格表.最新日期 = DLast("入库日期","最大价格查询","代码='" & [代码] & "'"), 最新价格表.最新价格 = DLast("价格","最大价格查询","代码='" & [代码] & "'");
可能需要改DLast为DMax,视具体情况而定。
3#
 楼主| 发表于 2011-8-30 12:43:24 | 只看该作者
本帖最后由 lastmem 于 2011-8-30 12:44 编辑

用工具--自动更正选项,把..1更正为合格,..2更正为不合格
(晕。给别人回复呢。结果弄错地方了)
4#
发表于 2011-8-30 18:18:02 | 只看该作者
roych 老师请帮助解释一下:楼主:但不能成功执行,提示“操作必须使用一个可更新的查询”是什么问题造成的,目前我也遇到了此问题,并且帮助说明您给的两个函数的含义,谢谢
5#
 楼主| 发表于 2011-8-31 08:41:20 | 只看该作者
我也是很不明白,明明查询是没有问题的
如果是用生成表查询,把结果生成一个新表,再更新是没有问题的
为什么直接用查询结果更新就不能通过呢?
6#
 楼主| 发表于 2011-8-31 11:52:56 | 只看该作者
从其它地方摘抄的原因说明,希望对别人会有帮助,也请roych老师指正:
=====================================

Access SQL update提示:操作必须使用一个可更新的查询
例如修改语句:
update 表A set 表A的字段 = (select sum(表B的某字段) from 表B where 表B某字段 = '表B某字段值') where 表A的字段 = '表A的字段值'
当执行这条语句时Microsoft Office Access 操作必须使用一个可更新的查询。原因是Access不支持这种修改的语法,所以微软就提供一个这么一个函数来实现这个功能,那就是Dsum函数,在帮助里面可以查看具体的使用方法。

DSum 函数
DSum 函数可用于计算一组指定记录(域)中的一组值的总和。可以在 Visual Basic、宏、查询表达式或计算控件 中使用 DSum 函数。
例如,可以在查询的计算字段表达式中通过 DSum 函数来计算某一段时间内特定雇员的总销售量。或者在计算控件中使用 DSum 函数来显示特定产品的流水销售总额。
DSum(expr, domain, [criteria])
DSum 函数包含以下参数:
参数 说明
expr 表达式,用于标识被计算值的总和的数字字段。它可以是标识表或查询中的字段的字符串表达式,或者是对该字段中的数据进行计算的 表达式。在 expr 中,可以包含表中的字段、窗体上的控件、常量或者函数的名称。如果 expr 包含函数,那么该函数可以是内置的或用户定义的,但不能是其他域聚合函数或 SQL 聚合函数。
domain 字符串表达式,用于标识组成域的一组记录。它可以是不需要参数的查询的表名或查询名。
criteria 可选的字符串表达式,用于约束对其执行 DSum 函数的数据的范围。例如,criteria 常常等价于 SQL 表达式中除去 WHERE 关键字的 WHERE 子句。如果 criteria 被忽略,DSum 函数将对整个域计算 expr。任何包含在 criteria 中的字段必须也是 domain 中的字段;否则 DSum 函数将返回 Null 值。
从中可以看出Access中根本不支持这种 set (a,b) = (x,y) 方式, 另外ACCESS中也不支持直接从本表进行 set x = (select SUM(x) from 同一个表)。 因此必须使用Dsum函数

语法为:
update 表A set 表A的字段 = Dsum ("表B的某字段", "表B" ," 表B某字段 = '表B某字段值'") where 表A的字段 = '表A的字段值'


update 表A set 表A的字段 = Dsum (‘表B的某字段', '表B' ,' 表B某字段 = "表B某字段值"') where 表A的字段 = '表A的字段值'

这两条语法都能达到修改的效果,只是在符号上面有所修改而已。
7#
发表于 2011-8-31 09:44:32 | 只看该作者
很实用的一个问题 学习了!
8#
 楼主| 发表于 2011-9-1 09:41:02 | 只看该作者
非常感谢,解释的很清楚。
9#
发表于 2011-8-31 19:10:02 | 只看该作者
lastmem 发表于 2011-8-31 11:52
从其它地方摘抄的原因说明,希望对别人会有帮助,也请roych老师指正:
================================= ...

指正谈不上,其实你已经说得很好了。我这里稍稍做些解释吧。
先说说两个函数的大体含义吧,虽然大家可以从帮助文件里找得到更好的解释。简单点说,DMax是获取符合条件的最大值,DLast是获取符合条件的最后一条记录。以3L的回复为例, DLast("入库日期","最大价格查询","代码='" & [代码] & "'")就是用于获取最大价格查询中,与最新价格表里代码相同的最后一条入库日期记录。听起来有些拗口,或者说比较抽象,建议实践一下以促进理解。
在本例里,DMax和DLast是可以互通的。但需要注意以下情况:
1、假定为了方便录入,我们设置录入日期默认值为系统日期。如果用户无端修改了系统日期,那么为了获取最新价格,当然应该以最后一条记录为准了。
2、如果没有禁用排序的话,那么如果用户随意对某些字段进行了排序,那么最后一条记录则不一定是最新日期录入的,因此则需要以最大日期为准。
这也是我所说的“视具体情况而定”的缘故。
那么有没有更好的办法呢?当然是有的。我们可以考虑自动编号,最大编号肯定是最后一条记录。

在Access中,是不支持存在内联接的两个表进行更新查询的。因此我们需要变通一下,用域函数来规避这个问题。当然,用子查询也是可以的,例如:
select 字段1 from 表名 where 字段2 In (select 字段2 from 表名)——可以改成Update语句。
但对Access而言,则不是最佳选择,主要在于查询效率低下(相当于两个查询运行次数的乘积)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2025-1-17 00:59 , Processed in 0.090974 second(s), 33 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表