设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 4507|回复: 11
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
1#
发表于 2011-3-14 21:33:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zyp 于 2011-3-14 21:46 编辑

一直用ADP,  MDB忘得差不多了, 今天做一个更新查询,执行时提示"操作必须使用一个可更新的查询", 而这个查询在ADP中可以轻易做到的,在MDB中却不行, 真是百思不得其解.

背景是这样的, 表A是物料名称表, SL栏位用于记录该物料的累计出库数; 表B为出库记录, 一个物料有多次出库; 现在用查询C将同一款物料的出库数合计起来, 再用一个更新查询将合计值更新到物料名称表对应物料的SL栏位中

为了简化描术, 将表A的ID栏位值当做是物料, 而表B中的ID对应着表A的物料

我的表是这样的:
表:A
ID     SL
1        0
2        0
3        0
表:B
自动编号    ID    SL2
1                 1       5
2                 1       5
3                 1       5
4                 2       23

查询:C
SELECT id,sum(sl2) as hjs FROM B GROUP BY id
得到结果是:
ID    hjs
1     15
2     23

我现在想将查询C的值更新到表A对应栏位中, 更新查询如下:
UPDATE A INNER JOIN C ON A.id=C.id SET A.SL=C.hjs
想得到结果是表A的数据如下:
ID     SL
1        15
2        23
3        0

但运行这个更新查询出现"操作必须使用一个可更新的查询"的错误提示, 没法更新.

但如果我直接写: UPDATE A SET A.sl=0     这个更新查询又是可以执行的, 不知是不是因为查询C是不可更新的查询的缘故, 但是查询C只是用来取值, 并不是更新查询C的值.

在ADP中写法有所不同,应该是: UPDATE A SET A.sl=c.hjs FROM A INNER JOIN C ON A.id=C.id
在ADP中执行一直没有问题.

哪位朋友有解决过这个问题的, 请多多指教!

本帖子中包含更多资源

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

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2011-3-15 09:18:05 | 只看该作者
UPDATE A SET A.SL = DLookUp("HJS","C","ID=" & a.ID);
3#
 楼主| 发表于 2011-3-15 10:29:15 | 只看该作者
todaynew 发表于 2011-3-15 09:18
UPDATE A SET A.SL = DLookUp("HJS","C","ID=" & a.ID);

谢谢todaynew版主, 这招确实管用,  

4#
发表于 2011-3-15 10:35:34 | 只看该作者
如果不想建太多查询,也可以这样:
UPDATE A SET A.SL = DSum("SL","B","ID='" & [ID] & "'") WHERE ((DLookUp("ID","B","ID='" & [ID] & "'");=True));
如果没有Dlookup的话,其它数据将被清空。。。这可不好。
5#
发表于 2011-3-15 11:19:23 | 只看该作者
roych 发表于 2011-3-15 10:35
如果不想建太多查询,也可以这样:
UPDATE A SET A.SL = DSum("SL","B","ID='" &  & "'") WHERE ((DLookUp ...

WHERE ((DLookUp("ID","B","ID='" & [ID] & "'");=True))是多余的尾巴。

UPDATE A SET A.SL = DSum("SL","B","ID='" & [ID] & "'") 即可
6#
发表于 2011-3-15 13:14:54 | 只看该作者
本帖最后由 roych 于 2011-3-15 13:41 编辑

回复 todaynew 的帖子

Hoho,俺也不多说了,实践是检验真理的唯一标准,执行查询之前请留意原先A表中ID为3的记录。

本帖子中包含更多资源

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

x
7#
发表于 2011-3-15 14:21:48 | 只看该作者
roych 发表于 2011-3-15 13:14
回复 todaynew 的帖子

Hoho,俺也不多说了,实践是检验真理的唯一标准,执行查询之前请留意原先A表中ID为 ...

呵呵,很认真。不过我依然要去掉你的尾巴,用这个即可:
UPDATE A SET A.SL = nz(DSum("SL","B","ID='" & [ID] & "'"),a.sl);
8#
发表于 2011-3-15 14:52:24 | 只看该作者
(⊙_⊙),赞一个。这样的确简洁多了。之前以为不加条件可能不行,倒是忘了常常用的Nz函数。
9#
发表于 2011-3-15 14:57:08 | 只看该作者
roych 发表于 2011-3-15 14:52
(⊙_⊙),赞一个。这样的确简洁多了。之前以为不加条件可能不行,倒是忘了常常用的Nz函数。

熟能生巧
10#
 楼主| 发表于 2011-3-15 15:10:52 | 只看该作者
谢谢两位了!

我需要的就是当在A的ID在表B中没有时, 就将表A的SL字段更新为0, 因为这正是业务所需要的.

比如说之前有ID为8的商品入库一次,入库数为100, 用更新查询后则表A中ID为8的商品的SL栏位就为100了, 但是后来发现这个入库是错误的,将其这笔入库记录删除了, 这时A中ID为8的商品的SL栏位就为0才对,所以就需要用更新查询将其更新为0,不然就出错了.

所以我在todayNew版主的基础上修改了一下, 如下所示:
UPDATE A SET A.SL= nz(dlookup("[hjs]","c","[ID]="& A.ID),0)
这样就达到我的要求了

再次谢谢两位
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 16:13 , Processed in 0.093962 second(s), 35 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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