Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 如何将几个字段分组到一个指标,以便稍后在Access VBA中引用?_Ms Access_Stored Procedures_Vba_Filtering - Fatal编程技术网

Ms access 如何将几个字段分组到一个指标,以便稍后在Access VBA中引用?

Ms access 如何将几个字段分组到一个指标,以便稍后在Access VBA中引用?,ms-access,stored-procedures,vba,filtering,Ms Access,Stored Procedures,Vba,Filtering,注意:我是VBA的新手。 我正在尝试为我们的自定义过滤器创建一个或功能,用户可以选择过滤一个或另一个。我认为用户需要选择所有三个字段,比较和标准使其成为一个选择,然后当点击或按钮时,将生成另一个选择,依此类推。。。直到单击过滤器按钮。我有过滤器上的代码,它到目前为止确实有效 到目前为止,这只是一份愚蠢的草稿 专用子cmdOr_Click() 我不知道如何将这三个字段设置为一个指标 在这里,我想增加我的选择器,以便用户可以选择尽可能多的或选项 我希望我是清楚的,如果没有请让我知道!谢谢 这是我在

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

到目前为止,这只是一份愚蠢的草稿 专用子cmdOr_Click()

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

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

我希望我是清楚的,如果没有请让我知道!谢谢

这是我在我的过滤器按钮到目前为止。注意:使用了字典、集合和其他模块

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`
Private Sub cmdOK\u Click()
Dim Filter作为IFilter、filterString作为String、filterComparison作为String、FilterCriteria作为String、Sanitized FilterCriteria作为String
字符串,PrimaryFilter作为字符串,primarySchema作为字符串,
primaryTable作为字符串,primaryKey作为字符串,targetTable作为字符串,
targetField作为字符串,Target()作为字符串,filterItem作为
控制定义过滤器
我,肮脏=虚假
'从活动窗体收集主筛选器的数据
使用XFormToFilter
.ResetFilter
Set.FilterBuilder.FormToFilter=FormToFilter
PrimaryFilter=IIf(.BaseFilter=vbNullString_
.NullFilter_
(基本过滤器)
primaryTable=.FilterTable
primaryKey=.key
以
和我一起
如果.RecordCount>0,则
.先走一步
做而不做
'获取筛选器针对的架构、表/视图和控件
目标=拆分(.fields(“Field”).Value“.”)
targetTable=IIf(左(目标(0),6)=“选择”,GetTableName(目标(0)),目标(0))
targetField=目标(1)
filterComparison=Nz(.fields(“Comparison”)。值,vbNullString)
FilterCriteria=Nz(.fields(“Criteria”)。值,vbNullString)
设置filterItem=filterDict.item(.fields(“Field”).Value)
如果filterItem.HasCriteria,则“获取存储的标准等效项(如果可用)”
sanitizedFilterCriteria=filterItem.GetCriteriaValue(FilterCriteria)
如果sanitizedFilterCriteria vbNullString,则_
过滤标准=净化过滤标准
如果结束
过滤器字符串=_
CreateFilterString(.fields(“FieldType”)、targetField、targetTable、_
过滤器比较,过滤器标准)
filterString=FilterRegExp(filterString)
如果过滤器什么都不是,那么
设置Filter=XFormToFilter.FilterBuilder
Filter.SetPrimaryFilter PrimaryFilter,primaryTable,primaryKey
如果结束
Filter.AddSubFilter“Filter”和字段(“ID”)_
filterString,targetTable,子表单dict(targetTable)
.下一步
环
如果结束
以
如果不是,那么过滤器什么都不是
将最终过滤器设置为字符串
Filter.OpenFilteredRecordset
XFormToFilter.SetFoundRecords
DoCmd.关闭acForm,“过滤器\创建\弹出窗口”,acSaveNo
如果结束
“错误处理在这里
端接头`

我有一个和功能搜索,只有有限数量的组合框(因此我不会动态添加它们。请看,这对您有所帮助

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
Dim ctrl作为控件
Dim search_字符串作为字符串
搜索字符串=“”
对于Me.Controls中的每个ctrl键
如果ctrl.ControlType=acComboBox,则
如果ctrl.value为“”,则
如果Len(搜索字符串)>1,则
搜索字符串=搜索字符串&“和”
如果结束
search\u string=search\u string&LCase(替换(ctrl.value,“,”))
如果ctrl.列(1)=“数字”,则
search_string=search_string&“Like'*”&CStr(Me.Controls(“Cval”&Right(ctrl.Name,1)).value)&“*”
ElseIf ctrl.列(1)=“日期”然后
search_string=search_string&“=#”&Me.Controls(“Cval”&Right(ctrl.Name,1)).value&“#”
其他的
search\u string=search\u string&“LIKE'*”&Me.Controls(“Cval”&Right(ctrl.Name,1)).value&“*”
如果结束
如果结束
如果结束
下一个ctrl键
DoCmd.OpenForm“frmSearchResults”,acNormal,搜索字符串

它通过控件循环,并为OpenForm事件生成一个筛选器字符串。我的示例中包含了其他代码来帮助处理数据类型。

您不清楚。谢谢。现在怎么样?更好。您的问题是“如何保证所有3个字段都已填充”或“如何使用这些字段查询数据库?”嗯…查询数据库是在过滤器按钮中编码的,我想引用这个或过滤器,这样每当单击过滤器时,它都会查看是否单击了或,如果是,那么它会使用数据库中的表进行过滤。简单地说,我只是想让它与任何其他Ors的功能一样。所以你想知道如何引用fie吗查询中表格上的lds?谢谢,这有助于更好地了解。
        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`
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