Программирование в ACCESS 2000, страница 19

В листинге 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