【问题标题】:Using Combo Boxes to filter a Split Form使用组合框过滤拆分表单
【发布时间】:2014-01-17 19:18:26
【问题描述】:

我在 Access 中使用拆分表单,并且我有三 (3) 个下拉组合框: ReportedLOB(在此示例中使用) 帐户 立场类别

每个组合框都与所选的特定业务部门相关联,因此它限制了组合框中的项目数量。我正在为 ReportedLOB 使用以下代码:

 Private Sub Combo_Reported_LOB_Selection_Change()

' If the combo box is cleared, clear the form filter.
  If Nz(Me.Combo_Reported_LOB_Selection.Text) = "" Then
  Me.Form.Filter = ""
  Me.FilterOn = False

' If a combo box item is selected, filter for an exact match.
' Use the ListIndex property to check if the value is an item in the list.
  ElseIf Me.Combo_Reported_LOB_Selection.ListIndex <> -1 Then
  Me.Form.Filter = "[ReportedLOB] = '" & _
                 Replace(Me.Combo_Reported_LOB_Selection.Text, "'", "''") & "'"
  Me.FilterOn = True
  End If
 End Sub

假设下拉列表中有 4 个项目:MCD、Comp、GRD、DRR 当我选择 MCD 时,它会正确过滤 MCD 结果。但是,在与团队一起审查后,他们希望删除 MCD 的过滤器以再次获得所有结果,因此我创建了一个额外的表并将其加入,以便将 ALL 下拉项添加到列表中。

 SELECT DISTINCT dbo_ztblGAAP_Splits_TableA.ReportedLOB FROM
dbo_ztblGAAP_Splits_TableA WHERE (((dbo_ztblGAAP_Splits_TableA.BU)=[Forms]![Frm_Main]!
[Frm_Main_TextBox_Display_BU_Number_HIDDEN])) 
ORDER BY dbo_ztblGAAP_Splits_TableA.ReportedLOB
UNION ALL 
SELECT Top 10, "**ALL**" FROM  
dbo_tTbl_ADMIN_ForFiltering
ORDER BY ReportedLOB;

现在,百万美元的问题......当我从下拉列表中选择 ALL 时,它会将我的所有记录更改为 All 而不是给我所有报告的 LOB 的原始结果。有没有人处理过这个?我到处搜索,试图将这段代码拼凑在一起。

【问题讨论】:

  • UNION ALL 查询是Combo_Reported_LOB 的行源,对吗?如果是这样,当您在 Access 查询设计器中单独测试它作为新查询时,它是否返回正确的结果?一个问题……SELECT Top 10, "**ALL**"……我觉得不合适。
  • @HansUp,正确,并回答您的第二个问题 - 现在我的结果不起作用。我知道您曾就类似的问题发表过评论,我感谢您的指导。我创建了一个包含两列的表:ID 和 ReportedLOB,ID=1 和 ReportedLOB = ALL,我必须把我的连接都搞砸了,因为它失败了。正在努力
  • 我尝试按照 Microsoft 的示例 [LINK](support.microsoft.com/kb/210290) 了解如何在 Microsoft Access 中向 ComboBox 添加“全部”选项,但他们的文章在提供指导方面做得不够,除了指定代码。
  • 好的,您已经将目光投向了UNION 查询方法而不是回调函数,对吧?这是更好的选择,因为回调更具挑战性。以下评论中的查询是否为您提供了组合行源所需的内容。使用任何返回单行的表或查询来代替 Dualmake your own Dual table
  • @HansUp,是的,回调函数根本不起作用。因此,我将代码放在上面并且查询有效。当我转到表格并从列表中选择 ALL 时,我的表格空白。就像一切都消失了,白屏。我猜我的 Private Sub Combo_Reported_LOB_Selection_Change() 现在需要修改吗?

标签: ms-access combobox vba


【解决方案1】:

既然您的组合具有有效的行源查询,我建议您使用组合的更新后事件来驱动对表单的 .Filter 属性的更改。

Dim strFilter As String

With Me.Combo_Reported_LOB_Selection
    If IsNull(.Value) Or .Value = "**ALL**" Then
        ' If the combo box is cleared or ALL selected, clear the form filter.
        Me.Filter = vbNullString
        Me.FilterOn = False
    Else
        ' item other than ALL is selected, filter for an exact match.
        strFilter = "[ReportedLOB] = '" & _
            Replace(.Value, "'", "''") & "'"
        Debug.Print strFilter ' check this in Immediate window in case of trouble
                              ' you can use Ctrl+g to go to the Immediate window
        Me.Filter = strFilter
        Me.FilterOn = True
    End If
End With

请注意,该组合在更新后没有焦点,因此其.Text 属性不可用。所以我们改用.Value.Text 属性仅在您更改值时才真正有用。当您进行这些更改时,该组合具有焦点,因此.Text 可用。几乎任何其他时间,使用.Value

如果您确实希望在每次组合键击时不断更改.Filter,则必须针对组合键的更改事件调整上述代码。

【讨论】:

  • 上述代码效果很好(谢谢)。因此,当我过滤 ALL 时,它在拆分表中显示为 ALL 但不会更改实际 SQL 数据。这只是一种过滤机制。
  • 是的,只是一种过滤机制。但是更改表单的RecordSource 而不是Filter 并不难。那是你想要的吗?
  • 我希望 Lines of Business 保留名称而不是 ALL。我认为这会让用户感到困惑。
  • 噢! LOB 列在详细信息行中显示 ALL,而不是实际的 LOB 值……抱歉,我没有注意到这一点。但我不知道为什么会这样。
  • 您认为这是因为为该组合框构建的查询中的 SELECT DISTINCT 吗?我必须使用 Distinct 来限制下拉列表。不,不是这样。啊啊啊
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
相关资源
最近更新 更多