我在访问中有一个连续的表单,标题中有3个组合框来过滤数据。目前我有一个相当冗长的嵌套IF来检查正在使用多少个组合框并覆盖所有8个渗透。有3个盒子,它不会太坏,但我可能会添加第4个甚至第5个,在这种情况下它会变得荒谬。
是否有更简单的方法为连续表单设置组合框过滤器?
当前代码
Private Sub filters()
Dim fstr As String, rgS As String, piS As String, hcS As String
rgS = "research_group_id = " & Me.fRG
piS = "pi_id = " & Me.fPI
hcS = "healthcat_id = " & Me.fHC
If IsNull(Me.fRG) Then
If IsNull(Me.fPI) Then
If IsNull(Me.fHC) Then
' Do Nothing
Else
fstr = hcS
Call filton(Me.Name, fstr)
End If
Else
If IsNull(Me.fHC) Then
fstr = piS
Call filton(Me.Name, fstr)
Else
fstr = piS & " AND " & hcS
Call filton(Me.Name, fstr)
End If
End If
Else
If IsNull(Me.fPI) Then
If IsNull(Me.fHC) Then
fstr = rgS
Call filton(Me.Name, fstr)
Else
fstr = rgS & " AND " & hcS
Call filton(Me.Name, fstr)
End If
Else
If IsNull(Me.fHC) Then
fstr = rgS & " AND " & piS
Call filton(Me.Name, fstr)
Else
fstr = rgS & " AND " & piS & " AND " & hcS
Call filton(Me.Name, fstr)
End If
End If
End If
End Sub
更新每个组合框后会触发上述代码。
Public Function filton(frmname As String, fstr As String)
With Forms(frmname)
.FilterOn = False
.Filter = fstr
.FilterOn = True
End With
End Function
答案 0 :(得分:1)
您可以在组合框上创建After Update事件。以下是3层层次结构的示例,其中父级和子级组合框在加载时被禁用
Private Sub Grandfather_Combo_AfterUpdate()
Parent_Combo.RowSource="SELECT ...."
Parent_Combo.Enabled=True
Child_Combo.Enabled=False ' the child is invalid until the parent is defined
End Sub
Private Sub Parent_Combo_AfterUpdate()
Child_Combo.RowSource="SELECT ...."
Child_Combo.Enabled=True
End Sub
这是单记录表单,但如果你想要更改组合框,应该让你开始。
如果它是您想要更改的记录过滤器,则使用相同的事件,而是更改相关字段的过滤器变量,然后调用公共子例程以从所有过滤器变量的组合重新创建表单过滤器。
答案 1 :(得分:1)
将每个条件" AND "
添加到您的过滤字符串中。然后,从该字符串中丢弃前导" AND "
。这种方法应该很容易适应任何数量的标准。
不确定我是否在下面的代码中正确匹配了所有内容,但希望模式清晰。
If Not IsNull(Me.fRG) Then
fstr = fstr & " AND " & rgS
End If
If Not IsNull(Me.fPI) Then
fstr = fstr & " AND " & piS
End If
If Not IsNull(Me.fHC) Then
fstr = fstr & " AND " & hcS
End If
If Len(fstr) > 0 Then
' discard leading " AND "
fstr = Mid(fstr, 6)
End If