如何在更改时加快搜索过滤器 (VBA)

how to speedup search filter upon change (VBA)

Objective:我想实现我的搜索过滤器,而不会在搜索文本框中输入字符串后冻结或花费太多时间加载。这将显示所有有或没有移动的项目。

我有 2 个数据库,我从中提取了记录。

我的设置数据库现在有 200 条记录,我的主库存有 2000 条记录。

问题:每次我使用textbox_change过滤我的数据时,它一直冻结并且需要时间来过滤记录。

我的代码:

Private Sub txtSearchWindow_Change()

Call OpenDbSettings 'OPEN DATABASE
DbName = DatabaseLoc & "DATABASE\MAIN INVENTORY.accdb"
Call OpenDbInventory(DbName)

MYSQL = "SELECT item_id, item_desc, itm_details, itm_category, item_cost FROM ITEM " & _
"WHERE (item_id LIKE '%" & Replace(.txtSearchWindow.Text, "'", "''") & "%' " & _
"OR item_name LIKE '%" & Replace(.txtSearchWindow.Text, "'", "''") & "%' " & _
"OR item_category LIKE '%" & Replace(.txtSearchWindow.Text, "'", "''") & "%')"
MYSQL = MYSQL & " ORDER BY itm_category, itm_name"

Set rsItem = dbSettings.Execute(MYSQL)

If rsItem.EOF Then
Else
    Do Until rsItem.EOF = True
        Set li = .lvSearchWindow.ListItems.Add(, , rsItem.Fields("item_id"))
            li.SubItems(1) = Replace(rsItem.Fields("item_name"), "''", "'")
            li.SubItems(2) = Replace(rsItem.Fields("item_category"), "''", "'")

            
        MYSQL = "SELECT item_id, SUM(item_qty) AS NewItmQty FROM INVENTORY"
        MYSQL = MYSQL & " WHERE item_id = '" & rsItem.Fields("itm_id") & "'"
        MYSQL = MYSQL & " GROUP BY item_id"
        
        Set rsInventory = dbInventory.Execute(MYSQL)
        
        If rsInventory.EOF Then
            li.SubItems(3) = "0"
        Else
            li.SubItems(3) = FormatNumber(rsInventory.Fields("NewItmQty"), 0, , vbTrue)
        End If
    
        rsInventory.Close
        Set rsInventory = Nothing
        
        li.SubItems(4) = FormatNumber(rsItem.Fields("itm_cost"), 2, , vbTrue)
        li.SubItems(5) = Replace(rsItem.Fields("itm_details"), "''", "'")
    rsItem.MoveNext
Loop
End If

rsItem.Close 'CLOSE RECORDSET
Set rsItem = Nothing

dbInventory.Close 'CLOSE DATABASE
Set dbInventory = Nothing

dbSettings.Close 'CLOSE DATABASE
Set dbSettings = Nothing

End Sub

问题: 无论如何我可以加快我的搜索过滤器

这很慢并不奇怪 - 您对主记录集结果的每一行都有一个单独的数据库查询。

要改进这一点,您需要将其合并到一个查询中,该查询具有 GROUP BY Item 和从 ITEM 到 INVENTORY 的左联接。

为此,您需要将两个表放入同一个数据库中。

进一步改进:不要立即搜索每个 Change,而是等待几 100 毫秒,然后在用户停止输入后搜索。 Access VBA 中的示例: