Все вопросы связанные с программированием. Языки программирования. Средства разработки.
Ответить
Аватара пользователя
dBaser
Не в сети
СуперМодератор
СуперМодератор
Сообщения: 1202
Зарегистрирован: Вт дек 09, 2003 11:50
Контактная информация:

VBA Access ::: Форма поиска

Сообщение dBaser »

Я думаю в любой базе данных необходим поиск каких либо данных…

Те кто давно работает с VBA Access наверняка знают свойство формы RecordSource («источник записей» в графическом отображении свойств формы).

Этому свойству присваивается текстовое значение в виде запроса либо названия таблицы для дальнейшей обработки данных на форме.
Собственно на этом и построена данное решение…
Вложения
svoystva.jpg
Критиковать - это показывать автору, как бы делал я, если бы умел.
-------
Продаются мужские часики. Один часик - 50 долларов.

Аватара пользователя
dBaser
Не в сети
СуперМодератор
СуперМодератор
Сообщения: 1202
Зарегистрирован: Вт дек 09, 2003 11:50
Контактная информация:

Сообщение dBaser »

Вот так у меня выглядит форма поиска сотрудника
Вложения
frmSearch.jpg
Последний раз редактировалось dBaser Ср май 11, 2005 9:18, всего редактировалось 2 раза.
Критиковать - это показывать автору, как бы делал я, если бы умел.
-------
Продаются мужские часики. Один часик - 50 долларов.

Аватара пользователя
dBaser
Не в сети
СуперМодератор
СуперМодератор
Сообщения: 1202
Зарегистрирован: Вт дек 09, 2003 11:50
Контактная информация:

Сообщение 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
Критиковать - это показывать автору, как бы делал я, если бы умел.
-------
Продаются мужские часики. Один часик - 50 долларов.

Аватара пользователя
dBaser
Не в сети
СуперМодератор
СуперМодератор
Сообщения: 1202
Зарегистрирован: Вт дек 09, 2003 11:50
Контактная информация:

Сообщение 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
Критиковать - это показывать автору, как бы делал я, если бы умел.
-------
Продаются мужские часики. Один часик - 50 долларов.

Alex6
Не в сети
Случайно забежавший
Случайно забежавший
Сообщения: 2
Зарегистрирован: Вт окт 18, 2005 12:51

Сообщение Alex6 »

Строить цепочку из IF ов дурной тон однако. для таких целей есть оператор Select Case. Это по поводу функции IncludeSearch() .

Аватара пользователя
dBaser
Не в сети
СуперМодератор
СуперМодератор
Сообщения: 1202
Зарегистрирован: Вт дек 09, 2003 11:50
Контактная информация:

Сообщение 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, то можно добиться хорошей скорости даже в больших базах
Критиковать - это показывать автору, как бы делал я, если бы умел.
-------
Продаются мужские часики. Один часик - 50 долларов.

jonnblaze
Не в сети
Случайно забежавший
Случайно забежавший
Сообщения: 1
Зарегистрирован: Пн июн 03, 2013 12:28

Re: VBA Access ::: Форма поиска

Сообщение jonnblaze »

Heloo
Как я могу instaal эти коды? помогите мне ....

Ответить