【问题标题】:How do I group a few fields to one indicator to reference later in Access VBA?如何将几个字段分组到一个指标中以便稍后在 Access VBA 中引用?
【发布时间】:2013-09-30 05:37:16
【问题描述】:

注意:我对 VBA 很陌生。 我正在尝试为我们的自定义过滤器创建一个 Or 功能,用户可以在其中选择过滤一个或另一个。我认为用户需要选择所有三个字段、比较和标准以使其成为一个选择,然后当 Or 按钮被点击时,将生成另一个选择,依此类推......直到点击 过滤按钮。我有过滤器上的代码,到目前为止它确实有效。

这只是我到目前为止的一个愚蠢的草稿 私有子 cmdOr_Click()

    Dim selectOr As Integer        

这里我不知道如何将这三个字段设置为一个指标

    selectOr = Field & Comparison & Criteria

    If IsNull(selectOr) Then
        MsgBox "All three fields, Comparison and Criteria must be selected", vbOKCancel, "Filter"
    Else

在这里我想增加我的selectOr,以便用户可以选择尽可能多的Or 选项

        selectOr 1
End Sub

我希望我是清楚的,如果不是请告诉我!谢谢!

到目前为止,这是我的过滤器按钮中的内容。注意:还有字典、集合等用到的模块。

Private Sub cmdOK_Click()
        Dim Filter As IFilter, filterString As String, filterComparison As String, FilterCriteria As String, sanitizedFilterCriteria As
    String, PrimaryFilter As String, primarySchema As String,
    primaryTable As String, primaryKey As String, targetTable As String,
    targetField As String, Target() As String, filterItem As
    ControlDefinition_Filter

            Me.Dirty = False

            'Gather data for the primary filter from the active form

            With XFormToFilter
                .ResetFilter
                Set .FilterBuilder.FormToFilter = FormToFilter

                PrimaryFilter = IIf(.BaseFilter = vbNullString, _
                                        .NullFilter, _
                                        .BaseFilter)
                primaryTable = .FilterTable
                primaryKey = .key
            End With

            With Me.RecordsetClone
                If .RecordCount > 0 Then
                    .MoveFirst
                    Do While Not .EOF
                        'Get the schema, table/view, and control targetted by the filter
                        Target = Split(.fields("Field").Value, ".")
                        targetTable = IIf(Left(Target(0), 6) = "SELECT", GetTableName(Target(0)), Target(0))
                        targetField = Target(1)

                        filterComparison = Nz(.fields("Comparison").Value, vbNullString)
                        FilterCriteria = Nz(.fields("Criteria").Value, vbNullString)

                        Set filterItem = filterDict.item(.fields("Field").Value)
                        If filterItem.HasCriteria Then 'Get the stored equivalent for the criterion if available
                            sanitizedFilterCriteria = filterItem.GetCriteriaValue(FilterCriteria)
                            If sanitizedFilterCriteria <> vbNullString Then _
                                FilterCriteria = sanitizedFilterCriteria
                        End If

                        filterString = _
                            CreateFilterString(.fields("FieldType"), targetField, targetTable, _
                                                filterComparison, FilterCriteria)
                        filterString = FilterRegExp(filterString)

                        If Filter Is Nothing Then
                            Set Filter = XFormToFilter.FilterBuilder
                            Filter.SetPrimaryFilter PrimaryFilter, primaryTable, primaryKey
                        End If

                        Filter.AddSubFilter "Filter" & .fields("ID"), _
                            filterString, targetTable, subformDict(targetTable)
                        .MoveNext
                    Loop
                End If
            End With

            If Not Filter Is Nothing Then
                Dim finalFilter As String
                Filter.OpenFilteredRecordset
                XFormToFilter.SetFoundRecords

                DoCmd.Close acForm, "Filter_Create_popup", acSaveNo
            End If
        'error handling is here   
 End Sub`

【问题讨论】:

  • 你说的不是很清楚。
  • 谢谢。现在怎么样?
  • 更好。那么您的问题是“我如何保证所有 3 个字段都已填写”或“我如何使用这些字段来查询数据库?”
  • 嗯...查询数据库是在 Filter 按钮中编码的,我想将此 Or 引用到 Filter 这样无论何时单击过滤器,它都会查看是否单击了 Or,如果是,则使用数据库中的表进行过滤。简单地说,我只是想让它就像任何其他 Ors 的功能一样。
  • 那么您想知道如何在查询中引用表单上的字段吗?

标签: ms-access stored-procedures vba filtering


【解决方案1】:

我有一个包含有限数量组合框的功能搜索(所以我不会动态添加它们。看看这对你有帮助。

Dim ctrl As Control
Dim search_string As String
search_string = ""
For Each ctrl In Me.Controls
    If ctrl.ControlType = acComboBox Then
        If ctrl.value <> "" Then
            If Len(search_string) > 1 Then
                search_string = search_string & " AND "
            End If
            search_string = search_string & LCase(Replace(ctrl.value, " ", "_"))
            If ctrl.Column(1) = "Number" Then
                search_string = search_string & " Like '*" & CStr(Me.Controls("Cval" & Right(ctrl.Name, 1)).value) & "*'"
            ElseIf ctrl.Column(1) = "Date" Then
                search_string = search_string & "=#" & Me.Controls("Cval" & Right(ctrl.Name, 1)).value & "#"
            Else
                search_string = search_string & " LIKE '*" & Me.Controls("Cval" & Right(ctrl.Name, 1)).value & "*'"
            End If
        End If
    End If
Next ctrl
DoCmd.OpenForm "frmSearchResults", acNormal, , search_string

它遍历控件并为 OpenForm 事件构建一个过滤器字符串。在我的案例中,我的包含额外的代码来帮助处理数据类型。

【讨论】:

  • 谢谢,有更好的想法会有所帮助。
猜你喜欢
  • 2017-10-23
  • 2021-02-14
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
相关资源
最近更新 更多