Помогите с реализацией поиска в формах MS Access!!!

fouks

Ребят, нужна сторонняя помощь по поиску в форме MS Access. Сам я плохо владею VB - работаю с шаблоном, поэтому надеюсь на ваш совет). Собственно, о проблеме: хочу реализовать поиск в форме MS Access. Есть таблица tblBuilding, в ней есть столбец LAND (тип данных - текстовый). Требуется, чтобы из формы MS Access (в которой ранее уже были установлены текстовые поля для поиска по определенным параметрам) осуществлялся поиск по дополнительному параметру (текстовое поле txtSeekLAND - поиск стран-поставщиков). Вот, собственно, что мне удалось придумать (фрагмент кода - события обработки нажатия кнопки "Поиск" в форме):
Private Sub CommandSeek_Click()
' Кнопка Поиск
Dim CountBuilding As Integer
' Количество зданий, попавших в запрос
If IsNull(ComboBoxSeekStreet.Value) Then
   ' Улица не имеет значения для пользователя
   SelectSeekStreet = 0
Else
   ' Номер улицы для поиска
   SelectSeekStreet = ComboBoxSeekStreet.Value
End If
If IsNull(txtSeekHouse.Value) Then
   ' Номер дома не имеет значения для пользователя
   SelectSeekHouse = 0
Else
   ' Номер дома для поиска
   ' Номер дома преобразован из
   ' строки символов в число
   SelectSeekHouse = Val(txtSeekHouse.Value)
End If
If IsNull(txtSeekYear.Value) Then
   ' Год постройки дома не имеет значения для пользователя
   SelectSeekYear = 0
Else
   ' Номер дома для поиска
   ' Номер дома преобразован из
   ' строки символов в число
   SelectSeekYear = Val(txtSeekYear.Value)
End If
If IsNull(txtSeekLand.Value) Then
   ' Площадь участка дома не имеет значения для пользователя
   SelectSeekYear = 0
Else
   ' Площадь участка дома для поиска
   SelectSeekLand = (txtSeekLand.Value)
End If
If IsNull(ComboBoxSeekDistrict.Value) Then
   ' Район не имеет значения для пользователя
   SelectSeekDistrict = 0
Else
   ' Номер района для поиска
   SelectSeekDistrict = ComboBoxSeekDistrict.Value
End If
' Порядок сортировки
SelectSort = OptionSort.Value
 
' Формирование строки запроса
' Основная часть строки
SQLText = "SELECT tblBuilding.STREET, " & _
    "tblStreet.NAME AS ПОСТАВЩИК, " & _
    "tblStreet.CONTACT_PERSON_CP AS ПРИЗНАК, " & _
    "tblBuilding.HOUSE AS НАЗВАНИЕ, tblDistrict.AREA AS НАЛИЧИЕ, " & _
    "tblBuilding.LAND AS УЧАСТОК, tblBuilding.YEAR AS ГОД " & _
 "FROM tblStreet, tblBuilding, tblDistrict " & _
    "WHERE  tblStreet.STREET = tblBuilding.STREET " & _
    "AND tblDistrict.DISTRICT = tblBuilding.DISTRICT "
' Дополнительная часть строки
' содержит параметры выбора
If SelectSeekStreet <> 0 Or SelectSeekHouse <> 0 Or SelectSeekYear <> 0 Or SelectSeekLand <> "" Or _
   SelectSeekDistrict <> 0 Then
   If SelectSeekStreet <> 0 Then
      ' Если выбрана улица
      SQLText = SQLText & " AND tblBuilding.STREET =" & _
                SelectSeekStreet
   End If
   If SelectSeekHouse <> 0 Then
      ' Если введен номер дома
      SQLText = SQLText & " AND tblBuilding.HOUSE =" & _
                SelectSeekHouse
   End If
   If SelectSeekYear <> 0 Then
      ' Если введен год постройки дома
      SQLText = SQLText & " AND tblBuilding.YEAR =" & _
                SelectSeekYear
   End If
   If SelectSeekLand <> "" Then
      ' Если введеа площадь участка дома
      SQLText = SQLText & " AND tblBuilding.LAND =" & _
                SelectSeekLand
   End If
   If SelectSeekDistrict <> 0 Then
      ' Если выбран район
      SQLText = SQLText & " AND tblBuilding.DISTRICT =" & _
                SelectSeekDistrict
   End If
