表单加载和过滤问题

时间:2011-06-17 09:35:56

标签: ms-access vba access-vba

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

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

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

问题是,当执行Me.sub.SourceObject = "subResultType_1"时,子表单将显示所有记录。然后它被过滤掉了。但我想要的是子窗体在被过滤之前不显示任何内容。这是因为我的程序将在相当慢的网络上用作前端/后端。

PS:我认为当带有WHERE部分的SQL子句或带有过滤器的表单时,它会在后端进行过滤。因此,只有少量数据将在网络上传输到前端。如果我错了,请告诉我......

4 个答案:

答案 0 :(得分:3)

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

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

这会显示一条空白记录,其中某些字段为空,其他字段为0(视情况而定)。我发现它在美容上比替代品更具吸引力。

当我准备好显示过滤集时,我更改了Recordsource而不是设置过滤器。

答案 1 :(得分:2)

如果要在显示任何结果之前强制用户过滤表单,请不要将SubForm绑定到查询(将表单的RecordSource保留为空)并在代码中执行此操作:您可以简单地设置在“搜索”按钮单击事件中:

Me.Sub.RecordSource = "subResultType_1"

更好的是,使Subform不可见(在设计模式下设置其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子句,如下所示:

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

答案 2 :(得分:2)

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

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

如果是,您应该知道网络Access数据库实际上只适用于快速,可靠,硬连线的LAN。如果满足以下任一条件,则应将数据存储更改为Access以外的其他条件。

  1. 广域网(WAN)
  2. 无线网络连接
  3. 有线连接到不可靠的局域网(LAN)
  4. 这些情况下的常见风险是连接断开可能会损坏您的Access数据库。它可能不会在每次断开连接时发生,但最终您损坏您的Access数据库。

答案 3 :(得分:0)

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

Access SQL: WHERE clause