2011-06-17 87 views
3

我在做一个搜索表单。最重要的是,有几个组合框供用户选择一个标准组合。然后我构造一个Where字符串来筛选显示结果的子表单。表单加载和过滤器问题

Me.sub.SourceObject = "subResultType_1" 
Me.sub.Form.Filter = strWhere 
Me.sub.Form.FilterOn = True 

此代码位于“搜索”按钮的单击事件中。

问题是,当执行Me.sub.SourceObject = "subResultType_1"时,子窗体将显示所有记录。然后它被过滤。但是我想要的是子窗体在被过滤之前什么都不显示。这是因为我的程序将在相当慢的网络上用作前端/后端。 PS:我认为当WHERE部分的SQL子句或带有过滤器的表单过滤时,它会在后端被过滤。所以只有少量的数据会在网络上传输到前端。如果我错了,告诉我...

回答

3

另一种方法是我经常使用的一种方法,即使用记录源保存子窗体,从而生成一个空白的不可编辑记录。我通常使用的SQL是这样的:

SELECT TOP 1 Null As Field1, Null As Field2, 0 As Field3 
    FROM MyTable; 

这显示与空值的某些字段,0为别人一个空白记录(如适用)。我觉得它在美观方面比替代品更有吸引力。

当我准备好显示筛选集时,我更改记录源而不是设置筛选器。

+0

我现在所做的最像你的解决方案:我向子表单添加了一个“空白”过滤器:id ='',而不是空白记录源。 – darkjh 2011-06-20 07:23:55

+0

与我的不同之处在于你的回报没有行,而我的回报是在不可编辑的空行上。我认为最好是显示行,因为它可以帮助用户了解他们在执行搜索时看到的内容,而空行不会(也不会显示空子表单控件,这就是为什么我不使用它方法)。 – 2011-06-20 18:55:38

+0

另一个问题是,当我这样做时,设置一个'空白'过滤器或记录源,下次我使用这个表单时,它会记住上次的过滤器,而不是空白的过滤器......如何防止它记住它? – darkjh 2011-06-21 06:59:19

2

如果您希望强制用户在显示任何结果之前过滤窗体,请不要将子窗体绑定到查询(将窗体的RecordSource留空)并执行它的代码,而不是:你可以简单的设置,在您的搜索按钮单击事件:

Me.Sub.RecordSource = "subResultType_1" 

一些好的是,使子窗体不可见(设置在设计模式下其Visible = No属性),并显示它一旦用户点击搜索:

Private Sub btSearch_Click() 
    Me.Sub.RecordSource = "subResultType_1" 
    Me.Sub.Visible = True 
End Sub 

如果您想要做更多复杂的过滤器,你也可以这样做:

Private Sub btSearch_Click() 
    Me.Sub.RecordSource = "SELECT * FROM subResultType_1 WHERE " + strWhere 
    Me.Sub.Visible = True 
End Sub 

像这样将允许你构建复杂的代码WHERE查询基于来自用户的一串输入。
例如,您可以有多个文本框,用户可以输入相对于特定字段的信息来缩小搜索范围。

然后,从这些文本框的内容构建WHERE子句,像这样:

变成这样,一旦用户输入一些过滤条件:

+0

如果事情很慢,您甚至不必将窗体加载到子窗体控件中,直到需要为止。 – Fionnuala 2011-06-17 10:25:24

+0

谢谢..我喜欢你的主题。你做的名单是一个连续的形式吗? – darkjh 2011-06-20 06:22:34

+0

@darkjh:谢谢。主要形式是带有标题的单个表单。数据以数据表的形式显示。我使用的是Access 2010,所以主题很不错。 – 2011-06-20 07:02:48

0

我想你在那里回答了你自己的问题。 where子句将过滤SQL服务器上的查询。

Access SQL: WHERE clause

+0

我的后端也是一个accdb文件..所以我徘徊在查询被过滤的地方。但似乎我认为是正确的。 – darkjh 2011-06-20 07:21:56

+0

如果后端是ACCDB/MDB,则过滤发生在本地工作站上,因为在另一端没有服务器。尽管如此,这并不意味着它很慢或效率低下 - 缓存对于加快速度可能会做很多事情。 – 2011-06-23 01:42:06

2

你说:“我的程序将被用作前/后端相当缓慢的网络上”。

什么是您的后端存储数据库?它是一个Access(Jet/ACE)数据库文件吗?

如果是的话,您应该知道,网络访问数据库实际上只适用于快速,可靠的硬连线局域网。如果以下任何一种情况属实,则应将数据存储更改为Access以外的其他内容。

  1. 广域网(WAN)
  2. 无线网络连接
  3. 有线连接不可靠的局域网(LAN)

共同危险在这些情况下是被丢弃的连接可以损坏您的Access数据库。它可能不会发生在每一个下降的连接,但最终你损坏你的Access数据库。

+0

它是有线网络。但这里的工厂没有服务员。所有的网络都位于300千米外的总部...... – darkjh 2011-06-20 06:18:41

+1

@darkjh听起来像一个广域网,这不适合访问。但是如果将数据存储移动到客户端 - 服务器数据库并将表链接更改为ODBC到服务器,则Access应用程序可以正常工作。如果您的组织不允许进行此更改,请确保您具有可靠的备份策略,以便在由于连接断开而导致Access后端损坏时将数据丢失风险降至最低。 – HansUp 2011-06-20 06:32:57

+1

好吧,备份计划,嗯..听起来像是我会举办的另一个问题... – darkjh 2011-06-20 06:58:28