End If
' Продолжение основной части строки - сортировка
Select Case SelectSort
Case 1  ' По адресу здания
  SQLText = SQLText & " ORDER BY NAME, CONTACT_PERSON_CP, HOUSE"
Case 2  ' По району города
  SQLText = SQLText & " ORDER BY tblDistrict.AREA"
Case 3  ' По площади земельного участка
  SQLText = SQLText & " ORDER BY tblBuilding.LAND"
Case 4  ' По году постройки
  SQLText = SQLText & " ORDER BY tblBuilding.YEAR"
End Select
' Устанавливаем свойства для поля со списком зданий
' Тип источника данных (Таблица или Запрос)
' Для .ACCDB
' ListBox.RowSourceType = "Table/Query"
' Для .ADP
' ListBox.RowSourceType = "Table/View/StoredProc"
 
' Источник данных поля
ListBox.RowSource = SQLText
' Подсчет количества зданий, попавших в запрос
CountBuilding = CountQuery(SQLText)
If CountBuilding = 0 Then
   ' В запросе нет записей
   MsgBox "Продукции, отвечающей условиям вашего " & _
       "запроса, в базе нет. Повторите запрос, " & _
       "изменив требования.", _
       vbOKOnly + vbExclamation, "Внимание"
   ' Возврат на первую вкладку
   ' для повторения запроса
   Exit Sub
End If
' Изменение надписи внизу второй вкладки
CountRecords.Caption = _
     "Количество наименований продукции, попавшей в запрос: " & _
     Str(CountBuilding)
' Выделение первой записи объекта "Поле со списком"
ListBox.Selected(1) = True
' Вторая вкладка видима
Page2.Visible = True
' Переход на вторую вкладку
Page2.SetFocus
End Sub
 
Private Sub Form_AfterUpdate()
' После обновления
' Обновление запроса для поля со списком
ListBox.Requery
End Sub
 
Private Sub Form_BeforeUpdate(Cancel As Integer)
' До обновления
Select Case Indicator
  Case 1 ' Штатный режим добавления записи
    If MsgBox("Добавить новую запись в базу данных? ", _
      vbInformation + vbYesNo, "Сохранение") = vbNo Then
      DoCmd.RunCommand acCmdUndo
    End If
    ' Первая вкладка (Поиск) видима
    Page1.Visible = True
    ' Вторая вкладка (Список зданий) видима
    Page2.Visible = True
    Page2.SetFocus
    ' Гашение третьей вкладки
    Page3.Visible = False
    ' Изменение заголовка третьей вкладки вкладки
    Page3.Caption = "Просмотр"
    ' Кнопка Квартиры доступна
    CommandFlats.Enabled = True
    ' Кнопка Удалить доступна
    CommandDel.Enabled = True
  Case 2 ' Штатный режим корректировки
    If MsgBox("Сохранить сделанные изменения? ", _
      vbInformation + vbYesNo, "Сохранение") = vbNo Then
      DoCmd.RunCommand acCmdUndo
    End If
  Case Else
    ' Во всех остальных случаях данные не обновлять
    DoCmd.RunCommand acCmdUndo
End Select
End Sub
 
Private Sub Form_Load()
   ' Назначение файла справки
   Me.HelpFile = CurrentPath() & "\RealEstate.chm"
End Sub
 
Private Sub ListBox_DblClick(Cancel As Integer)
Dim TxtSQL As String ' Строка запроса
Indicator = 2 ' Режим корректировки включен
' Смотри событие "До обновления" этой формы
' Form_BeforeUpdate
' Номер выбранной улицы
SelectStreet =[ListBox].Column(0)
' Номер выбранного дома
SelectHouse =[ListBox].Column(3)
' Строка запроса
TxtSQL = "SELECT * FROM tblBuilding WHERE STREET = " & _
          SelectStreet & " AND HOUSE = " & SelectHouse
' Источник данных формы теперь этот запрос
Me.RecordSource = TxtSQL
' Третья вкладка видима и активна
Page3.Visible = True
Page3.SetFocus
End Sub
 
Private Sub ListBox_GotFocus()
' Отмена вывода на экран второй страницы вкладки
Page3.Visible = False
End Sub
 
