Visual Basic 6. Руководство разработчика

       

Целостность ссылок


База данных NWIND, поставляемая с Visual Basic, предусматривает целостность некоторых отношений. Чтобы увидеть, как это работает, выполните следующие действия.

1. Используя Visual Data Manager, откройте базу данных NWIND и дважды щелкните на таблице Orders (Заказы), содержащей все счета.

2. Выберите счет и запомните ID заказчика, которому выдан счет.

3. Закройте таблицу и дважды щелкните на ее имени таблицы, чтобы открыть ее в режиме ввода данных.

4. Выберите заказчика, ID которого появлялся в счете, и нажмите Delete Механизм JET отобразит сообщение об ошибке (рис. 17.12).

Рис. 17.12. Механизм JET отслеживает целостность отношении

Сообщение об ошибке показывает, что запись, которую пытаются удалить, связана с записями в другой таблице и не может быть удалена.

Если целостность отношений (ссылок) для базы данных важно, то укажите механизму JET следить за его сохранностью. Поддержка целостности ссылок — одна из наиболее важных возможностей системы управления базами данных. Иначе программист следил бы за этим сам, а это — задача не простая.

Хотя можно защитить некоторые ссылки из кода программы, все-таки лучший способ — включить целостность ссылок непосредственно в базу данных. Visual Data Manager для этого не подходит, но можно использовать более совершенные инструменты разработки баз данных, например Microsoft Access, чтобы определить, какие отношения должны быть защищены системой. Эта информация будет сохранена в базе данных

VB6 в действии: проект Data Entry

Построим реальное приложение для ввода данных с возможностями добавления и удаления записей (рис. 17.13). Когда пользователь щелкает на кнопке Add Record, приложение вызывает метод AddNew и обе кнопки одновременно "прячутся". На их месте отображаются обычные кнопки ОК. и Cancel. Можно сохранить новую запись в базе данных, щелкнув на кнопке ОК, или отказаться от сохранения, щелкнув на кнопке Cancel. В любом случае, кнопки ОК и Cancel скроются и снова отобразятся кнопки Add Record (Добавить запись) и Delete Record (Удалить запись).






Рис. 17.13. Приложение Data Entry: ввод данных с помощью элемента Data

Форма приложения Data Entry содержит элемент Data, объект RecordSet которого задает таблицу Titles базы данных BIBLIO. Все элементы управления Textbox связаны с элементом управления Data и отображают поля таблицы Title, ISBN, Description, Subject и Comments.

Каждая запись в таблице Titles имеет ключ, связывающий название книги с фамилией издателя. Вместо использования текстового поля, в котором пользователь мог бы ввести ID издателя, будем использовать элемент управления ComboBox с именами всех издателей. Пользователь может выбрать одного издателя по имени. Этот элемент не является обычным элементом управления ComboBox. Это связанный с данными элемент управления ComboBox, который будет рассмотрен в параграфе "Усовершенствованные элементы управления, связанные с данными" далее в этой главе.

Для построения данного приложения выполните следующие действия.

1. Поместите элемент управления Data на форму и установите в его свойстве DatabaseName (Имя базы данных) путь к базе данных BIBLIO, а в свойстве RecordSource (Источник записей) - таблицу Titles.

2. Разместите на форме пять элементов TextBox (см. рис. 17.13) и свяжите их с элементом Data, имя которого Datal (установлено по умолчанию). Установите в свойстве DataField (Поле) каждого элемента TextBox имя соответствующего поля таблицы.

3. Создайте четыре кнопки Command и установите в их свойствах Name (Имя) и Caption (Надпись) значения, приведенные в табл. 17.9.

Таблица 17.9. Свойства Name и Caption кнопок Command

Caption

Name

Add Record

Delete Record

OK

Cancel

AddBttn (Кнопка добавления)

DelBttn (Кнопка удаления)

OKBttn (Кнопка подтверждения)

Cancel Bttn (Кнопка отмены)

4. Разместите кнопки на форме так, чтобы кнопка ОК совпала с кнопкой Add Record, а кнопка Cancel — с кнопкой Delete.

Теперь можно написать код приложения.

Программа 17.6. Событие Click кнопки Add Record

Private Sub AddBttn_Click()

HideButtons



Data1.Recordset.AddNew

End Sub

Подпрограмма HideButtons прячет кнопки Add Record и Delete Record и отобра­жает две другие. Кнопка Add Record добавляет новую пустую запись в конец набора записей RecordSet и устанавливает элемент управления Data на эту запись. Поль­зователь может ввести новые данные в элементы управления TextBox и, щелкнув на кнопке ОК, записать изменения в базу данных.

Программа 17.7. Событие Click кнопки ОК

Private Sub OKBttn_Click()

On Error GoTo CancelUpdate

Data1.Recordset.Update

ShowButtons

Exit Sub

Cancel-Update:

MsgBox Err.Description

Data1.Recordset.Cancel-Update

ShowButtons

End Sub

Метод Update помещает временную запись в базу данных. Затем подпрограмма ShowButtons скрывает кнопки ОК. и Cancel и отображает две другие.

Предупреждение

Если при изменении базы данных возникает ошибка (вызванная, скорее всего, механизмом JET), то операция должна быть отменена. Поскольку метод Update уже был вызван, то метод Refresh вызывать поздно. Вместо него вызывается метод CancelUpdate (Отменить запись).

Кнопка Cancel удаляет временную запись (отображенную), вызывая метод Refresh, а затем скрывает кнопки ОК и Cancel.

Программа 17.8. Событие Click кнопки Cancel

Private Sub CancelBttn_Click()

Data1.Refresh

Datal.Recordset.FindFirst "Isbn = ' " & prevISBN & " ' "

ShowButtons

End Sub

Если операция добавления отменяется, то происходит возвращение к первой записи таблицы (как при обновлении объекта RecordSet). Чтобы вернуться к по­следней отображенной записи, программа сохраняет значение поля ISBN записи в переменной prevISBN. Это происходит и при нажатии кнопки Add Record. Если пользователь отменяет операцию, то программа находит запись с тем же значением ISBN и снова отображает ее.

Программа 17.9. Событие Click кнопки Delete

Private Sub DelBttn Click()

On Error Resume Next

Datal.Recordset.Delete

If Not Data1.Recordset.EOF Then

Data1.Recordset.MoveNext

Elself Not Data1.Recordset.BOF Then



Data1.Recordset.MovePrevious

Else

MsgBox " This was the last record in the table"

' (Эта запись в таблице была последней)

End If

End Sub

Метод Delete удаляет текущую запись. После операции удаления объект RecordSet не перемещается на другую запись автоматически. Вместо этого он остается на удаленной записи, пока не будет нажата одна из кнопок перемещения. Программа перемещается на следующую запись, если удаленная запись не была последней. В противном случае - перемещается на предыдущую запись. Если уда­ленная запись была единственной в таблице, то программа отобразит сообщение и останется на текущей записи.

Подпрограммы ShowButtons (Показать кнопки) и HideButtons (Спрятать кнопки) манипулируют свойством Visible кнопок. Кроме этого, они отображают и прячут, соответственно, элемент Data, чтобы пользователь мог завершить операцию ввода данных, пользуясь только кнопками ОК или Cancel.

Программа 17.10. Подпрограмма ShowButtons

Sub ShowButtons()

AddBttn Visible = True

DelBttn.Visible =  True

OKBttn.Visible = False

CancelBttn.Visible = False

Data1.Visible = True

End Sub

Если открыть приложение Data Entry, то найдется несколько более интересных подпрограмм. Например, при возникновении события Error элемента управления Data программа отменяет операцию модификации и отображает сообщение об ошибке. Это происходит в том случае, если пользователь, редактируя текущую запись, вводит недопустимую информацию в одно из ее полей.

Программа 17.11. Событие Error элемента Data

Private Sub Datal_Error(DataErr As Integer, Response As Integer)

MsgBox Err Description

Response =  0

Data1.Recordset CancelUpdate

End Sub

При обработке события Validate элемента Data программа выясняет, был ли изменен какой-либо из связанных с данными элементов управления. Если это так, то она запрашивает пользователя, нужно ли сохранить изменения в таблице.

Программа 17.12. Событие Validate

Private Sub Datal_Validate(Action As Integer, Save As Integer)

Dim reply

If txtTitle.DataChanged Or txtISBN.DataChanged Or _

txtDescription.DataChanged Or txtSubject DataChanged _

Or txtComments.DataChanged Then

   reply = MsgBox ("Record has been changed Save?", vbYesNo )

' (Запись была изменена Сохранить? ...)

   If reply = vbNo Then

  Save = False

   End If

End If

End Sub

При обработке события Validate программа, обычно, учитывает значение параметра Action и реагирует согласно действию, вызвавшему ошибку.


Содержание раздела