【发布时间】: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