Public Function CountQuery(SQLText) As Integer
' Возвращает количество записей в запросе
' SQLText - строка с текстом запроса
Dim CountSelectSQL As Integer      ' Количество записей
' Создание ссылок на реальные объекты
Dim Connect As ADODB.Connection
' Connect - Объектная переменная - тип соединение
' Объект ADO верхнего уровня
Dim rsCount As ADODB.Recordset
' rsCount - Объектная переменная - содержит набор записей
 
' Для создания соединения с текущей базой данных
Set Connect = CurrentProject.Connection
 
'' Для создания соединения с внешней базой данных
' Set Connect = New ADODB.Connection
'' Только для MS Access 2007 (файл.accdb)
' With Connect
'     .ConnectionString = _
'     "Provider=Microsoft.ACE.OLEDB.12.0;" & _
'     "Data Source=" & CurrentPath() & "\Real Estate.accdb"
'     .Open
' End With
 
Set rsCount = New ADODB.Recordset    ' Создание набора
With rsCount
     ' Задание свойств объекта rsCount (Recordset)
     ' Источник: SQL-конструкция
     .Source = SQLText
     ' Указатель на открытое соединение
     .ActiveConnection = Connect
     .CursorType = adOpenKeyset   ' Тип курсора
     ' Метод объекта RS
     ' Открывает набор данных активного объекта
     .Open
End With
CountSelectSQL = rsCount.RecordCount
' RecordCount - свойство объекта rsCount
' Возвращает количество записей
' Освобождение объектных переменных
Set rsCount = Nothing
Set Connect = Nothing
' Количество записей в выборке
' CountQuery - имя функции-процедуры
CountQuery = CountSelectSQL
End Function
 
Private Sub Postav_Click()
' Четвертая вкладка видима
Page4.Visible = True
' Переход на четвертую вкладку
Page4.SetFocus
End Sub
Однако тут-то и возникает проблема. При вводе в форме в текстовое поле txtSeekLAND какого-либо значения (текстового) для поиска и нажатии на кнопку "Поиск" вылетает ошибка VBA: " Run-time error '-2147217913 (80040e07)' Несоответствие типов данных в выражении условия отбора ". Очень прошу: поскажите хотя бы в общих чертах, что можно предпринять (в данном коде) для устранения сей ошибки. Буду благодарен за любую помощь! Заранее спасибо!P.S. Тип переменной для хранения запроса - As STRING
2 ответа

fouks

Преобразовать введенное значение из текста в число, а затем (если не нулевое) снова в текст - сложный путь.
Dim s As String
s=""
If Not IsNull(Поле1) Then s="Название=""" & Поле1 & """" 'для текстовых значений
If Not IsNull(Поле2) Then s=s+" AND Номер=" & Поле2 'для числовых значений
...
If Not IsNull(ПолеN) Then s=s+" AND Имя=""" & ПолеN & """"
if Left(s,5)=" AND " Then s=" WHERE "+Mid(s,6)
RecordSource = "SELECT * FROM Таблица" + s


fouks

Огромное спасибо! Немного разобрался с реализацией самого алгоритма. Не могли бы Вы пояснить, что значат следующие выражения в продемонстрированном Вами программном коде (впринципе, догадываюсь, но лучше уточнить, чтобы не было путаницы): Поле1, Поле2,.. , ПолеN, Название=""", Номер=, Имя=. Если можно, покажите, как будет выглядеть фрагмент кода для моих исходных данных: - имя таблицы, запрашиваемой программой – tblBuilding ; - имя столбца, в котором хранятся данные, по которым необходимо производить поиск(в таблице tblBuilding) – LAND ; - имя элемента TextBox в форме-поисковике (то текстовое поле, куда мы вводим запрос на поиск) – txtSeekLand .И еще: не могли бы Вы показать, как применить все это к моему (выложенному сверху) программному коду (что нужно исправить и как).Выкладываю проект-шаблон из учебника по MS Access - чтобы было понятно, как работает программа и что именно нужно - http://narod.ru/disk/2766555000/MP%20(copy%202).rar.html . Буду бесконечно благодарен, если покажете, как в этом проекте добавить дополнительное поле в форму-поисковик для осуществления поиска по текстовому параметру.Заранее спасибо!