Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/31: Рейтинг темы: голосов - 31, средняя оценка - 4.74
fouks

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

29.09.2008, 22:20. Показов 6147. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят, нужна сторонняя помощь по поиску в форме MS Access. Сам я плохо владею VB - работаю с шаблоном, поэтому надеюсь на ваш совет). Собственно, о проблеме: хочу реализовать поиск в форме MS Access. Есть таблица tblBuilding, в ней есть столбец LAND (тип данных - текстовый).
Требуется, чтобы из формы MS Access (в которой ранее уже были установлены текстовые поля для поиска по определенным параметрам) осуществлялся поиск по дополнительному параметру (текстовое поле txtSeekLAND - поиск стран-поставщиков). Вот, собственно, что мне удалось придумать (фрагмент кода - события обработки нажатия кнопки "Поиск" в форме):
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.09.2008, 22:20
Ответы с готовыми решениями:

книги с реализацией поиска
подскажите книгу по php с примером реализации поиска желательно простым который потом усложняется желательно от солидного издания

Проблема с реализацией функции поиска по структуре
Столкнулся со следующей проблемой: Есть структура. struct Bicycle { int index; char model; int number; double price; ...

Помогите с реализацией
На сервере(MS SQL 2000)есть таблица препараты с полями:наименование,код аптеки,цена,наличие препарата.В Access создана форма по поиску...

2
118 / 118 / 10
Регистрация: 12.05.2010
Сообщений: 1,207
30.09.2008, 00:26
Преобразовать введенное значение из текста в число, а затем (если не нулевое) снова в текст - сложный путь.
Visual Basic
1
2
3
4
5
6
7
8
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
1
fouks
30.09.2008, 21:38
Огромное спасибо! Немного разобрался с реализацией самого алгоритма.
Не могли бы Вы пояснить, что значат следующие выражения в продемонстрированном Вами программном коде (впринципе, догадываюсь, но лучше уточнить, чтобы не было путаницы):
Поле1, Поле2,.. , ПолеN, Название=""", Номер=, Имя=.
Если можно, покажите, как будет выглядеть фрагмент кода для моих исходных данных:
- имя таблицы, запрашиваемой программой – tblBuilding ;
- имя столбца, в котором хранятся данные, по которым необходимо производить поиск(в таблице tblBuilding) – LAND ;
- имя элемента TextBox в форме-поисковике (то текстовое поле, куда мы вводим запрос на поиск) – txtSeekLand .

И еще: не могли бы Вы показать, как применить все это к моему (выложенному сверху) программному коду (что нужно исправить и как).

Выкладываю проект-шаблон из учебника по MS Access - чтобы было понятно, как работает программа и что именно нужно - http://narod.ru/disk/276655500... ).rar.html . Буду бесконечно благодарен, если покажете, как в этом проекте добавить дополнительное поле в форму-поисковик для осуществления поиска по текстовому параметру.Заранее спасибо!
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.09.2008, 21:38
Помогаю со студенческими работами здесь

Помогите с реализацией Alarm-ов
Добрый день уважаемые прошу помощи: Необходимо закинуть напоминание в почтовый ящик пользователя и чтобы после этого оно СРАЗУ у него...

Помогите с реализацией архивирования
Добрый день. Следующая проблема. Есть база данных на сервере с дизайном для ввода и редактирования данных. Необходимо создать архивную...

Помогите с выбором и реализацией редиректа
Здравствуйте! На сервер myserver.com происходит переход вот по такой ссылке: http://myserver.com?go_uri=target.ru Нужно,...

Помогите разобраться с реализацией DES
Есть код на СИ: Алгоритм ясен, но на Си никогда не писала, не могли бы вы мне помочь со смыслом процедур, прокоментировать хоть...

помогите с реализацией алгоритма сжатия Хаффмана
помогите с реализацией алгоритма сжатия Хаффмана есть код в с++ в консольном приложении, помогите сделать в форме, и чтоб выводило в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru