我在表中有幾個字段,我希望用戶能夠使用通配符進行搜索。我真正需要的是一種通用搜索方法,它可以促進良好的用戶體驗(例如,不笨重;體面的速度;如果速度不快,則可能在後臺處理)。我知道通配符搜索是不受歡迎的。如果沒有可行的解決方案,我甚至可能會廢棄這個功能。我想提一下,我正在尋找更多的想法,而不是尋找特定的代碼。實現快速用戶界面通配符文本搜索(MS Access)的最佳方式是什麼?
下面是一個示例,顯示我迄今爲止所嘗試的內容。考慮與具有文本(此表的目的是無關緊要的)3個字段這個假設表:
tableWidget
ID | Field1 | Field2 | Field3 |
1 | jimmy john | waldo johnson | carmen smith |
2 | francis | david smith | NULL |
3 | yvonne | harry t. | mr. waldo |
4 | dr. waldo, md | hal | NULL |
所以我想找到它擁有「金都」的所有記錄。我的第一直覺是做這樣的事情:
SELECT ID, Field1, Field2, Field3
FROM tableWidget
WHERE ID IN
(
SELECT ID FROM tableWidget WHERE
Field1 LIKE '*waldo*' OR
Field2 LIKE '*waldo*' OR
Field3 LIKE '*waldo*'
)
這裏的問題是,隨着我跑的記錄數,這是非常緩慢的。我做的第二次嘗試是這樣的:
SELECT ID, Field1, Field2, Field3
FROM tableWidget
WHERE ID IN
(
SELECT ID FROM tableWidget
WHERE Field1 & Field2 & Field3 LIKE '*waldo*'
)
這仍然是緩慢的。我嘗試的第三種方法是創建一個Form_Timer事件,它循環訪問tableWidget並進行VBA比較。我的窗體的記錄是這樣的:
SELECT * FORM tableWidget
WHERE ID IN (SELECT * FROM tempTable)
的代碼追加到磁帶的片段看起來是這樣的」
With rsTableWidget
If Searching=True AND NOT .EOF Then
If INSTR(.Fields("Field1") & .Fields("Field2") & ".Fields("Field3"), "waldo") > 0 Then
rsTempTable.AddNew
rsTempTable.Fields("ID")=.Fields("ID")
rsTempTable.Update
mySubForm.Requery
End If
rsTableWidget.MoveNext
Else
Searching=False
rsTableWidget.Close: rsTempTable.Close
End If
End With
關於這個的好處是,它會在後臺更新。關於這一點的壞處是Form_Timer的每一次迭代都會閃爍,並且當它發現一條記錄時,mySubForm.requery方法會重置表單 - 不是非常用戶友好的。使用VBA代碼定期通過ev進行解析ERY字(用空格分隔),並創建一個搜索表:
tableSearchTerm:
ID | searchTerm
1 | jimmy
1 | john
1 | waldo
1 | johnson
1 | carmen
1 | smith
2 | francis
2 | david
2 | smith
etc...
我沒有試過,但我想的好東西將是我能指數SEARCHTERM 。而且我不必再使用通配符,因爲所有術語都與ID關聯。壞事是這張桌子會變得很快!
有沒有更好的方法?
我沒有看到使用通配符有什麼問題 - 它是您的情況所必需的,所以有其他選擇。如果你不得不在三個帶有OR的文本字段上進行操作,那麼速度方面就不會太多。就我個人而言,我沒有看到使用定時器的好處。你可以嘗試索引這三個字段 - 但是在你的seacrh術語的兩邊使用通配符,我不確定這是否會有所幫助。 – dbmitch
P.S.你的記錄數是多少,什麼是「極其緩慢」? – Andre