设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

[Access本身] 【原创 / 文章】Access中神秘的Criteria(上)

[复制链接]
跳转到指定楼层
1#
发表于 2005-8-30 04:14:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  看到这个标题,很多读者可能会迷惑,什么是Criteria?我用了这么久Access,怎么从来没听说过。我猜想很多读者都是怀着好奇的心情点击的这个主题。但是也许你不知道,Access中,Criteria无处不在,无时无刻不在你的代码中出现,可能你每天都要和她打交道无数次,只是你从未真正了解过她。

  那么究竟什么才是Critetia,让我们来看下面这个例子:

Forms![窗体_1]![Text0]

  你可能会奇怪,这不是一个很标准的表达式吗?没错,这就是Criteria。我知道你现在心中一定在嘀咕,不就是表达式,有什么好神秘的。那么请你继续往下看,跟着我一起考虑几个或许你从未考虑过的问题。

  之所以我在文中不使用“表达式”来称呼她,是因为Criteria并不是标准的表达式,如果你使用过Eval函数,你就会知道,Eval处理的表达式才是标准的表达式,也正是因为如此,在VBA中文文档中,并没有把Criteria作中文翻译,而是使用了英文的原名。因为她是一种特殊的表达式。

  OK!既然我们已经认识了Criteria,我们一定可以回想起,我们在如此多的地方使用过她,在查询中,在窗体中,在报表中,……但是请你回忆一下,是不是每次都是你把Criteria告诉Access,然后她来帮你作处理,有没有你直接求出Criteria值然后自己来使用的?有?没有?有?没有?好好想想,到底有没有?  可能你开始觉得有点疑惑了,好像真的没有。不必疑惑,

  因为Access根本没有提供Criteria的求值接口!

  没错,Access完全隐藏了Criteria的求值过程,但是Access一定有个函数或者一个函数库来进行Criteria的求值。你可能会问我为什么这么肯定,理由很简单,Criteria包含的内容实在太多,可能是对象的数据,也可能是SQL查询的字段,可能是函数,还可能是……反正表达式生成器里面的那一堆东西,都可以包含在Criteria中,因此Criteria的求值过程并不是一个简单的过程,Access不可能为每个功能单独写段代码来对Criteria进行求值,所以她必定是一个模块,一个Access没有或者说不愿意公开接口的模块。唯一和Criteria有点关系的,可能就是Application对象的BuildCriteria方法了,但这只是一个Criteria生成(确切说是格式化)的方法,最终生成的Criteria,我们还是要通过各种不同的功能、函数传送给Access,以表达我们想要表达的内容,但是这个内容的最终结果是不是正确,我们无从得知,只能从功能和函数返回的值是否符合我们的预期来判断我们的Criteria是否传递正确了。

  这太不公平了!

  我们居然要隔着靴子挠痒痒!任何一个语言的开发环境都允许我们在调试模式下监视我们的值是否正确传递,但是Criteria,这个我们自己创建的东西,Access居然不允许我们直接查看她的结果。你不让,我偏要!

  经过一番尝试,我找到了一种Criteria求值方法。让我们创建一个窗体,添加三个名为Text1、Text2、Text3的文本控件,并且写入以下代码:

Private Sub Text2_AfterUpdate()

    Text3.ControlSource = "=" & Text2.Value

End Sub

  OK!让我们来执行这个窗体,并按照以下步骤输入:

1、Text1输入:我是Text1

2、Text2输入:[Text1]

  你看到了什么?呵呵,不用觉得惊讶,我们“的确”已经计算出了Criteria的值。你还可以尝试输入:Forms![窗体1].Name来看看窗体的名字。看来对象的解读没有问题,那么SQL字段呢?接着我们在这个窗体上绑定一个表,里面包含字段1,字段2,第一条记录是(123,120),然后再打开窗体,照以下步骤操作:

1、Text1输入:100

2、Text2输入:[字段1]*[字段2]/[Text1]

  哈哈,太好了,数据库字段解读一点问题都没有。最后再让我们尝试一下在VBA中获取到这个值。让我们首先把VBA代码中原先的代码删除,加入以下代码:

Private Sub Text2_AfterUpdate()

    Text3.Value = EvalCriteria(Text2.Value)

End Sub

Public Function EvalCriteria(ByVal strCriteria As String) As Variant

    Criteria.ControlSource = "=" & Text2.Value

    DoEvents

    EvalCriteria = Criteria.Value

End Function

  在这里,我们在窗体上放置了一个隐藏的文本控件名为Criteria,用于Criteria绑定数据源的中转,那么现在就让我们来运行这个窗体吧。

  运行的结果这里就不在赘述了,通过将Criteria当作一个数据源来绑定,我们成功地对Criteria进行了求值,终于踏出了揭开Criteria神秘面纱的第一步。(待续)





本文附带示范代码:



游客,如果您要查看本帖隐藏内容请回复








下篇预告:

  通过一个文本框的数据源绑定中转,我们终于实现了Criteria的求值,在我们自以为已经揭开了Criteria神秘面纱的时候,我们突然发现,她居然还深深隐藏了不为人知

本帖子中包含更多资源

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

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2005-8-30 05:38:00 | 只看该作者
厉害又学一招了,收藏.
3#
发表于 2005-8-30 05:57:00 | 只看该作者
期待下一篇,高
4#
发表于 2005-8-30 21:27:00 | 只看该作者
ok

点击这里给我发消息

5#
发表于 2005-8-30 22:02:00 | 只看该作者
写的不错啊,(下)在哪里?
6#
发表于 2005-8-30 22:06:00 | 只看该作者
等看一看
7#
发表于 2005-8-30 22:43:00 | 只看该作者
下,呢
8#
 楼主| 发表于 2005-8-30 23:14:00 | 只看该作者
下篇还没写呢,准备过几天写。这些基本都是我在做多条件格式扩展的过程中体会到的心得,还需要整理思路,慢慢写出来,何况写一篇文章和自己懂不一样,其中还要查阅大量的文档,还要做例子……这几天在忙着完成多条件格式扩展的最后部分,等那个东西做完了有空我会把下篇写完的。谢谢支持!
9#
发表于 2005-8-31 00:00:00 | 只看该作者
10#
发表于 2005-8-31 00:39:00 | 只看该作者

【原创】Access中神秘的Criteria(上)

期待下篇
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-19 23:37 , Processed in 0.119458 second(s), 36 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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