Целостность ссылок
База данных 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 (Кнопка отмены) |
Теперь можно написать код приложения.
Программа 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 и реагирует согласно действию, вызвавшему ошибку.