2013-01-02 36 views
0

我想创建一个查询,它通过一个表单获取字段参数。为此,我创建了一个带有组合框的表单并通过下拉选项来选择值,这将在默认值已设置为空的各个不可见文本字段中填充文本值。现在在我的查询中,我将列的条件定义为iif(isNull([Forms]![Conditions]![text_on_form]),[column_in_table],[Forms]![Conditions]![text_on_form])。我已经完成了where子句来自表单的所有列。我试着运行这个。结果似乎是随机的。它适用于三列,但是当我玩弄它时,它给了我空白的结果集。谁能告诉我我做错了什么?或者如果有更好的方法来在Access中通过表单实现查询。通过形式查询Access 2010中的多个字段

+0

我不知道上述解决方案有什么问题,但我已经为它创建了一个解决方法。为where子句中的每一列创建一个新列,并将其定义为: new_column:[field] = [Forms]![Conditions]![text_on_form] or [Forms]![Conditions]![text_on_form] is null 这似乎解决了这个问题,但我想知道为什么以前的方法无法正常工作,而且我想知道如何将表单中的复选框与使用第二种方法的表中是/否列。任何帮助表示赞赏 –

回答

0

这听起来像你正在尝试创建动态SQL。下面是在VBA我一般喜欢的方式:

Dim SQL As String 

SQL = "SELECT tblName.* From tblName WHERE (1=1)" 

If Not IsNull(Me.combo1) Then 
    SQL = SQL & " And ([Field1] Like ""*" & Me.combo1 & "*"")" ' I am using like statements here, but that is because this is a search tool. 
End If 

If Not IsNull(Me.combo2) Then 
    SQL = SQL & " And ([Feild2] Like ""*" & Me.combo2 & "*"")" 
End If 

Docmd.RunSQL SQL 

End Sub 

基本上,只有当用户已经把一个值到文本框/组合框或任何添加到SQL语句。 “Where(1 = 1)”是为了说明所有字段为空的情况。

玩这个概念来创建你的SQL语句。避免使用不可见的文本框来存储数据,它通常意味着你做错了什么,并会得到不同的结果(这个论坛上的其他人可以比我更好地解释这是为什么)。

+0

非常感谢您提供这些信息!我在动态查询的表单中也有很多文本框。我们如何将表单值和列值与使用VB的文本框相匹配? –

+0

我不确定我了解你的问题。如果你描述你正在努力完成什么,这可能会有所帮助。你是否使用Access作为后端(Access是否存储你的表)?你的表单是绑定在一张桌子上的吗?您需要使用我提供的代码,但一般情况下,将表单值替换为“me.combo1”,将列标题替换为“[Field1]”。 – JBL

+0

我使用Access作为我的后端。它是一个平坦的表格。我用来生成查询的表单并未绑定到任何表格。我试图修改查询条件,但问题太多了。问题与VB是,我不明白VB.I我很难找出代码在做什么。我需要一个代码,可以从invi文本框中获取文本值,其形式可以在选择下拉列表中的值时填充。我也有或没有字段,我通过表单作为复选框。无论如何,如果你能帮我编写这个动态查询,我会很感激 –

-1

只需使用Like运算符即可。把它放在查询中的条件字段Like "\*" & Forms![Form_Name]![Form_Field] & "\*" - 这告诉它如果该字段为空(或空)并且与该字段中的任何内容匹配,就会得到任何内容。这可能不是你想要的。应该指出的是,它将返回任何与其中的文本字符串。例如:如果你输入“the”,它会返回系绳,这些,theses,温度计(任何带有“the”字样的东西。它适用于多字或更长的字符串,可以更准确地匹配,但它适用于一个搜索查询,因为通常有一组人眼寻找结果和错误的结果不是一个大问题。