如何简化此表达式以使搜索查询忽略标点符号? Microsoft Access 2007-2016

问题描述 投票:0回答:1

我正在创建一个数据库来跟踪存档中的期刊,我所需要使用的只是 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,""),"-"," ","/"," ")))
位单独工作,但是当我将其与其余所有位结合使用时,我收到错误消息。

sql vba ms-access simplify
1个回答
0
投票

第一步:优化(一点点)您的 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] & "*"))
© www.soinside.com 2019 - 2024. All rights reserved.