Office中国论坛/Access中国论坛

标题: 【Access小品】重点与细节--一个关于查询的讨论 [打印本页]

作者: todaynew    时间: 2011-3-15 15:49
标题: 【Access小品】重点与细节--一个关于查询的讨论
  版友zyp同志问询一个"操作必须使用一个可更新的查询"的问题,这是一个非常容易让人迷惑不解的问题。通常在若干表或查询联接基础上做更新查询,常常出现这个状况。产生的原因很多,这里不细说,通常有一个办法可以判断是否会出现这个情况,那就是先在选择查询中看看是否可以新增或修改记录,如果不行的话,由此建立的更新查询都会跳错。

  遇到这种情况,一般可以用域函数来解决问题。比如:
  UPDATE A INNER JOIN C ON A.id=C.id SET A.SL=C.hjs跳错的话,
  那么UPDATE A SET A.SL = DLookUp("HJS","C","ID=" & a.ID)是可行的处理方案。

  在解答zyp同志的问题过程中,版友roych 同志指出老汉版主的解法有误,应该为
  UPDATE A SET A.SL = DSum("SL","B","ID='" & [ID] & "'") WHERE ((DLookUp("ID","B","ID='" & [ID] & "'");=True))

  对此老汉版主颇不以为然,因为在老汉版主看来,还是域函数的应用而已,且不必写where子句。于是便认为可以写成:
  UPDATE A SET A.SL = DSum("SL","B","ID='" & [ID] & "'") 即可。

  roych 同志大怒,便写实例要求以实践检验真理。老汉版主下载后,看了许久未解其妙。便返回看了看zyp同志的原问题。发现确实有疏漏了。解决问题的基本考虑上老汉版主只关注到了重点但没考虑细节,在这个实例中隐含着一个保留原有数据的问题存在。但是面对roych 同志的较真,老汉版主觉得需要保留颜面,既然说了不需要where子句,那就一定不用where子句进行处理。否则糊弄不住roych 同志,以后还怎么在论坛混呢?

  想了想,至少有两个手段,其一是用iif函数,其二是用Nz函数。如果用iif函数,估计roych 同志会说应该用Nz函数,因为Nz函数相对来说更精巧一些。于是便决定堵住roych 同志的退路,决然用Nz函数处理。便写以下处理方案:
  UPDATE A SET A.SL = nz(DSum("SL","B","ID='" & [ID] & "'"),A.SL)

  这个问题的处理实际上涉及的三个层次,其一是问题的重点是什么?其二是问题有哪些细节(特别是隐含的)?其三是问题的处理有哪些手段?把握重点可以找到问题的突破口,了解细节可以全面的解决问题,掌握手段可以精巧的处理问题。较之前两个层次,手段不是最重要的。因为手段实在太多了,就此问题看如果用where子句可用域函数(Dlookup和Dcount均可),还可以用子查询。如果不用where子句,可以用iif、Nz函数。当然应该还存在用ADO或DAO数据记录集处理等其他的手段和方法。

  以下是zyp同志实例,有兴趣的初学者版友也可研究一下,对养成处理问题的思路或许有帮助。

[attach]45118[/attach]

作者: roych    时间: 2011-3-15 17:03
本帖最后由 roych 于 2011-3-15 17:24 编辑

当时觉得既然老汉用Dlookup来做,为什么不干脆点,用Dsum岂不是省去一个查询?于是Roy写的就是这个:
UPDATE A SET A.SL = DSum("SL","B","ID='" & [ID] & "'")
但调试时发现更新完3行数据,觉得有必要加上Where语句,并帖子上也写了:
如果没有Dlookup的话,其它数据将被清空。。。这可不好。

只是一时间没想到Nz函数,(⊙_⊙),Roy输在函数不太熟悉的份上。认栽了~~~
否则糊弄不住roych 同志,以后还怎么在论坛混呢?

Roy可是最捣蛋的,最爱拍砖的噢。。所以……(*^__^*) 嘻嘻……
作者: zyp    时间: 2011-3-15 19:05
本帖最后由 zyp 于 2011-3-15 19:07 编辑

谢谢两位了, 我差点用VBA遍历的方法去更新了

一直都在用ADP, 所以以前一直没有遇到这样的问题

作者: xuwenning    时间: 2011-3-16 08:11
谢谢分享
收藏了




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3