【问题标题】:Filter Property on Access form not working访问表单上的过滤器属性不起作用
【发布时间】:2014-09-13 17:26:08
【问题描述】:

在过去的几天里,我一直在尝试对 Access-2010 表单应用过滤器。表单的记录源是一个表格。过滤器是由表单上的一系列按钮创建的。以下是构建过滤器的按钮

列表按钮的事件过程:

Private Sub btnListInterfaceLog_Click()
    Dim List As String
    List = StartList()
End Sub

StartList() 函数代码

Private Function StartList()

   Dim strWhereClause As String
   strWhereClause = MakeWhere()  
   MsgBox strWhereClause

   Me.FilterOn = True
   Me.Filter = strWhereClause
   Me.Requery

End function

MakeWhere() 的代码

Private Function MakeWhere() As String

   Dim whereClause As String
   whereClause = ""

   If Me![cboinstrument].Enabled = True And Me![cboinstrument] <> "" Then
       whereClause = RvAppendCondition(whereClause, "InstrumentName", "String", "=", Me![cboinstrument])
   End If

   If Me![cboFolder].Enabled = True And Me![cboFolder] <> "" Then
    whereClause = RvAppendCondition(whereClause, "folder", "String", "=", Me![cboFolder])
   End If

   If Me![BatchFrom].Enabled = True And Me![BatchFrom] > 0 And Me![BatchTo].Enabled = True And Me![BatchTo] > 0 Then
    whereClause = RvAppendCondition(whereClause, "BatchID", "Number", "=", Me![BatchFrom], Me![BatchTo])
   End If

   If Me![AnalyzedFrom].Enabled = True And Me![AnalyzedFrom] > 0 And Me![AnalyzedTo].Enabled = True And Me![AnalyzedTo] > 0 Then
    whereClause = RvAppendCondition(whereClause, "Dateofbatch", "Date", "=", Me![AnalyzedFrom], Me![AnalyzedTo])
   End If

   MakeWhere = whereClause

 End Function

RvAppendCondition 函数接受一个给定的字符串并向 where 语句添加一个新参数。它已经过多次测试并且有效,因此您不必过多关注它。如果被问到,我可以包含代码以供参考。

例如:如果我所做的只是选择仪器名称(来自:组合框)并将其余部分留空然后按列表,strWhereClause 将 msgbox“[InstrumentName] = 'ICPMS'”,当我转到主窗体的属性,过滤器下没有列出任何内容。当我按下列表时,如何使一个值出现在过滤器属性中。 (旁注:所有函数都有错误语句,我把它们取出来使它们更短)

【问题讨论】:

  • 不是过滤器,你能改变记录集吗?例如stackoverflow.com/questions/13088701/…
  • 记录集的where语句可以是动态的吗?
  • 当然,只需将表单的记录源设置为 sql 字符串即可。如果没有好的索引,它可能会很慢。
  • 我通常在设置Filter字符串后设置FilterOn = true。你知道你没有从StartList返回任何东西吗?
  • 您要在此搜索的表单或其他表单上设置过滤器吗? Me.Filter = strWhereClausefrmInstrumentInterface 还是“父表单”?

标签: sql sql-server vba ms-access filter


【解决方案1】:

这是您的代码应该是什么。

Private Sub btnListInterfaceLog_Click()
   Dim strWhereClause As String
   strWhereClause = MakeWhere()  
   MsgBox strWhereClause

   Me.Filter = strWhereClause
   Me.FilterOn = True
End Sub

Private Function MakeWhere() As String

   Dim whereClause As String

   If Me![cboinstrument].Enabled = True And Me![cboinstrument] <> "" Then
        whereClause = whereClause & "(InstrumentName = '" & Me![cboinstrument] & "') AND "
   End If

   If Me![cboFolder].Enabled = True And Me![cboFolder] <> "" Then
        whereClause = whereClause & "(folder = '" & Me![cboFolder] & "') AND "
   End If

   If Me![BatchFrom].Enabled = True And Me![BatchFrom] > 0 And Me![BatchTo].Enabled = True And Me![BatchTo] > 0 Then
        whereClause = whereClause & "(BatchID BETWEEN " & Me![BatchFrom] & " AND " & Me![BatchTo] & ") AND "
   End If

   If Me![AnalyzedFrom].Enabled = True And Me![AnalyzedFrom] > 0 And Me![AnalyzedTo].Enabled = True And Me![AnalyzedTo] > 0 Then
        whereClause = whereClause & "(Dateofbatch BETWEEN " & Format(Me![AnalyzedFrom], "\#mm\/dd\/yyyy\#") & _
                                    " AND " & Format(Me![AnalyzedTo], "\#mm\/dd\/yyyy\#") & ") AND "
   End If

   MakeWhere = Left(whereClause, Len(whereClause) - 5)

 End Function

【讨论】:

  • 我实现了这段代码,但Filter属性中仍然没有字符串。我将 strWhereclause 用 msgbox 输入,它是“[InstrumentName] = 'ICPMS' AND [BATCHID] BETWEEN 100 AND 100”,batchid 设置为 100 到 100,FROM:组合框是 ICPMS
  • 但是主页选项卡中的切换过滤器按钮被突出显示,所以可能有一个过滤器,但由于某种原因它似乎没有影响记录源?
  • 尝试编辑的代码,您的 RvAppendCondition 没有放置正确的括号。这在多个标准中非常重要。
  • 好的,现在 strwhere 子句是 "(InstrumentName = 'ICPMS') AND (Batchid BETWEEN 100 AND 100)" ,切换过滤器按钮打开,在主窗体上,过滤器属性为空,显示的记录与条件不匹配,并且 Load 属性的过滤器为 NO(如果这很重要?)。似乎我无法在主窗体的过滤器属性中显示任何内容。
  • 可能是因为您在使用 Me.Requery 时重新应用了查询。尝试删除那行代码(如我的编辑所示)。
猜你喜欢
  • 2012-11-25
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
  • 2022-01-11
相关资源
最近更新 更多