我正在创建一个数据库来跟踪存档中的期刊,我所需要使用的只是 Microsoft Access 2007-2016。我几乎必须自学如何使用 Access 的大部分内容,因此如果我遗漏了一些明显的内容,我提前表示歉意。
此查询的目标是拥有一个搜索多个字段的搜索功能,但不需要搜索者知道所使用的确切标点符号(在这种情况下,如果搜索词中的标点符号完全正确,它将起作用,或者如果搜索词中根本没有标点符号)。
不幸的是,当我尝试运行我的代码时,我收到一条错误消息,显示“此表达式输入不正确,或者它太复杂而无法计算。例如,数字表达式可能包含太多复杂的元素。尝试通过将表达式的一部分分配给变量来简化表达式。”
问题是,我不知道该怎么做...任何具体的建议,甚至教程的链接将不胜感激!
通过复制其他论坛帖子上建议的一些功能,这就是我到目前为止所拥有的:
查询:
SELECT
tblSerials.Title,
tblSerials.[Shelf Location],
tblSerials.City,
tblSerials.[Publisher/Associated Organization],
tblSerials.[Audience/Genre],
tblSerials.Microfilm,
tblSerials.Notes,
tblSerials.Language,
tblSerials.[bib ctrl number],
tblSerials.[Year Range],
tblSerials.[Storage Notes],
tblSerials.Barcode
FROM tblSerials
WHERE
(((tblSerials.Title) Like "*" & [Enter Search Term] & "*"))
Or ((((MultiReplace(AllowOnly(tblSerials.title,""),"-"," ","/"," "))) Like "*" & [Enter Search Term] & "*"))
Or (((tblSerials.[Publisher/Associated Organization]) Like "*" & [Enter Search Term] & "*"))
Or ((((MultiReplace(AllowOnly(tblSerials.[Publisher/Associated Organization],""),"-"," ","/"," "))) Like "*" & [Enter Search Term] & "*"))
Or ((((tblSerials.notes)) Like "*" & [Enter Search Term] & "*"))
Or ((((MultiReplace(AllowOnly(tblSerials.notes,""),"-"," ","/"," "))) Like "*" & [Enter Search Term] & "*"))
ORDER BY Replace([tblSerials].Title,' ','');
VBA 函数:
Option Compare Database
Public Function AllowOnly(yourstring As String, Allowed As String)
If Allowed = "" Then Allowed = " -/1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim intLoop As Integer
For intLoop = 1 To Len(yourstring)
If InStr(Allowed, Mid(yourstring, intLoop, 1)) > 0 Then
AllowOnly = AllowOnly & Mid(yourstring, intLoop, 1)
End If
Next intLoop
End Function
Public Function MultiReplace(varInput, ParamArray varReplacements())
' call like this:
' MultiReplace("abcdefghijk","c","V","e","X","j","Y","m","Z")
' to return this:
' abVdXfghiYk
Const MESSAGETEXT = "Uneven number of replacements parameters."
Dim n As Integer
Dim varOutput As Variant
Dim intParamsCount As Integer
If Not IsNull(varInput) Then
intParamsCount = UBound(varReplacements) + 1
If intParamsCount Mod 2 = 0 Then
varOutput = varInput
For n = 0 To UBound(varReplacements) Step 2
varOutput = Replace(varOutput, varReplacements(n), varReplacements(n + 1))
Next n
Else
MsgBox MESSAGETEXT, vbExclamation, "Invalid Operation"
End If
End If
MultiReplace = varOutput
End Function
我不能只使用AllowOnly函数的原因是因为我需要用空格替换某些标点符号,而不是完全删除。
我可以让
((((MultiReplace(AllowOnly(tblSerials.title,""),"-"," ","/"," ")))
位单独工作,但是当我将其与其余所有位结合使用时,我收到错误消息。
第一步:优化(一点点)您的 VBA 代码。最好有两个独立的功能,保持原样。对
AllowOnly
的一个小改进:将第二个参数声明为 Optional
,这样当您想要访问允许的字符的默认列表时,就不必传递空字符串作为参数:
Public Function AllowOnly(yourstring As String, Optional Allowed As String = "")
现在创建一个简短的函数,使用您在查询中使用的默认替换字符来组合对 2 个函数的调用。
Public Function HarmonizeString(yourstring) As String
If IsNull(yourstring) Then Exit Function
HarmonizeString = MultiReplace(Allowonly(CStr(yourstring)), "-", " ", "/", " ")
End Function
这样,您可以将查询条件简化为
HarmonizeString(tblSerials.[Publisher/Associated Organization]
(当然你可以选择任何其他名字)
第二步:在 Access 中创建一个简单的查询,从输入表 (
tblSerials
) 中选择所有数据并添加统一的搜索字段。查询定义(SQL 视图)可能如下所示
SELECT
tblSerials.title,
HarmonizeString([title]) AS HarmonizedFieldText,
tblSerials.[Publisher/Associated Organization],
HarmonizeString(tblSerials.[Publisher/Associated Organization]) As HarmonizedPublisher
(...)
FROM tblSerials;
我给它命名为
querySerials
,但再次选择你自己的名字。
现在您要发出的查询可以减少为
Select (...)
From querySerials
Where
((querySerials.Title Like "*" & [Enter Search Term] & "*")
Or (querySerials.HarmonizedTitle Like "*" & [Enter Search Term] & "*"))