4. Создание индекса
В объектной модели DAO для создания индекса таблицы используется метод CreateIndex объекта TableDefs. После создания объекта Index необходимо добавить индексируемое поле (для составного индекса - поля) в семейство Fields объекта Index, а затем добавить объект Index в семейство Indexes объекта TableDef.
В листинге 1 представлен пример создания индекса для таблицы Студенты.
Листинг 1.
' Процедура создания индекса, модель DAO
Sub CreateIndex()
' Объявление объектных переменных и их инициализация
Dim Db As Database, td As TableDef, fld As Field
Dim idx As Index
Set Db = CurrentDb
Set td = Db.TableDefs("Студенты")
With td
'Создание индекса
Set idx = .CreateIndex("ФамилияИнд")
With idx
.Fields.Append .CreateField("Фамилия")
End With
'Добавление индекса в семейство Indexes объекта TableDef
.Indexes.Append idx
End With
Db.Close
End Sub
5. Поиск записей
При поиске нужных записей для объектов типа Recordset может использоваться группа методов Find и метод Seek. Метод Seek является более быстрым, так как основан на применении индексов таблиц.
В объектной модели DAO имеется четыре метода, относящиеся к группе Find:
FinfFirst – определяется первая запись, удовлетворяющая условиям поиска,
FindLast - определяется последняя запись, удовлетворяющая условиям поиска,
FindNext – определяется следующая запись, удовлетворяющая условиям поиска,
FindPrevious - определяется предыдущая запись, удовлетворяющая условиям поиска.
Единственный аргумент каждого из этих методов задает условия поиска.
В листинге 2 приведен пример поиска с помощью метода FindFirst. Условия поиска задаются в окне InputBox, результаты поиска в примере выводятся в окно сообщений Immediate.
Листинг 2.
Function FindMark()
Dim Db As Database, rs As DAO.Recordset, i As Integer, idMark As Long
Set Db = CurrentDb
Set rs = Db.OpenRecordset("SELECT Оценки.Оценка, Предметы.Название, Предметы.Преподаватель, Студенты.Фамилия, Студенты.Имя " _
& "FROM Студенты INNER JOIN (Предметы INNER JOIN Оценки ON Предметы.[Код предмета] = Оценки.[Код предмета]) ON Студенты.[Код студента] = Оценки.[Код студента]", dbOpenSnapshot)
'ищем первую запись по заданному критерию
idMark = Trim(InputBox("Введите значение оценки"))
rs.FindFirst "Оценка > " & idMark
'если не нашли, то выходим из функции
If rs.NoMatch Then
MsgBox "Такие записи отсутствуют"
Exit Function
Else
Debug.Print "Студент" & " " & rs.Fields("Фамилия") & " " _
& "Предмет" & " " & rs.Fields("Название") & " " _
& "Оценка = " & rs.Fields("Оценка")
Do Until rs.EOF
rs.FindNext "Оценка > " & idMark
If rs.NoMatch = False Then
Debug.Print "Студент" & " " & rs.Fields("Фамилия") & " " _
& "Предмет" & " " & rs.Fields("Название") & " " _
& "Оценка = " & rs.Fields("Оценка")
End If
rs.MoveNext
Loop
End If
rs.Close
Db.Close
Set rs = Nothing
Set Db = Nothing
End Function
Метод Seek обеспечивает быстрый поиск с использованием индекса, который нужно предварительно создать, если такого индекса нет, и установить его в качестве текущего. Он позволяет найти только первую запись, удовлетворяющую условию. Синтаксис метода Seek:
<таблица>.Seek <сравнение> ,<ключ1>, <ключ2>,…
Аргумент <сравнение> представляет собой один из операторов сравнения: =, >, >=, < , <=. В аргументах <ключ> указываются значения, которые необходимо найти.
В листинге 3 представлен пример индексного поиска в таблице «ОперУсилители». Ввод условия поиска выполняется через окно InputBox, вывод результата поиска осуществляется в окно MessageBox.
Листинг 3.
' Пример быстрого (индексного) поиска с помощью
' метода Seek для объектов Recordset
Private Sub SeekMkch()
Dim Db As Database, td As TableDef, Surname As String, rs As Recordset
Set Db = CurrentDb
' Создание объекта Recordset
Set rs = Db.OpenRecordset("Студенты", dbOpenTable)
' Установка активного индекса, соответствующий индекс должен существовать
rs.Index = "ФамилияИнд"
Surname = Trim(InputBox("Введите первые буквы фамилии"))
rs.Seek ">=", Surname
' вывод результата поиска
If rs.NoMatch Then
MsgBox "Таких студентов нет!"
Else
MsgBox ("Найдено : " & rs.Fields("Фамилия") & " " _
& rs.Fields("Имя"))
' Вариант вывода в окно Immediate , команда меню View | Immediate Window
' Debug.Print "Найдено : " & rs.Fields("Фамилия") & " " _
& rs.Fields("Имя")
End If
rs.Close
Db.Close
End Sub