- •Базы данных
- •Содержание
- •Введение
- •1. Создание приложений с использованием технологии bde
- •1.1. Лабораторная работа № 1: создание базы данных
- •1.1.1. Создание таблиц dBase IV
- •1.1.2. Создание индексов
- •1.1.3. Создание таблиц Paradox 7
- •1.1.4. Задание свойств таблицы Paradox 7
- •Задание на лабораторную работу № 1
- •1.2. Лабораторная работа № 2: установление связей между таблицами в многотабличной базе данных
- •1.2.1. Создание алиаса
- •1.2.2. Связывание таблиц
- •Задание на лабораторную работу № 2
- •1.3. Лабораторная работа № 3: работа с полями и компонентом dbGrid
- •1.3.1. Использование объектов-полей
- •1.3.2. Обращение к значению поля
- •1.3.3. События объекта-поля
- •1 Рис. 10. Пример использования события OnCellClick .3.4. События сетки dbGrid
- •1.3.5. Создание объектов-столбцов в dbGrid
- •1.3.6. Формирование списка возможных значений столбца
- •Задание на лабораторную работу № 3:
- •1.4. Лабораторная работа № 4: работа с наборами данных (компонент Table)
- •1.4.1. Открытие и закрытие набора данных
- •1.4.2. Доступ к записям
- •1.4.3. Навигация по набору данных
- •1.4.4. Поиск записей в наборах данных
- •1.4.5. Реализация каскадных изменений
- •1.4.6. Пример выполнения лабораторной работы
- •Задание на лабораторную работу № 4
- •1.5. Лабораторная работа № 5: работа с отчетами
- •1.5.1. Создание простейшего отчета
- •1.5.2. Создание отчета для связанных наборов данных
- •1.5.3. Использование выражений (компонент qrExpr)
- •1.5.4. Группирование данных в отчете
- •Задание на лабораторную работу № 5:
- •1.6. Лабораторная работа № 6: sql-запросы (компонент Query)
- •Задание на лабораторную работу № 6
- •2. Создание приложений, работающих с базами данных interbase
- •2.1. Лабораторная работа № 1: создание схемы базы данных
- •2.2. Лабораторная работа № 2: доступ к базе данных InterBase c использованием dbExpress
- •2.3. Лабораторная работа № 3: транзакции
- •2.4. Лабораторная работа № 4: отображение данных запроса
- •2.5. Лабораторная работа № 5: вычисляемые, агрегатные и подстановочные поля
- •2.5.1. Вычисляемые поля
- •2.5.2. Агрегатные поля
- •2.5.3. Подстановочные поля
- •2.6. Лабораторная работа № 6: связь Master-Detail
- •2.7. Лабораторная работа № 7: локальная репликация данных
- •Приложение 1 варианты заданий к лабораторным работам Вариант 1. Прием заказов
- •Вариант 2. Поставки товаров
- •Вариант 3. Исполнители
- •Вариант 4. Картинная галерея
- •Вариант 5. Порт
- •Вариант 6. Студенты
- •Вариант 7. Строительная компания
- •Вариант 8. Автосалон
- •Вариант 9. Аэропорт
- •Вариант 10. Диагностический центр
- •Вариант 11. Реклама
- •Вариант 12. Быстрая пицца
- •Вариант 13. Клуб собаководов
- •Вариант 14. Грузоперевозки
- •Вариант 15. Аптека
- •Вариант 16. Автовокзал
- •Вариант 17. Общественная организация
- •Вариант 18. Учет потребления газа
- •Приложение 2 порядок выполнения лабораторных работ
- •Библиографический список
1.4.5. Реализация каскадных изменений
Для реализации каскадных изменений в файл-серверных БД используются обработчики событий AfterXXXX и BeforeXXXX. Эти две группы событий связаны с изменениями НД и отличаются тем, что события BeforeXXXX наступают непосредственно перед изменением НД, а события AfterXXXX — сразу после изменения. К ним относятся:
property After/BeforeCancel — после/до отмены изменений в текущей записи;
property After/BeforeClose — после/до отмены закрытия НД;
property After/BeforeDelete — после/до уничтожения текущей записи;
property After/BeforeEdit — после/до редактирования текущей записи;
property After/BeforeInsert — после/до вставки новой записи;
property After/BeforeOpen — после/до открытия НД;
property After/BeforePost — после/до выполнения метода Post;
property After/BeforeScroll — после/до перехода к новой записи;
Обработчики этих событий в качестве параметра получают ссылку на НД, вызвавший соответствующее событие. Если необходимо прервать работу обработчика и предотвратить изменение БД, нужно вызвать процедуру Abort.
Рассмотрим организацию каскадного удаления. Допустим, требуется удалить из БД исполнителя вместе с его альбомами и записями. Для этого необходимо выбрать исполнителя в таблице (предположим, Table1) и вызвать метод Table1.Delete. Чтобы обеспечить удаление всех альбомов этого исполнителя из таблицы альбомов (например, Table3), а также всех записей каждого альбома из таблицы записей (Table4), опишем обработчики событий Table1.OnBeforeDelete и Table3.OnBeforeDelete:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
15 16 17 18 19 20 21 22 23 24 25 26 |
procedure TForm1.Table1BeforeDelete(DataSet: TDataSet); var id: integer; begin id:=Table1['ID_ARTIST']; LinkTables(1); Table1.Locate('ID_ARTIST', id, []); Table3.First; while not Table3.Eof do begin if Table3['ID_ARTIST']=id then Table3.Delete else Table3.Next; end; end;
procedure TForm1.Table3BeforeDelete(DataSet: TDataSet); var id: integer; begin id:=Table3['ID_ALBUM']; Table4.First; while not Table4.Eof do begin if Table4['ID_ALBUM']=id then Table4.Delete else Table4.Next; end; end; |
Поясним приведенный код.
Когда будет вызван метод Table1.Delete, перед удалением записи из Table1 произойдет событие Table1.OnBeforeDelete и выполнится его обработчик. Внутри процедуры Table1BeforeDelete выполняются следующие действия:
значение ключевого поля удаляемой из Table1 записи сохраняется в переменной id (это необходимо, поскольку следующий оператор может вызвать перемещение курсора с удаляемой записи) — строка 4;
таблицы связываются между собой так, что главной становится Table1 (связывание таблиц выполняет процедура LinkTables, написанная в соответствии с приведенным ниже способом — см. пример выполнения лаб. работы № 4). В Table1 производится поиск записи, которую ранее выбрал для удаления пользователь. Эти действия обеспечивают вывод всей информации о данном исполнителе — строки 5,6;
производится обработка всех строк таблицы альбомов Table3. Если код исполнителя в текущем альбоме равен сохраненному в переменной id коду, этот альбом удаляется. Иначе производится переход к следующему альбому — строки 7-13.
При вызове метода Table3.Delete также выполнится обработчик события Table3.OnBeforeDelete. Поскольку в данном случае таблицы уже связаны надлежащим образом, в этом обработчике производится только удаление всех записей из таблицы Table4, у которых код альбома равен коду удаляемого альбома (строки 18-25).
Таким образом, единственный вызов Table1.Delete повлечет за собой каскадное удаление из БД всей информации, связанной с удаляемой из Table1 записью.