Страница 1 из 1
VBA Access ::: Форма поиска
Добавлено: Ср май 11, 2005 9:01
dBaser
Я думаю в любой базе данных необходим поиск каких либо данных…
Те кто давно работает с VBA Access наверняка знают свойство формы RecordSource («источник записей» в графическом отображении свойств формы).
Этому свойству присваивается текстовое значение в виде запроса либо названия таблицы для дальнейшей обработки данных на форме.
Собственно на этом и построена данное решение…
Добавлено: Ср май 11, 2005 9:02
dBaser
Вот так у меня выглядит форма поиска сотрудника
Добавлено: Ср май 11, 2005 9:04
dBaser
При обновлении какого либо поля на форме либо по нажатию на кнопку обновить обновляется список сотрудников в подформе. Это достигается тем что после выполнения события «После обновления» вызывается функция RequerySubform().
Код: Выделить всё
Public Function RequerySubform()
‘-- Объявление переменных
Dim strPurchaseDateSQL As String
Dim strWhereSQL As String
Dim strFullSQL As String
Dim strVidRabotSQL As String
Dim strSearchSQL As String
'-- Если выбрано авто обновление или нажата кнопка обновить
'-- то обновить содержание подформы
If Me!optAutoRequery Or Screen.ActiveControl.Name = "cmdRequery" Then
‘—- Вызов вспомогательных функций и присвоение объявленным переменным полученное значение
‘—- Каждая вспомогательная функция возвращает кусок SQL запроса содержащий параметр отбора
strVidRabotSQL = IncludeVidRabot()
strPurchaseDateSQL = IncludePurchaseDate()
‘—- Сюда подставляется значение из поля находящегося в области с переключателями
strSearchSQL = IncludeSearch()
‘—- Начало формирования условий запроса
strWhereSQL = "Where "
‘—- Дальше идет одинаковая проверка для каждой переменной: Если пользователь ввел значение в определенное поле на форме, то проверить были ли добавлены условия запроса ранее и добавить параметр.
If Len(strVidRabotSQL) <> 0 Then
If strWhereSQL <> "Where " Then
strWhereSQL = strWhereSQL & " And "
End If
strWhereSQL = strWhereSQL & strVidRabotSQL
End If
If Len(strSearchSQL) <> 0 Then
If strWhereSQL <> "Where " Then
strWhereSQL = strWhereSQL & " and "
End If
strWhereSQL = strWhereSQL & strSearchSQL
End If
If Len(strPurchaseDateSQL) <> 0 Then
If strWhereSQL <> "Where " Then
strWhereSQL = strWhereSQL & " And "
End If
strWhereSQL = strWhereSQL & strPurchaseDateSQL & ";"
End If
'-- Если не было выбрано параметров поиска, то количество записей равно 0 (подформа пустая)
If strWhereSQL = "Where " Then
strWhereSQL = "Where False;"
End If
'-- Создание новой SQL Строки и присвоение ее источнику записей
strFullSQL = "Select * From tblSotrudnik " & strWhereSQL
Me!subfrmSearch.Form.RecordSource = strFullSQL
' Debug.Print strFullSQL ‘—раскоментировав начало этой строки можно увидеть получившийся запрос в окне Immediate
'-- Установить цвет кнопки "Обновить" черным
Me!cmdRequery.ForeColor = 0
Else
'-- Установить цвет кнопки "Обновить" красным
Me!cmdRequery.ForeColor = 255
End If
End Function
Добавлено: Ср май 11, 2005 9:17
dBaser
Вспомогательные функции:
Возвращает параметр для запроса если поле даты не пустое
Код: Выделить всё
Private Function IncludePurchaseDate() As String
'-- Создание условия по дате для SQL запроса
If Not IsNull(Me!txtBegPurchaseDate) Then
'Debug.Print "готово"
IncludePurchaseDate = "(tblSotrudnik.kontrakt_data >= Forms!frmSearch!txtBegPurchaseDate )"
End If
End Function
Если поле со списком не пустое либо не выбрано "<< ВСЕ >>" , то возвращает условие для запроса, иначе пустую строку
Код: Выделить всё
Private Function IncludeVidRabot() As String
Dim strTemp As String
Dim varCategory As Variant
If (Me!spisokVidRabot = "<< ВСЕ >>") Or IsNull(Me!spisokVidRabot) Then
strTemp = ""
Else
strTemp = "[vid_rabot] = '" & Me!spisokVidRabot & "'"
End If
IncludeVidRabot = strTemp
End Function
А эта функция возвращает параметр в зависимости от выбраного переключателя...
Код: Выделить всё
Public Function IncludeSearch() As String
' устанавливает в предложение Where параметры
' отбора записей ,
Dim strTemp As String
Dim strPole As String
If Not IsNull(Me!pSearch) Then
If Me!grpSearch = 1 Then
strPole = "familiya"
End If
If Me!grpSearch = 2 Then
strPole = "inn"
End If
If Me!grpSearch = 3 Then
strPole = "tab_numb"
End If
If Me!grpSearch = 4 Then
strPole = "passport_nomer"
End If
If Me!grpSearch = 5 Then
strPole = "kontrakt_nomer"
End If
If Me!grpSearch = 6 Then
strPole = "Insurance_numb"
End If
If Me!pSearch <> "" Then
strTemp = strTemp & "tblSotrudnik." & strPole & " Like '" & Me!pSearch & "*'"
IncludeSearch = "" & strTemp & ""
End If
Else
IncludeSearch = ""
End If
End Function
На форме можно вводить параметр целиком либо начальные символы
По нажатию на кнопку "ОБновить"
Код: Выделить всё
Private Sub cmdData_Click()
Dim ctlDate As TextBox
Dim varReturn As Variant
Set ctlDate = Me!txtBegPurchaseDate
varReturn = acbGetDate(ctlDate.Value)
If Not IsNull(varReturn) Then
ctlDate = varReturn
End If
End Sub
По нажатию на кнопку "Очистить"
Код: Выделить всё
Private Sub cmdClear_Click()
Dim varDummy As Variant
Dim intCurrCat As Integer
'-- Очистить все критерии отбора
Me!pSearch = Null
Me!txtBegPurchaseDate = Null
Me!spisokVidRabot = Null
'-- Обновить источник записей для подформы
varDummy = RequerySubform()
End Sub
После обновления переключателей АВТООБНОВЛЕНИЯ
Код: Выделить всё
Private Sub optAutoRequery_AfterUpdate()
Dim varDummy As Variant
If Me!optAutoRequery Then
varDummy = RequerySubform()
End If
End Sub
Добавлено: Сб окт 29, 2005 22:33
Alex6
Строить цепочку из IF ов дурной тон однако. для таких целей есть оператор Select Case. Это по поводу функции IncludeSearch() .
Добавлено: Пн окт 31, 2005 0:01
dBaser
Alex6, согласен...
вот это дело можно заменить на кейсы...
Код: Выделить всё
If Me!grpSearch = 1 Then
strPole = "familiya"
End If
If Me!grpSearch = 2 Then
strPole = "inn"
End If
If Me!grpSearch = 3 Then
strPole = "tab_numb"
End If
If Me!grpSearch = 4 Then
strPole = "passport_nomer"
End If
If Me!grpSearch = 5 Then
strPole = "kontrakt_nomer"
End If
If Me!grpSearch = 6 Then
strPole = "Insurance_numb"
End If
а вообще тут представлен рабочий пример, которы очень может помочь начинающим... а если использовать технологию rushmore, то можно добиться хорошей скорости даже в больших базах
Re: VBA Access ::: Форма поиска
Добавлено: Пн июн 03, 2013 12:36
jonnblaze
Heloo
Как я могу instaal эти коды? помогите мне ....