Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2009, 12:23   #1
Liones
Пользователь
 
Аватар для Liones
 
Регистрация: 26.11.2008
Сообщений: 81
По умолчанию Каскадное удаление записей

Есть 2 таблицы. Нужно при удалении записи в главной таблице удалить записи во второй таблице. При этом, если пользователь передумал, то отменить удаление записей. Написала вот такую процедуру:

procedure TDM.TIFBeforeDelete(DataSet: TDataSet);
begin
if DM.TMed.Locate('KOD_IF',DM.TIFKOD_I F.Value,[]) then
begin
if Messagedlg('Найдены связанные записи!'+#13+'Все равно хотите удалить?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
DM.TMed.Filtered:=True;
DM.TMed.Filter:='KOD_IF='+chr(39)+D M.TIFKOD_IF.AsString+chr(39);
kol:=DM.TMed.RecordCount;
DM.TMed.First;
for i:=1 to kol do
begin
DM.TMed.Edit;
DM.TMed.Delete;
DM.TMed.Post;
end;
DM.TMed.Filtered:=False;
end else begin
DM.TIF.RevertRecord;
end;
end;
end;

В принципе работает, но как то коряво. Если пользователь передумал удалять, запись остается в таблице, но в DBGrid не отображается. Чего не хватает?
Liones вне форума Ответить с цитированием
Старый 13.05.2009, 12:38   #2
S@fer
Форумчанин
 
Аватар для S@fer
 
Регистрация: 29.01.2009
Сообщений: 411
По умолчанию

Попробуйте так
Код:
procedure TDM.TIFBeforeDelete(DataSet: TDataSet);
begin
if DM.TMed.Locate('KOD_IF',DM.TIFKOD_IF.Value,[]) then
begin
	if Messagedlg('Найдены связанные записи!'+#13+'Все равно хотите удалить?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
	begin
		DM.TMed.Filtered:=True;
		DM.TMed.Filter:='KOD_IF='+chr(39)+DM.TIFKOD_IF.AsS tring+chr(39);
		kol:=DM.TMed.RecordCount;
		DM.TMed.First;
		for i:=1 to kol do
		begin
			DM.TMed.Edit;
			DM.TMed.Delete;
			DM.TMed.Post;
		end;
		DM.TMed.Filtered:=False;
	end else
	begin 
		DM.TIF.RevertRecord;
		DM.TMed.Close;
		DM.TMed.Open;
	end;
end;
end;
S@fer вне форума Ответить с цитированием
Старый 13.05.2009, 12:44   #3
Liones
Пользователь
 
Аватар для Liones
 
Регистрация: 26.11.2008
Сообщений: 81
По умолчанию

Пробовала, не помогает. Ееще пробовала ACTIVE изменять. Таблица в нормальном состоянии отображается только после перезапуска программы.
Liones вне форума Ответить с цитированием
Старый 13.05.2009, 14:17   #4
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

попробуйте после удаления записи, обновлять все остальные записи. Table1.Refresh. Как то так кажется. Была у меня подобная бяка)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 13.05.2009, 15:01   #5
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

Попробуйте так:

Код:
procedure TDM.TIFBeforeDelete(DataSet: TDataSet);
begin
if DM.TMed.Locate('KOD_IF',DM.TIFKOD_IF.Value,[]) then
begin
	if Messagedlg('Найдены связанные записи!'+#13+'Все равно хотите удалить?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
	begin
		DM.TMed.Filtered:=True;
		DM.TMed.Filter:='KOD_IF='+chr(39)+DM.TIFKOD_IF.AsS tring+chr(39);
		kol:=DM.TMed.RecordCount;
		DM.TMed.First;
		for i:=1 to kol do
		begin
			DM.TMed.Edit;
			DM.TMed.Delete;
			DM.TMed.Post;
		end;
		DM.TMed.Filtered:=False;
	end else
	begin 
		Abort;
	end;
end;
end;
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.
Andrei вне форума Ответить с цитированием
Старый 14.05.2009, 07:26   #6
Liones
Пользователь
 
Аватар для Liones
 
Регистрация: 26.11.2008
Сообщений: 81
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
попробуйте после удаления записи, обновлять все остальные записи. Table1.Refresh. Как то так кажется. Была у меня подобная бяка)
И это пробовала
Liones вне форума Ответить с цитированием
Старый 14.05.2009, 07:32   #7
Liones
Пользователь
 
Аватар для Liones
 
Регистрация: 26.11.2008
Сообщений: 81
По умолчанию

Цитата:
Сообщение от Andrei Посмотреть сообщение
end else
begin
Abort;
end;
end;
end;[/CODE]
Вот это работает. Спасибо
Liones вне форума Ответить с цитированием
Старый 14.05.2009, 08:04   #8
Rekky
Форумчанин
 
Аватар для Rekky
 
Регистрация: 14.01.2009
Сообщений: 312
По умолчанию

Транзакции и запросы решили бы этот вопрос гораздо красивей и проще,да и ошибок было бы меньше
Никому не поставить нас на колени! Мы лежали и будем лежать!
Rekky вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Каскадное удаление и модификация таблиц Абдуллаев Рустам БД в Delphi 6 01.05.2009 20:47
каскадное удаление Skolot Microsoft Office Access 0 20.04.2009 11:12
Удаление записей Blackmore БД в Delphi 2 26.05.2008 08:18
Каскадное удаление BustA SQL, базы данных 1 16.01.2008 10:31
Удаление записей Arsgun БД в Delphi 7 09.07.2007 11:56