Главная MS ACCESS Урок 2. Поиск по таблице
Урок 2. Поиск по таблице
Автор NSA
05.10.2001 г.
Демонстрируется поиск записей в цикле, начиная от простейшего перебора записей фиксированной таблицы текущей базы по одному критерию и заканчивая работой с произвольной таблицей и произвольным критерием.
Демонстрируется поиск записей в цикле, начаная от простейшего перебора записей фиксированной таблицы текущей базы по одному критерию и заканчивая работой с произвольной таблицей и произвольным критерием. Используемые объекты Таблица "tblPeoples" и модуль "mdl_Find" Текст модуля "mdl_Find" Option Compare Database Option Explicit '******************************************************** ' В этом модуле находяться шесть процедур, ' демонстрирующих поиск записей в цикле, ' начиная от простейшего перебора записей фиксированной ' таблицы текущей базы по одному критерию ' и заканчивая работой с произвольной таблицей и ' произвольным критерием. ' В конце модуля находяться рекомендации оп построениям критериев отбора. ' © NSA Programmer, 2001. http://www.msaccess.ru ' ~ E-mail:
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
~ ICQ: 7349882 '******************************************************** Sub Find01_01() '© NSA Programmer, 2001. http://www.msaccess.ru ' ~ E-mail:
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
~ ICQ: 7349882 '-------------------------------------------------------- ' Поиск записей в таблице "tblPeoples" ' Будем искать записи, у которых в поле LastName ' находиться значение "Иванова" ' и печатать в окне отладки ID_People найденных записей ' и их количество ' Проход по всей таблице. ' ЭТОТ МЕТОД НЕ ЯВЛЯЕТСЯ ОПТИМАЛЬНЫМ!!! '-------------------------------------------------------- Dim db As Database Dim rs As Recordset Dim str As String Dim lngRecordCount As Long 'Счетчик найденных записей Set db = CurrentDb Set rs = db.OpenRecordset("tblPeoples", dbOpenDynaset) str = "" lngRecordCount = 0 If rs.RecordCount <> 0 Then rs.MoveFirst Do Until rs.EOF 'Если текущая запись удовлетворяет условию... If rs![LastName] = "Иванова" Then 'Инкримируем счетчик найденных записей lngRecordCount = lngRecordCount + 1 str = str & rs![ID_People] & ", " End If rs.MoveNext Loop str = str & vbCrLf & "Всего найдено записей: " & _ lngRecordCount Else str = "Таблица ""tblPeoples"" не содержит записей." End If Debug .Print str rs.Close db.Close End Sub Sub Find01_02() '© NSA Programmer, 2001. http://www.msaccess.ru ' ~ E-mail:
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
~ ICQ: 7349882 '-------------------------------------------------------- ' Поиск записей в таблице "tblPeoples" ' Будем искать записи, у которых в поле LastName ' находиться значение "Иванова" ' и печатать в окне отладки ID_People найденных записей ' и их количество ' Методы FindFirst и FindNext ' Поиск записей ведется от начала таблицы к ее концу '-------------------------------------------------------- Dim db As Database Dim rs As Recordset Dim str As String Dim lngRecordCount As Long 'Счетчик найденных записей Set db = CurrentDb Set rs = db.OpenRecordset("tblPeoples", dbOpenDynaset) str = "" lngRecordCount = 0 If rs.RecordCount <> 0 Then 'Поиск первой записи, удовлетворяющей критерию отбора rs.FindFirst "[LastName] = 'Иванова'" 'Свойство NoMatch набора записей становится ' ИСТИННЫМ, когда один из методов Find НЕ НАШЕЛ ЗАПИСЕЙ 'Цикл "пока есть найденные записи" Do Until rs.NoMatch lngRecordCount = lngRecordCount + 1 str = str & rs![ID_People] & ", " rs.FindNext "[LastName] = 'Иванова'" 'Поиск следующей записи, удовлетворяющей критерию отбора Loop str = str & vbCrLf & "Всего найдено записей: " & _ lngRecordCount Else str = "Таблица ""tblPeoples"" не содержит записей." End If Debug .Print str rs.Close db.Close End Sub Sub Find01_03() '© NSA Programmer, 2001. http://www.msaccess.ru ' ~ E-mail:
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
~ ICQ: 7349882 '-------------------------------------------------------- ' Поиск записей в таблице "tblPeoples" ' Будем искать записи, у которых в поле LastName ' находиться значение "Иванова" ' и печатать в окне отладки ID_People найденных записей ' и их количество ' Методы FindLast и FindPrevious ' Эта процедура аналогична процедуре "Find01_02", только ' в ней поиск записей ведется от конца таблицы к ее ' началу '-------------------------------------------------------- Dim db As Database Dim rs As Recordset Dim str As String Dim lngRecordCount As Long 'Счетчик найденных записей Set db = CurrentDb Set rs = db.OpenRecordset("tblPeoples", dbOpenDynaset) str = "" lngRecordCount = 0 If rs.RecordCount <> 0 Then 'Поиск последней записи, удовлетворяющей критерию отбора rs.FindLast "[LastName] = 'Иванова'" Do Until rs.NoMatch lngRecordCount = lngRecordCount + 1 str = str & rs![ID_People] & ", " rs.FindPrevious "[LastName] = 'Иванова'" 'Поиск предыдущей записи, удовлетворяющей критерию отбора Loop str = str & vbCrLf & "Всего найдено записей: " & _ lngRecordCount Else str = "Таблица ""tblPeoples"" не содержит записей." End If Debug .Print str rs.Close db.Close End Sub Sub Find01_04() '© NSA Programmer, 2001. http://www.msaccess.ru ' ~ E-mail:
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
~ ICQ: 7349882 '-------------------------------------------------------- ' Поиск записей в таблице "tblPeoples" ' Эта процедура аналогична процедуре "Find01_02", ' только в ней ' добавлена обработка ошибок и критерий поиска ' предварительно ' собирается в строковую переменную. '-------------------------------------------------------- On Error GoTo Err_Find01_04 Dim db As Database Dim rs As Recordset Dim str As String Dim lngRecordCount As Long Dim strWhere As String 'Строковая переменная для условия отбора Set db = CurrentDb Set rs = db.OpenRecordset("tblPeoples", dbOpenDynaset) str = "" lngRecordCount = 0 strWhere = "[LastName] = 'Иванова'" If rs.RecordCount <> 0 Then rs.FindFirst strWhere Do Until rs.NoMatch lngRecordCount = lngRecordCount + 1 str = str & rs![ID_People] & ", " rs.FindNext strWhere Loop str = str & vbCrLf & "Всего найдено записей: " & _ lngRecordCount Else str = "Таблица ""tblPeoples"" не содержит записей." End If Debug .Print str rs.Close db.Close Exit_Find01_04: Exit Sub Err_Find01_04: MsgBox Err.Description Resume Exit_Find01_04 End Sub Sub Find01_05() '© NSA Programmer, 2001. http://www.msaccess.ru ' ~ E-mail:
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
~ ICQ: 7349882 '-------------------------------------------------------- ' Поиск записей в таблице "tblPeoples" ' Улучшим процедуру "Find01_04" путем составления строки ' SQL с условием отбора ' и открытием набора записей на основе этого SQL- ' выражение. ' Использование такого метода сокращает время выполнения ' процедуры. ' Особенно это заметно на больших массивах данных, так ' как полученный ' набор записей будет содержать ТОЛЬКО нужные нам записи ' и отпадает необходимость ' производить поиск по всей таблице. Соответственно ' используем методы Move вместо Find. '-------------------------------------------------------- On Error GoTo Err_Find01_05 Dim db As Database Dim rs As Recordset Dim str As String Dim lngRecordCount As Long Dim strSQL As String 'Строковая переменная SQL-выражения Dim strWhere As String 'Строковая переменная для условия отбора strWhere = "[LastName] = 'Иванова'" 'Формируем строку SQL strSQL = "SELECT * FROM tblPeoples WHERE (" & _ strWhere & ")" Set db = CurrentDb 'Открывем набор записей на основе строки SQL Set rs = db.OpenRecordset(strSQL, dbOpenDynaset) str = "" If rs.RecordCount <> 0 Then rs.MoveFirst Do Until rs.EOF str = str & rs![ID_People] & ", " rs.MoveNext Loop lngRecordCount = rs.RecordCount str = str & vbCrLf & "Всего найдено записей: " & _ lngRecordCount Else str = "Таблица ""tblPeoples"" не содержит записей." End If Debug .Print str rs.Close db.Close Exit_Find01_05: Exit Sub Err_Find01_05: MsgBox Err.Description Resume Exit_Find01_05 End Sub Sub Find01_06(strTableName As String , strWhere As String ) '© NSA Programmer, 2001. http://www.msaccess.ru ' ~ E-mail:
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
~ ICQ: 7349882 '-------------------------------------------------------- ' Поиск записей в таблице "tblPeoples" ' Улучшим процедуру "Find01_05", передавая имя таблицы и ' критерий отбора ' в качастве входных параметров в процедуру. При этом в ' окне отладки будем ' выводить значение 1-го поля набора записей. '-------------------------------------------------------- On Error GoTo Err_Find01_06 Dim db As Database Dim rs As Recordset Dim str As String Dim lngRecordCount As Long Dim strSQL As String 'Строковая переменная SQL-выражения strSQL = "SELECT * FROM [" & strTableName & _ "] WHERE (" & strWhere & ")" Set db = CurrentDb 'Открывем набор записей на основе строки SQL Set rs = db.OpenRecordset(strSQL, dbOpenDynaset) str = "" If rs.RecordCount <> 0 Then rs.MoveFirst Do Until rs.EOF str = str & rs.Fields(0).Value & ", " rs.MoveNext Loop lngRecordCount = rs.RecordCount str = str & vbCrLf & "Всего найдено записей: " & _ lngRecordCount Else str = "Таблица """ & strTableName & """ не содержит записей." End If Debug .Print str rs.Close db.Close Exit_Find01_06: Exit Sub Err_Find01_06: MsgBox Err.Description Resume Exit_Find01_06 'Вызов процедуры: ' Все Ивановы: 'Call Find01_06("tblPeoples", "[LastName] = 'Иванова'") ' Все Перовы: 'Call Find01_06("tblPeoples", "[LastName] = 'Петрова'") ' Все мужчины: 'Call Find01_06("tblPeoples", "[PeopleSex] = True") ' Все родившиеся в 1996 году: 'Call Find01_06("tblPeoples", "Year([BirthDate]) = 1996") ' Все женщины, родившиеся в 1996 году: ' Call Find01_06("tblPeoples", _ '"Year([BirthDate]) = 1996 And [PeopleSex] = False") End Sub '******************************************************** ' РЕКОМЕНДАЦИИ ПО ПОСТРОЕНИЮ КРИТЕРИЕВ ОТБОРА ' ДЛЯ РАЗЛИЧНЫХ ТИПОВ ДАННЫХ '******************************************************** ' 'Если поле текстовое - не забывайте заключать искомое ' значение в апострофы: ' strWhere = "[ИмяПоля] = '" & _ ' ПеременнаяСодержащаяТекст & "'" ' ' Если поле типа дата/время при составлении критерия ' отбора пользуйтесь следующим выражением: ' strWhere = "[ИмяПоля] = " & _ ' Mid(BuildCriteria("-", dbDate, _ ' ПеременнаяСодержащаяДату), 3) ' или так ' strWhere = "DateDiff('s',[ИмяПоля], " & _ ' Mid(BuildCriteria("-", dbDate, _ ' ПеременнаяСодержащаяДату), 3) & ")=0" ' ' Для формирования условий, сравнивающих даты ' пользуйтесь ' функцией DateDiff: ' Неправильно: strWhere = "[ИмяПоля] > " & _ ' ПеременнаяСодержащаяДату ' Правильно: ' strWhere = "DateDiff('s',[ИмяПоля], " & _ ' Mid(BuildCriteria("-", dbDate, _ ' ПеременнаяСодержащаяДату), 3) & ")<0" ' Неправильно: strWhere = "[ИмяПоля] < " & _ ' ПеременнаяСодержащаяДату ' Правильно: ' strWhere = "DateDiff('s',[ИмяПоля], " & _ ' Mid(BuildCriteria("-", dbDate, _ ' ПеременнаяСодержащаяДату), 3) & ")>0" ' '********************************************************
Просмотров: 27096 1 Написал(а) Рейтор Константин Иванович , в 09:05 25.08.2008 Огромное спасибо. Ваш пример очень помог мне в совершествовании моей базы данных.
2 Написал(а) Рустем Камилевич , в 02:59 06.11.2008 Неплохо организована структура сайта, его содержание, начал недавно изучать VBA и разработку БД на Access, успел просмотреть несколько сайтов, ваш сайт могу отметить как хороший.
Реклама на сайте