The Unofficial Newsletter of Delphi Users - by Robert Vivrette

Альтернатива каскадному удалению

by Matt Hamilton - MHamilton@bunge.com.au

Перевод Руденко Е.В.   janer@newmail.ru    сентябрь  2001 года

 

Наверняка, подобно мне, вы пишете приложения Баз Данных  с отношением  "Master/Detail" между таблицами. И наверняка, вы встречались с проблемой, что делать, когда пользователь удаляет запись в "master" таблице.

Здесь есть два основных варианта:

1. Просто удалить запись и  "осиротить" записи в  detail таблице, которые имеют ссылку на удаленную вами запись.
2. Также удалить и связанные записи (что и называется  "каскадным удалением").
Во многих случаях данных вариантов бывает недостаточно, так что есть третья альтернатива:
3. Связать записи в detail таблице с другой  master таблицей.

Первое, что приходит в голову, сделать новый запрос  TQuery, который возвратит все записи "master" таблицы, за исключением той, которую мы хотим удалить. Чтобы сделать это, добавьте компонент  TDataSource к вашему проекту и установите его свойство  DataSet на таблицу , из которой вы собираетесь удалить запись. Теперь добавьте компонент TQuery и в свойстве DataSource укажите созданный только что  TDataSource.

В моем примере , SQL выглядит так:

select *
from location
where LocationNum <> :LocationNum
Здесь  LocationNum это первичный ключ "location" таблицы. Теперь мы можем использовать этот запрос в  TDBLookupCombo или даже в  TDBGrid, чтобы указать пользователю путь к  месту "destination". Диалог выглядит следующим образом :
 
There a stock items in this location! What would you like to do with them?
(o) Delete them
(o) Move them to: _________
И последнее , что остается сделать , это собственно движение. Это легко сделать при помощи другого запроса TQuery, в котором SQL (в моем примере) выглядит примерно так:
update stock
set LocationNum = :NewLocationNum
where LocationNum = :OldLocationNum


Два параметра :

OldLocationNum: Указатель до удаления
NewLocationNum: Новый указатель пользователя из запроса.
Теперь у вас все есть! И когда пользователь попытается уничтожить  "master" запись, перед ним возникнет вышеуказанный диалог для перенаправления  "detail" записей к другой  "master" записи !  Это дает пользователю большую гибкость, что (я думаю, что все согласны) - отличная вещь.

Возврат в Tips&Tricks