Сделай Сам Свою Работу на 5

Код приложения FindDemo (Поиск записей в RecordSet)





Option Explicit

Dim DB As Database

 

Private Sub Form_Load()

Set DB = OpenDatabase(Data1.DatabaseName)

Dim tbl As TableDef

cmbTables.Clear : cmbFields.Clear

For Each tbl In DB.TableDefs

If Left(tbl.Name, 4) <> "MSys" Then cmbTables.AddItem tbl.Name

Next

Dim fld As Field

For Each fld In DB.TableDefs(0).Fields

cmbFields.AddItem fld.Name

Next

cmbTables.ListIndex = 0

cmbFields.ListIndex = 0

End Sub

 

Private Sub cmbTables_Click()

Dim fld As Field

Dim col As Column

cmbFields.Clear

Do While DBGrid1.Columns.Count > 0

DBGrid1.Columns.Remove 0

Loop

Dim i

i = 0

For Each fld In DB.TableDefs(cmbTables.Text).Fields

cmbFields.AddItem fld.Name

Set col = DBGrid1.Columns.Add(i)

col.Caption = fld.Name

col.DataField = fld.Name

col.Visible = True

i = i + 1

Next

cmbFields.ListIndex = 0

Data1.RecordSource = cmbTables.Text

Data1.Refresh

End Sub

 

Private Sub Command1_Click()

On Error GoTo SQLError

Data1.Recordset.FindFirst GenerateSQL()

If Data1.Recordset.NoMatch Then

MsgBox "Запись не найдена"

End If

Exit Sub

SQLError:

MsgBox Err.Description

End Sub

Private Sub Command2_Click()

On Error GoTo SQLError

Data1.Recordset.FindPrevious GenerateSQL()

If Data1.Recordset.NoMatch Then

MsgBox "Запись не найдена"

End If

Exit Sub

SQLError:

MsgBox Err.Description

End Sub

Private Sub Command3_Click()

On Error GoTo SQLError

Data1.Recordset.FindNext GenerateSQL()

If Data1.Recordset.NoMatch Then

MsgBox "Запись не найдена"

End If

Exit Sub

SQLError:

MsgBox Err.Description

End Sub

Private Sub Command4_Click()

On Error GoTo SQLError

Data1.Recordset.FindLast GenerateSQL()

If Data1.Recordset.NoMatch Then

MsgBox "Запись не найдена"

End If

Exit Sub



SQLError:

MsgBox Err.Description

End Sub

Private Function GenerateSQL() As String

GenerateSQL = "[" & cmbFields.Text & "]" & " " & txtSearchValue.Text

MsgBox GenerateSQL

End Function

 

В процедуре Form_Load() обеспечивается заполнение обоих элементов управления ComboBox. Первый ComboBox заполняется именами таблиц в БД, второй – именами полей в выбранной таблице. Здесь используются объекты DataBase и TableDef, объектная переменная Field, cемейство Fields и его обработка с помощью цикла For Each….Next. Их подробное описание приведено ниже в параграфе "Доступ к полям в объектах RecordSet". В процедуре cmbTables() формируются объекты Column, формирующих столбцы (значения полей таблицы) элемента управления GRID. Коды четырех кнопок поиска идентичны, в них реализуются различные методы поиска. ФункцияGenerateSQL() генерирует параметр поиска для всех операций Find. Значение, возвращаемое функцией GenerateSQL(), используется совместно методами Find. После вызова метода FindFirst программа проверяет свойство NoMatch. Если оно равно True, то программа выводит сообщение. Если запись, соответствующая критерию, найдена, то элемент управления Data автоматически устанавливается на эту запись. Функция GenerateSQL() извлекает строку из текстового поля txtsearchValue, присоеденяет ее к выбранному полю и возвращает строку, использующуюся как параметр методаFind. Большая часть кода приложения обрабатывает потенциальные ошибки.



 

1.5. Реляционныесвязи

