Access中的过滤器似乎是“粘性的”' - 当您使用VBA设置一个时,您可以删除它但不能设置另一个。
我有一个用于跟踪学生分数的Access数据库。它包含表格subjects
,teachers
,students
,tests
和test_results
。每个结果记录都是指学生和考试。
我有一个显示测试的表单,其子表单显示结果。我想使用各种标准搜索测试,因此我在(外部)表单标题中添加了一些未绑定的字段,并将其标记为' name',' subject','开始日期&# 39;,'结束日期'和老师'。我添加了一个'过滤器'按钮和'重置'按钮。每个搜索字段都是可选的,因此可以使用任何组合:任何左侧空白都将被忽略。
这是过滤器按钮的代码:
Me.Filter =
"([Forms]![testWithResults]![Text102] IS NULL OR test_name Like '*' & [Forms]![testWithResults]![Text102] & '*')
AND ([Forms]![testWithResults]![Combo89] IS NULL OR teacher = [Forms]![testWithResults]![Combo89])
AND ([Forms]![testWithResults]![Combo52] IS NULL OR subject = [Forms]![testWithResults]![Combo52])
AND ([Forms]![testWithResults]![Text83] IS NULL OR [Forms]![testWithResults]![Text85] IS NULL OR test_date BETWEEN [Forms]![testWithResults]![Text83] AND [Forms]![testWithResults]![Text85])"
Me.FilterOn = True
这是重置按钮的代码:
Me.FilterOn = False
Me.Combo89 = Me.Combo89.DefaultValue
Me.Combo52 = Me.Combo52.DefaultValue
Me.Text83 = Me.Text83.DefaultValue
Me.Text85 = Me.Text85.DefaultValue
Me.Text102 = Me.Text102.DefaultValue
当我第一次加载表单时,我第一次搜索它时一切正常。过滤器按钮按预期工作,重置按钮清空所有字段并显示所有记录。 但是当我尝试再次使用新条件进行搜索时,我只是再次获得旧结果。要使其正常工作,我必须关闭并重新打开表单。
当我用Me.Filter
替换DoCmd.ApplyFilter
时,它仍然在第一次完美运行,但第二次我会收到错误&#39;表达式太复杂而无法评估&#39;。< / p>
答案 0 :(得分:1)
由于Access抱怨Filter
字符串太复杂,请简化它。
您希望在文本框中添加Filter
条件。在您创建Filter
字符串时,您的代码可以检查该文本框是否为空。如果它不是Null,则根据文本框的值添加条件。如果它为空,Filter
可以简单地忽略该文本框。
Dim strFilter As String
With [Forms]![testWithResults]
If Not IsNull(![Text102]) Then
strFilter = strFilter & " AND test_name Like '*" & ![Text102] & "*'"
End If
If Not IsNull(![Combo89]) Then
strFilter = strFilter & " AND teacher = " & ![Combo89]
End If
If Not IsNull(![Combo52]) Then
strFilter = strFilter & " AND subject = " & ![Combo52]
End If
If Not (IsNull(![Text83]) Or IsNull(![Text85])) Then
strFilter = strFilter & " AND test_date BETWEEN " & Format(![Text83], "\#yyyy-m-d\#") _
& " AND " & Format(![Text85], "\#yyyy-m-d\#")
End If
End With
If Len(strFilter) > 0 Then
' use Mid() to discard leading " AND "
Debug.Print Mid(strFilter, 6) '<- view this in Immediate window; Ctrl+g will take you there
Me.Filter = Mid(strFilter, 6)
Me.FilterOn = True
Else
MsgBox "no conditions for Filter"
End If