【问题标题】:Accessing the first few items in a Combobox's rowsource before the whole list has populated (populated by SQL string)在填充整个列表之前访问 Combobox 行源中的前几个项目(由 SQL 字符串填充)
【发布时间】:2015-11-05 18:40:47
【问题描述】:

所以,我到处寻找,我很茫然。我正在建立一个访问数据库。

我有一个表格,上面有 18 个组合框。组合框行源是通过 vba 使用 SQL SELECT 语句设置的(参见下面的 SetSourcetbl sub)。这个想法是让用户根据他们选择的任何字段(组合框)“过滤”记录。更新组合框后,将为表单上的每个组合框在行源查询的末尾标记一条 SQL WHERE 语句,因此每个框都会更新为仅显示来自预定义查询 (qryListAll) 的符合用户“过滤器”的记录到目前为止已选择。

基本上,用户使用这些组合框来构建特定的 SQL 语句,稍后将用于填充“结果”表单。

每个字段允许零长度字符串。我已经对其进行了设置,以便如果他们构建的“过滤器”(SQL 语句)导致其中一个组合框在其列表中仅剩下一个不是零长度字符串的项目,则组合框设置为物品。如果他们构建的查询导致组合框列表中仅留下零长度字符串(或“单个空格”条目),则组合框变为红色。

我的问题是,在一个框中选择了一个项目并且其他框的所有行源都已使用新的 SQL 字符串更新后,检查每个框的 .ListCount = 1 是否需要很长时间,因为组合框在检查 .ListCount 属性之前必须完全填充(每个框的列表中有大约 10 到 1000 个项目)。

有什么方法(比如使用记录集的 .RecordCount 属性)可以知道组合框列表中是否有多个项目,而无需等待整个列表填充?我尝试将记录集设置为用于每个框的行源的相同 SQL 字符串,并使用 .RecordCount 属性或 .Move 属性(检查是否存在第二/第三项),但设置记录集所需的时间一样长到每个 SQL 字符串,因为它等待组合框的 .ListCount 加载。这是我的代码。请注意,SQLCriteria 是一个全局字符串(不好,我知道),它记录了迄今为止应用了哪些“过滤器”,而 FilterCounter 是一个全局长字符串,用于查看 SQL 字符串是否需要以“WHERE”或“AND”(基本上检查当前过滤器是否是迄今为止应用的第一个过滤器):

其中一个组合框的更新事件(它们本质上都是一样的):

Private Sub SelectOEMName_AfterUpdate()
    UpdateBrowseField Me.SelectOEMName
    Me!SelectFamilyName.SetFocus
    AutofillComboBoxes
End Sub


以及调用的相应函数:

Private Sub AutofillComboBoxes()
Dim Ctl As Control

For Each Ctl In Me.Controls
    If Ctl.ControlType = acComboBox Then
        If Ctl.ListCount = 1 Then
            If Ctl.ItemData(0) = "" Or Ctl.ItemData(0) = " " Or _
                                    IsNull(Ctl.ItemData(0)) Then
                Ctl.BackColor = REDTINT
            Else
                Ctl = Ctl.ItemData(0)
            End If
        End If
        Ctl.RowSource = ""
    End If
Next Ctl

SetSourcetbl
End Sub


UpdateBrowseField 子(在公共模块中):

Public Sub UpdateBrowseField(Ctl As Control)
   Dim FieldName As String
   FieldName = Replace(Ctl.Name, "Select", "")

   If Ctl <> "" And Ctl <> " " And IsNull(Ctl) = False Then
       If FilterCounter = 0 Then
           SQLCriteria = " WHERE " & FieldName & " = '" & Ctl.Value & "'"
       Else
           SQLCriteria = SQLCriteria & " AND " & FieldName & " = '" & Ctl.Value & "'"
       End If

       SetSourcetbl
       FilterCounter = FilterCounter + 1

       Ctl.BackColor = BLUETINT
       Ctl.BackTint = 1
       If Ctl.Enabled = True Then Ctl.SetFocus
   End If
End Sub



SetSourcetbl Sub(在公共模块中):

Public Sub SetSourcetbl()
   Dim CurrentForm As Form

   For Each CurrentForm In Application.Forms
       If CurrentForm.Visible And (CurrentForm.Name = "frmChooseReport" Or CurrentForm.Name = "frmBrowse") Then Exit For
   Next CurrentForm

   If CurrentForm.Name = "frmChooseReport" Or CurrentForm.Name = "frmBrowse" Then
       With CurrentForm.Controls
           !SelectOEMName.RowSource = "SELECT DISTINCT OEMName FROM (SELECT * FROM qryListAll" & SQLCriteria & ")"
           !SelectFamilyName.RowSource = "SELECT DISTINCT FamilyName FROM (SELECT * FROM qryListAll" & SQLCriteria & ")"
           !SelectModSubmod.RowSource = "SELECT DISTINCT ModSubmod FROM (SELECT * FROM qryListAll" & SQLCriteria & ")"
           !SelectFrameName.RowSource = "SELECT DISTINCT FrameName FROM (SELECT * FROM qryListAll" & SQLCriteria & ")"
        ' etc. etc. for all 18 comboboxes
       End With
   End If
End Sub

提前谢谢你!

【问题讨论】:

    标签: sql performance vba ms-access combobox


    【解决方案1】:

    尝试两件事:

    1) 只需使用 Me.ComboBox.Column(0,1) 进行检查即可。

    2) 使用记录集对象并向前一步,然后检查 rst.EOF

    Dim rst As ADODB.Recordset
    Set rst = New ADODB.Recordset
    rst.ActiveConnection = CurrentProject.Connection
    rst.CursorType = adOpenStatic
    rst.LockType = adLockOptimistic
    
    rst.Open "SELECT * FROM tblMyTable WHERE Condition=1"
    
    rst.MoveNext
    
    if rst.EOF then
    'Only one row in RST
    end if
    

    但我认为最好的选择是让所有组合框都未绑定,直到前一个组合框被填满。

    这样你一次只能加载一个。如果它们是顺序相关的,那么您可以假设只要一个返回 0 行,那么所有后续组合框都将具有 0 行。

    【讨论】:

    • 感谢您的回复。我刚试过.Column,它同样慢。在通过 .Column 访问值之前,似乎还必须填充组合框。我尝试了记录集方法,但无济于事。此外,组合框不限于序列。用户可以在任何框中开始。例如:用户可以在“制造”框中选择“丰田”之前转到“型号”框并选择“卡罗拉”。如果他们这样做了,模型框只会列出所有汽车制造商的所有模型。但是,如果他们从选择丰田开始,那么“型号”框中将只剩下丰田型号可供选择。
    • 可能是时候考虑获得一个 MS SQL Server 后端,然后您可以使用表值函数,这应该会看到显着的速度提升。
    • 感谢 JCro。是的,经过进一步调查,我认为我的速度限制可能来自运行实际查询以填充组合框,而不是直接来自组合框的填充。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    相关资源
    最近更新 更多