如何在更改时加快搜索过滤器 (VBA)
how to speedup search filter upon change (VBA)
Objective:我想实现我的搜索过滤器,而不会在搜索文本框中输入字符串后冻结或花费太多时间加载。这将显示所有有或没有移动的项目。
我有 2 个数据库,我从中提取了记录。
- 设置数据库(项目 Table) - item_id、item_desc、item_details、item_category、 item_cost
- 主库存数据库(库存Table) - item_id, item_movement, item_qty
- 两个数据库都已加密。
- item_id 已设置为索引(无重复)
我的设置数据库现在有 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 中的示例:
Objective:我想实现我的搜索过滤器,而不会在搜索文本框中输入字符串后冻结或花费太多时间加载。这将显示所有有或没有移动的项目。
我有 2 个数据库,我从中提取了记录。
- 设置数据库(项目 Table) - item_id、item_desc、item_details、item_category、 item_cost
- 主库存数据库(库存Table) - item_id, item_movement, item_qty
- 两个数据库都已加密。
- item_id 已设置为索引(无重复)
我的设置数据库现在有 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 中的示例: