Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБОРАТОРНАЯ РАБОТА_5_2012.doc
Скачиваний:
11
Добавлен:
25.08.2019
Размер:
75.78 Кб
Скачать

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