2016-05-22 2 views
3

Я использую базу данных Access для управления информацией о сотруднике. Я хочу создать окно поиска, чтобы при вводе идентификатора сотрудника остальная часть информации могла быть заполнена автоматически.Создать поисковый запрос в Access

Я создал функцию, чтобы попытаться получить значение каждого столбца и назначить ее, когда я нажимаю кнопку, но она не работает.

Вот код:

Public Function GetEmployeeName() As ADODB.Recordset 
    Dim rst As ADODB.Recordset 
    Set GetEmployeeName = CurrentProject.Connection.Execute("select EmployeeName From EInfor where EmployeeID = " & txtEID.Value) 
End Function 

Private Sub btnSearch_Click() 
    txtEmployeeName = GetEmployeeName() 
End Sub 

ответ

1

Кажется мне, что GetEmployeeName() должен вернуть EmployeeName, которая соответствует заданной EmployeeID. В этом случае вам не нужен Recordset. Выражение DLookup может дать вам то, что вам нужно.

Public Function GetEmployeeName(ByVal pEID As Long) As Variant 
    GetEmployeeName = DLookup("EmployeeName", "EInfor", "EmployeeID=" & pEID) 
End Function 

Эта функция ожидает, что вы поставить цель EmployeeID в качестве параметра, так что это не зашитым к значению элемента управления в одной конкретной форме.

Если найдено ни одного совпадающего EmployeeName, функция возвращает Null. В событии клика кнопки команды вы можете использовать Nz(), чтобы заменить что-то еще на Null.

Private Sub btnSearch_Click() 
    Me!txtEmployeeName.Value = Nz(GetEmployeeName(Me!txtEID.Value), "unknown") 
End Sub 
+0

Благодарим вас за полезные советы, это хорошо работает – Royy

0

Вы пытаетесь установить свойство по умолчанию txtEmployeeName (который является Value свойство) в GetEmployeeName(), которая возвращает ADODB.Recordset, который имеет свойство Fields по умолчанию, который является коллекция.

Это не может работать.

Попробуйте вместо этого:

txtEmployeeName = GetEmployeeName().Fields(0) 

Если вы хотите обновить несколько текстовых полей, вы должны рассмотреть только с помощью одного ЗЕЬЕСТА, чтобы получить все необходимые значения сразу:

"select * From EInfor where EmployeeID = " & CLng(txtEID.Value) 

А потом вы можете обновить текстовые поля следующим образом:

txtEmployeeName = rst.Fields("EmployeeName") 
txtEmployeeBoss = rst.Fields("EmployeeBoss") 
txtEmployeeAddress = rst.Fields("EmployeeAddress") 
txtEmployeeSalary = rst.Fields("EmployeeSalary") 

Обратите внимание на следующие изменения:

  • Использование CLng() Я убедился, что только номер может быть передан в коде SQL (это уязвимость системы безопасности, см How does the SQL injection from the "Bobby Tables" XKCD comic work? для примера).
  • Я объединил две процедуры, которые у вас есть: поместите все в btnSearch_Click.
0

Вы можете создать ComboBox, который фильтрует набор записей по мере ввода. Это очень полезно при поиске записей, похожих на то, что вы ищете, но не может быть точным соответствием!

Нажмите Alt + F11 и щелкните правой кнопкой мыши форму, которую вы создали ранее. Вставьте в сценарий ниже.

[![Option Compare Database 

Private Sub ComboSelect_Change() 

    ' You need to use String delimiters if you want to use a Text Field like: 
    ' Me.Filter "\[ATextFieldInRecordSource\] = """ & Me.FilterComboBox & """" 

    ' For a Numeric Field, use something like this: 
    ' Me.Filter "\[ANumericFieldInRecordSource\] = " & Me.FilterComboBox 
    ' Me.FilterOn = True 

    Me.\[Customer_Query subform1\].Form.Filter = "\[Company_Name\] Like '*" & 
        Replace(Me.ComboSelect.Text, "'", "''") & "*'" 
    Me.\[Customer_Query subform1\].Form.FilterOn = True 

End Sub][1]][1] 



Notice a few things: 
• The subform is named Customer_Query subform1’ 
• The combobox is named ComboSelect’ 
• Finally, the ‘like clause’ is used in combination with the wildcard character. 
• Like '*" & Replace(Me.ComboSelect.Text, "'", "''") & "*'" 

При вводе текста в поле со списком, результаты в подчиненной динамически повторно запрос.

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