目标:我想通过在文本框中输入一个字符串来搜索。这将显示所有的项目与或不移动。
我有两个数据库可以提取记录。
我的设置数据库有200条记录,我的主要库存有2000条记录。
Problem:每次我使用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问题:有什么方法可以加快搜索过滤器的速度吗?
发布于 2022-04-25 10:16:13
这并不奇怪--对于主记录集结果的每一行,都有一个单独的数据库查询。
要改进这一点,您需要将其组合成一个单独的查询,该查询具有逐个项目和从一个项目到另一个目录的左联接。
为此,您需要将两个表放到同一个数据库中。
进一步改进:不要立即搜索每个Change,而是等待几个100毫秒,然后搜索用户已经停止键入。Access VBA中的示例:https://stackoverflow.com/a/51608017/3820271
https://stackoverflow.com/questions/71993536
复制相似问题