БД, используемые в настоящее время, являются реляционными, поскольку они основаны на отношениях между таблицами. Основой системы реляционных БД является разбиение данных на составные таблицы, связанные общей информацией (ключами). Предположим, разрабатывается БД для хранения счетов. Эта БД должна иметь таблицу с именами заказчиков, названиями изделий, ценами, и, конечно, таблицу счетов. Каждый счет, выписанный заказчику, содержит перечень изделий. Вместо того чтобы хранить названия изделий и имена заказчиков в счете, хранятся числа, которые уникально идентифицируют заказчиков и изделия. Эти числа - ключи, связывающие строки одной таблицы со строками другой, позволяют устанавливать связи между таблицами и разделить информацию на отдельные таблицы во избежание ее дублирования.

Первичный ключ

В реляционной системе БД каждая запись имеет уникальный идентификатор, который используется для указания записи и связывания ее с другими записями в других таблицах. В большинстве случаев внимательное изучение данных позволяет обнаружить некую характеристику, делающую каждую запись уникальной. Она и может стать первичным ключом. Первичный ключ такого типа называется композитным. Например, в БД служащих фирмы номер социального обеспечения каждого работника является композитным первичным ключом.



Когда не имеется явного поля или набора полей, которые могут использоваться для формирования композитного первичного ключа, система управления БД Visual Basic (механизм JET) может автоматически генерировать уникальный числовой ключ для каждой записи. Этот ключ предназначен для добавления к таблице поля и установки его типа AutoNumber (Счетчик). Автонумеруемое поле автоматически увеличивается на единицу всякий раз, когда добавляется новая запись. Это гарантирует уникальность ключа, хотя сам ключ необязательно должен что-нибудь означать. До тех пор, пока все таблицы ссылаются на одну запись с помощью одного и того же ключа, последний не обязательно должен иметь содержательный смысл. Иногда автоматически нумеруемый первичный ключ создается для конкретных целей (например, для автоматически формируемого поля номера счета). Целесообразно устанавливать поле первичного ключа типом Long. Это значительно упрощает связывание таблиц.

Внешний ключ

Поле (столбец) в таблице, которое хранит значение, связанное со значением из другой таблицы (как правило, справочником, содержащим первичный ключ), называется внешним ключом. Например, поле в таблице счетов с номером заказчика является внешним ключом. Такое же поле с уникальными значениями номеров заказов в таблице заказчиков является первичным ключом. Внешний ключ должен имеет такой же тип, как и первичный ключ таблицы, с которым он связан. Внешний ключ, как правило, не уникальный.

 

Индексы

Обычно данные в таблице не упорядочены. На практике возникает необходимость получить запрос с выводом записей в определенном порядке. Например, необходимо получить упорядоченный список фамилий, помещаемых в поле “Фамилия” таблицы “Сотрудники” или выполнить поиск нужных фамилий из указанной таблицы. Подобные операции в больших БД выполняются продолжительно, поскольку требуется ее реорганизация. Решение проблемы состоит в том, чтобы поддерживать маленькие таблицы, называемые индексами, которые определяют последовательность чтения записей из таблицы. Индексный файл не содержит информации, которая появлялась бы в таблице непосредственно, а только числа, определяющие порядок записей. Предположим, пятая запись в таблице должна появиться первой, когда строки таблицы запрошены в алфавитном порядке. Первый элемент индексного файла содержит значение 5. Значит, когда из БД будут извлекаться строки заданной таблицы, сначала будет извлечен пятый элемент. Таблица может иметь более одного индекса. Индексы всех таблиц в БД поддерживаются механизмом JET. Единственное, что нужно выполнить, - это задать поля, на которых будет основан индекс. Индекс ускоряет выполнение запросов, в которых используются индексированные поля в условиях выборки, а также индексированные поля в операциях сортировки и группировки.

Когда запись модифицируется, индексы также должны модифицироваться. Это заметно увеличивает время модифицирования записи. Индексы также увеличивают занимаемый объем памяти и, следовательно, время и ресурсы, необходимые для обычного резервирования. Поддержка множественных индексов для каждой таблицы на всякий случай - хорошая идея, однако за индексные файлы нужно платить. Вводить дополнительные индексы надо только в том случае, если они необходимы для соответствующей операции над БД. Слишком много индексов, особенно для очень больших таблиц, которые часто изменяются, замедляют обработку.

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.