Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УП 01. Базы данных. Часть 2 — копия.doc
Скачиваний:
33
Добавлен:
09.12.2018
Размер:
637.44 Кб
Скачать

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 выполняются следующие действия:

  1. значение ключевого поля удаляемой из Table1 записи сохраняется в переменной id (это необходимо, поскольку следующий оператор может вызвать перемещение курсора с удаляемой записи) — строка 4;

  2. таблицы связываются между собой так, что главной становится Table1 (связывание таблиц выполняет процедура LinkTables, написанная в соответствии с приведенным ниже способом — см. пример выполнения лаб. работы № 4). В Table1 производится поиск записи, которую ранее выбрал для удаления пользователь. Эти действия обеспечивают вывод всей информации о данном исполнителе — строки 5,6;

  3. производится обработка всех строк таблицы альбомов Table3. Если код исполнителя в текущем альбоме равен сохраненному в переменной id коду, этот альбом удаляется. Иначе производится переход к следующему альбому — строки 7-13.

При вызове метода Table3.Delete также выполнится обработчик события Table3.OnBeforeDelete. Поскольку в данном случае таблицы уже связаны надлежащим образом, в этом обработчике производится только удаление всех записей из таблицы Table4, у которых код альбома равен коду удаляемого альбома (строки 18-25).

Таким образом, единственный вызов Table1.Delete повлечет за собой каскадное удаление из БД всей информации, связанной с удаляемой из Table1 записью.