我在做一个搜索表单。最重要的是,有几个组合框供用户选择标准组合。然后我构造一个Where字符串来过滤显示结果的子表单。
Me.sub.SourceObject = "subResultType_1"
Me.sub.Form.Filter = strWhere
Me.sub.Form.FilterOn = True
此代码位于“搜索”按钮的点击事件中。
问题是,当执行Me.sub.SourceObject = "subResultType_1"
时,子表单将显示所有记录。然后它被过滤掉了。但我想要的是子窗体在被过滤之前不显示任何内容。这是因为我的程序将在相当慢的网络上用作前端/后端。
PS:我认为当带有WHERE部分的SQL子句或带有过滤器的表单时,它会在后端进行过滤。因此,只有少量数据将在网络上传输到前端。如果我错了,请告诉我......
答案 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以外的其他条件。
这些情况下的常见风险是连接断开可能会损坏您的Access数据库。它可能不会在每次断开连接时发生,但最终您将损坏您的Access数据库。
答案 3 :(得分:0)
我认为你在那里回答了自己的问题。 where子句将过滤SQL服务器上的查询。