当然,在表单上执行某些过滤器为时已晚,因为您只能过滤表单已加载的内容!
这里最好的方法是去公共汽车站向一位 90 岁的老太太征求意见。她的回答会给你这个问题的解决方案和答案。
所以我们先问那个 90 岁的老太太以下问题:
当您使用即时取款机时,即时取款机下载所有帐户然后询问您要使用哪个帐户是否有意义?
老太太会回答:那真是愚蠢——你想问用什么帐户工作然后下载一个帐户!
当您使用 Google 搜索互联网时也是如此 - 您不会将整个互联网下载到您的计算机中,然后使用 ctrl-f 搜索下载到该网络浏览器中的所有内容。
所以在 Access 的情况下,如果你使用表单过滤器,或者使用 ctrl-F,那么你只能搜索表单已经从 SQL 服务器下载的内容。因为公交车站的老太太会告诉你这太疯狂了,如果你曾经使用过谷歌或任何其他软件,关键概念是首先询问用户想要搜索的内容,然后根据该请求下载结果.
因此,在您知道要搜索什么之前,不要将所有甚至任何记录下载到用于搜索的表单中!
该表单实际上应该从未绑定(没有数据源)开始。然后,您只需在表单顶部附近放置一个文本框,并允许用户输入姓氏(或仅输入该姓氏的前几个字符)。然后,您可以以类似于以下访问表单的持续表单显示搜索结果:
请注意上面用户如何输入“Smi”(正在寻找 smiths)。
所以即使是那个文本框的更新后的代码也会是这样的:
dim strSQL as string
strSQL = "select * from tblCustomer where LastName Like "'" & me.txtLastName & "*'"
me.RecordSource = strSQL
因此,您只需将带有用户搜索条件的 SQL 填入“数据源”表单即可。在这种情况下,如果该数据库有 100 万行或 1000 万行,则只提取请求的记录。此类搜索通常会在不到一秒的时间内完成——即使对于具有数百万行的大型表也是如此。
所以不要使用过滤器——因为它只能过滤您下载到该表单中的现有记录。并且不要使用 ctrl-f 进行搜索,因为那样只能搜索已经下载到表单中的记录。然而,在上面的表格中,ctrl-f(内置的 Access 搜索)可用于搜索基于 smith 搜索的 50 个左右的匹配项 - 因此我们可以在提取批次后向下钻取并跳转到说出给定的名字来自 SQL 服务器的记录。
因此,每次从头开始搜索时只需形成 SQL 并将该 SQL 填充到表单记录源中 - 结果是访问只会从 SQL 服务器中提取这些记录 - 而且它会很快发生 - 即使对于大型表也是如此。 (当然假设您有为快速搜索建立索引的公共列)
正如您在上面的 Access 示例中看到的,搜索已经发生,并显示了一个结果“列表”。在上面我们还提供了一个“编辑”按钮来编辑一条记录。所以在上面用户可以点击那个按钮,我们打开编辑表单来编辑那个记录的“细节”。只要我们使用表单“where 子句”,那么该表单只加载一条记录,因此再次启动该表单以编辑一条记录将立即发生——即使对于 1 或 500 万行的表也是如此。
请注意,此编辑表单可以直接绑定到您拥有的巨大链接表。 “where”子句将限制为您提取的数据,并且仅提取一条记录,尽管该表单已绑定到大表。
因此,在“眼镜”按钮后面启动仅加载 1 条记录的表单的以下代码如下所示:
dim strWhere as String
strWhere = "ID = " & me!ID
docmd.OpenForm "frmCustomers",,,strWhere