Страница 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 эти коды? помогите мне ....