2014-09-17 2 views
0

Ответ, вероятно, очень прост - я просто не могу найти подходящий поисковый запрос, я подозреваю.Ошибка MS Access 2010 VBA 3075 (поиск с апострофами)

У меня есть форма, которая открывает другую форму, отображающую любую запись сотрудника, которая соответствует поиску, как введенный. Вы можете искать по фамилии, имени или идентификатору сотрудника (используя отдельные кнопки); он дает вам небольшое окно сообщений, если ваш поиск не появляется.

Код работает отлично, за исключением обычной проблемы с обработкой апострофов в именах («O'Neill», «O'Brien» и т. Д.). Я нашел очень простую функцию обработки апострофа, но когда я пытаюсь использовать функция в поисковом запросе все еще вызывает ошибку времени выполнения 3075, и я не знаю, почему. Он только подбрасывает ошибку времени выполнения с помощью запросов, содержащих апостроф, поэтому я чувствую, что функция, возможно, не делает то, что я думаю.

Я рад развлечь решения, которые включают «использование этой функции, но добавление большего количества кавычек (или что-то еще)», а также целые новые идеи. Я бы предпочел использовать что-то , как, эта функция, тем не менее, потому что она настолько мала и, следовательно, будет намного быстрее и чище заменять код поиска по имени каждого места, которое оно появляется.

Это код, который работает отлично:

Private Sub btnSearchSurname_Click() 

Dim frm As Form 
Dim strSearch As String 

strSearch = "[List_Employees.Surname] like '" & Me.EmpSurname & "*'" 
strSearch = strSearch & " AND [CurrentEmployee] = " & True 
DoCmd.OpenForm "Employee_Entry_Extended_Certs", , , strSearch, , acHidden 
Set frm = Forms("Employee_Entry_Extended_Certs") 
If frm.Recordset.RecordCount > 0 Then 
    frm.Visible = True 
    Else 
    MsgBox ("Employee not found. Try the 'all' button to see if they're inactive. If that doesn't work, please check for typos and try again.") 
    DoCmd.Close acForm, "Employee_Entry_Extended_Certs" 
    Call OpenPayrollCloseRest 
End If 

DoCmd.Close acForm, "Find_An_Employee" 

Я пытаюсь использовать this simple public function to handle apostrophes:

Public Function adhHandleQuotes(ByVal varValue As Variant, Optional Delimiter As String = "'") As Variant 
    ' Replace all instances of a string delimiter with TWO instances, 
    ' thereby handling the darned quote issue once and for all. Also, 
    ' surround the string with the delimiter, as well. 

    ' Returns Null if the String was Null, otherwise 
    ' returns the String with all instances of strDelimiter 
    ' replaced with two of each. 

    adhHandleQuotes = strDelimiter & Replace(varValue, strDelimiter, strDelimiter & strDelimiter) & strDelimiter 
End Function 

Я изменил код поиска, чтобы использовать функцию, вставив три линии линии в месте из первой строки «strSearch =»:

Dim strSearch As String 
Dim strTerm As String 

strTerm = adhHandleQuotes(Me.EmpSurname) 
strSearch = "[List_Employees.Surname] like '" & strTerm & "*'" 
strSearch = strSearch & " AND [CurrentEmployee] = " & True 
DoCmd.OpenForm "Employee_Entry_Extended_Certs", , , strSearch, , acHidden 

И это диалоговое окно ошибки выполнения е окно:

Runtime Error '3075': Syntax error (missing operator) in query expression '[List_Employees.Surname] like 'o'cal*' AND [CurrentEmployee]=True'

+0

Ваша функция 'adhHandleQuotes' использует' strDelimiter' в коде, но необязательным параметром является 'Delimiter'. Вы проверили, что возвращает 'adhHandleQuotes (Me.EmpSurname)'? – xificurC

ответ

1

Почему вам даже нужна функция? Просто включите Double Quotes, мой взлом - использовать Chr (34).

Private Sub btnSearchSurname_Click() 

    Dim frm As Form 
    Dim strSearch As String 

    strSearch = "[List_Employees.Surname] Like " & Chr(34) & Me.EmpSurname & "*" & Chr(34) 
    strSearch = strSearch & " AND [CurrentEmployee] = True" 

    DoCmd.OpenForm "Employee_Entry_Extended_Certs", , , strSearch, , acHidden 

    Set frm = Forms("Employee_Entry_Extended_Certs") 
    If frm.Recordset.RecordCount > 0 Then 
     frm.Visible = True 
    Else 
     MsgBox ("Employee not found. Try the 'all' button to see if they're inactive. If that doesn't work, please check for typos and try again.") 
     DoCmd.Close acForm, "Employee_Entry_Extended_Certs" 
     Call OpenPayrollCloseRest 
    End If 

    DoCmd.Close acForm, "Find_An_Employee" 
End Sub 
+0

СПАСИБО! Я пытался сделать ранжированный Хр (34) примерно час назад; Я думаю, что, должно быть, я просто упустил апостроф там, потому что копия/вставка вашей линии отлично работает. Мои клерки будут так рады, что вам не придется прокручивать весь список сотрудников, чьи имена начинаются с O сейчас. :) – Sarah

+0

Рад помочь! Удачи @Sarah :) – PaulFrancis

Смежные вопросы