В листинге 5.33 показана функция поиска книг заданного автора в каталоге. Для этого мы будем использовать запрос КнигиАвтора, который был создан и хранится в базе данных Библиотека.mdb. Коды книг, удовлетворяющих критерию поиска, сохраняются в массиве IdList, который может использоваться для дальнейшей обработки. Код автора, который указывается в качестве критерия поиска, определяется выбором из списка в поле Автор диалогового окна Поиск.
Листинг 5.33. Функция FindBook (DAO)
'на уровне модуля объявляем динамический массив
Private idListQ As Integer
Function FindBook ()
Dim db As Database, rs As Recordset, i As Integer
Set db = CurrentDb
'создаем набор записей на основе запроса "КнигиАвтора" 'если набор записей пуст, выходим из функции
Set rs = db.Openrecordset("Книгиавтора", dbOpenSnapshot)
If rs.RecordCount = 0 Then
MsgBox "Книги отсутствуют"
ExitFunction
End If
'ищем первую запись по заданному критерию
rs.FindFirst "КодАвтора = " & Forms!Поиск!Автор
'если не нашли, то выходим из функции
If rs.NoMatch Then
MsgBox "Книги отсутствуют"
ExitFunction
Else
'устанавливаем размер массива и добавляем в него код автора
ReDim Preserve idList(i)
idList(i) = rs.КодАвтора
Do Until rs.EOF
rs.FindNext "КодАвтора = " & Forms!Поиск!Автор
If rs.NoMatch = False Then
i = i + 1
ReDim Preserve idList(i)
idList(i) = rs.КодАвтора
End If
rs.MoveNext
Loop
End If
rs.Close db.Close
End Function
В отличие от этого, в объектной модели ADO существует только один метод Find, который начинает поиск всегда с текущей записи. Два аргумента метода позволяют определить начало и направление поиска:
· SearchDirection определяет направление поиска;
· SkipRows позволяет указать смещение начала поиска относительно текущей записи (по умолчанию 0).
Кроме того, в аргументе Criteria, который определяет условия поиска, можно указать только одно условие, например: Orderld = 5. Если требуются более сложные условия поиска, нужно использовать свойство Filter объекта Recordset И, наконец, если не найдена запись, удовлетворяющая указанному условию, устанавливается значение True одного из свойств, BOF или EOF, в зависимости от заданного направления поиска. Эти свойства и нужно проверять после выполнения поиска.
ВНИМАНИЕЗадаваякритериипоиска, будьтевнимательныприупотребленииразныхтиповдан-ных: строковыепеременныезаключайтеводинарныекавычки, вдатахиспользуйте стандартныйформатAccess, тоесть #11/25/01#.
В листинге 5.34 приведен пример той же функции, но написанный в терминах модели ADO.
Листинг 5.34. Функция FindBook (ADO)
Private idListO As Integer
Function FindVacancy ()
Dim cnn As ADODB.Connection, rs As ADODB.Recordset
Dim i As Integer, stCriteria As String
StCriteria = "КодАвтора = " & Forms!Поиск!Автор
Set cnn = CurrentProject.Connection
Set rst = New ADODB.Recordset
'создаем набор записей на основе запроса "КнигиАвтора"
'если набор записей пуст, выходим из функции
With rst
'Открываем таблицу
.Open Source:= "КнигиАвтора", ActiveConnection:= cnn,_
CursorType:=adOpenStatic,LockType:=adReadOnly
If .RecordCount = 0 Then
MsgBox "Книги отсутствуют"
Exit Function
End If
'ищем первую запись по заданному критерию
.Find Criteria:=strCriteria,_
SearchDirection:= adSearchForward
'если не нашли, то выходим из функции
If .EOF Then
MsgBox "Вакансии отсутствуют"
Exit Function
Else
ReDim Preserve idList(i)
idList(i) = .КодАвтора
Do While Not .EOF
'начинаем поиск со следующей записи
.Find CM teri a: =strCri teri a, SkipRecords:=1
If Not .EOF Then i = i + 1
ReDim Preserve idList (i)
idList(i) = .Код
End If
Loop
закрываем объект Recordset
.Close
End With
cnn.Close
Set rs = Nothing
Set cnn = Nothing
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.