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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2013, 20:19   #1
reihtmonbern
Форумчанин
 
Регистрация: 08.01.2011
Сообщений: 102
По умолчанию групповое удаление записей

Доброго времени суток, работаю на delphi 2010 + acces 2003 :
делаю групповое удаление записей из нескольких таблиц
Таблица D главная (мастер) а все остальные детальные подчинены ей для этой задачи использую несколько компонентов ADOTable но они не участвуют в процессе удаления, а удаляю я записи через компоненты ADOQuery (связано это с тем что в некоторых таблицах нет соответствующих строк а в некоторых таблицах к одной строке относятся несколько вот. , в ADOTable нельзя использовать sql ) и несколько sql запросов в '''+DBEdit1.Text+'%'' '; отображается значение Код ID потому что по коду происходит связь между таблицами D.Код = P.PKey, D.Код = F. PKey ну и так далее, у каждой подчиненной есть свой код ID, ну короче использую нижеследующий
код:
#
Код:
procedure TForm13.Button18Click(Sender: TObject);
begin
DataModule3.ADOQuery41.Active:=false;
 DataModule3.ADOQuery41.SQL.Text := 'delete from P where PKey Like '''+DBEdit1.Text+'%'' ';
 DataModule3.ADOQuery41.Active:=TRUE;
  DataModule3.ADOQuery40.Active:=false;
 DataModule3.ADOQuery40.SQL.Text := 'delete from F where PKey Like '''+DBEdit1.Text+'%'' ';
 DataModule3.ADOQuery40.Active:=TRUE;
  DataModule3.ADOQuery42.Active:=false;
 DataModule3.ADOQuery42.SQL.Text := 'delete from K where PKey Like '''+DBEdit1.Text+'%'' ';
 DataModule3.ADOQuery42.Active:=TRUE;
 DataModule3.ADOQuery43.Active:=false;
 DataModule3.ADOQuery43.SQL.Text := 'delete from DK where PKey Like '''+DBEdit1.Text+'%'' ';
 DataModule3.ADOQuery43.Active:=TRUE;
 DataModule3.ADOQuery44.Active:=false;
 DataModule3.ADOQuery44.SQL.Text := 'delete from Budilnik where PKey Like '''+DBEdit1.Text+'%'' ';
 DataModule3.ADOQuery44.Active:=TRUE;
 DataModule3.ADOQuery17.Active:=false;
 DataModule3.ADOQuery17.SQL.Text := 'delete from D where Код Like '''+DBEdit1.Text+'%'' ';
 DataModule3.ADOQuery17.Active:=TRUE;
end;
#
И в итоге ничего не удаляется а выскакивает ошибка (рисунок во вложении) а в чём проблема понять ни как не могу вот
P.S. Буду рад за любую подсказку ..
Изображения
Тип файла: jpg Безымянный.jpg (33.1 Кб, 53 просмотров)

Последний раз редактировалось Stilet; 21.01.2013 в 21:05.
reihtmonbern вне форума Ответить с цитированием
Старый 21.01.2013, 20:47   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Active:=TRUE ???
Для этих целей ExecSQL есть
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.01.2013, 02:39   #3
reihtmonbern
Форумчанин
 
Регистрация: 08.01.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Active:=TRUE ???
Для этих целей ExecSQL есть
1) прошу прощения за тупость но что такое есть ExecSQL ? приведите какой нибудь пример по аналогии ...
(( Или вы имеете ввиду написать так
#
DataModule3.ADOQuery17.SQL.Text := 'delete from D where Код Like '''+DBEdit1.Text+'%'' ';
DataModule3.ADOQuery17.ExecSQL;
# )) ???
2) главный вопрос по теме остается не решенным !
3) Может быть у меня вообще неправильный подход решения этой задачи (может кто нибудь мне хотя бы намекнет как её решить ?)

Последний раз редактировалось reihtmonbern; 22.01.2013 в 02:44. Причина: не дописка
reihtmonbern вне форума Ответить с цитированием
Старый 22.01.2013, 07:23   #4
superedward
Форумчанин
 
Аватар для superedward
 
Регистрация: 27.11.2012
Сообщений: 190
По умолчанию

Цитата:
Сообщение от reihtmonbern Посмотреть сообщение
Код:
DataModule3.ADOQuery17.SQL.Text := 'delete from D where Код Like '''+DBEdit1.Text+'%'' ';
DataModule3.ADOQuery17.ExecSQL;
Да, так и нужно. Не мешало бы еще пользоваться with
superedward вне форума Ответить с цитированием
Старый 22.01.2013, 08:35   #5
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

и цикл...
2 варианта
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  DelSQL:array[0..5] of string=(
 'delete from P where PKey Like ''%s%%''',
 'delete from F where PKey Like ''%s%%''',
 'delete from K where PKey Like ''%s%%''',
 'delete from DK where PKey Like ''%s%%''',
 'delete from Budilnik where PKey Like ''%s%%''',
 'delete from D where Êîä Like ''%s%%''');
var
  Command:TADOCommand;
  i:integer;
begin
  Command:=TADOCommand.Create(nil);
  try
    Command.Connection:=DataModule3.Connection;
    for i:=low(DelSQL) to high(DelSQL) do
    begin
      Command.CommandText:=Format(DelSQL[i],[DBEdit1.Text]);
      Command.Execute;
    end;
  finally
    Command.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
const
  DelSQL: string='delete from %s where PKey Like ''%s%%''';
  DelTbl:array[0..5] of string=('P','F','K','DK','Budilnik','D');
var
  Command:TADOCommand;
  i:integer;
begin
  Command:=TADOCommand.Create(nil);
  try
    Command.Connection:=DataModule3.Connection;
    for i:=low(DelTbl) to high(DelTbl) do
    begin
      Command.CommandText:=Format(DelSQL,[DelTbl[i],DBEdit1.Text]);
      Command.Execute;
    end;
  finally
    Command.Free;
  end;
end;
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 22.01.2013, 10:19   #6
reihtmonbern
Форумчанин
 
Регистрация: 08.01.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от Slym Посмотреть сообщение
и цикл...
2 варианта
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  DelSQL:array[0..5] of string=(
 'delete from P where PKey Like ''%s%%''',
 'delete from F where PKey Like ''%s%%''',
 'delete from K where PKey Like ''%s%%''',
 'delete from DK where PKey Like ''%s%%''',
 'delete from Budilnik where PKey Like ''%s%%''',
 'delete from D where Êîä Like ''%s%%''');
var
  Command:TADOCommand;
  i:integer;
begin
  Command:=TADOCommand.Create(nil);
  try
    Command.Connection:=DataModule3.Connection;
    for i:=low(DelSQL) to high(DelSQL) do
    begin
      Command.CommandText:=Format(DelSQL[i],[DBEdit1.Text]);
      Command.Execute;
    end;
  finally
    Command.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
const
  DelSQL: string='delete from %s where PKey Like ''%s%%''';
  DelTbl:array[0..5] of string=('P','F','K','DK','Budilnik','D');
var
  Command:TADOCommand;
  i:integer;
begin
  Command:=TADOCommand.Create(nil);
  try
    Command.Connection:=DataModule3.Connection;
    for i:=low(DelTbl) to high(DelTbl) do
    begin
      Command.CommandText:=Format(DelSQL,[DelTbl[i],DBEdit1.Text]);
      Command.Execute;
    end;
  finally
    Command.Free;
  end;
end;
Спасибо большое за такую мощную помощь но , я так понимаю что мне в дата модуль надо кинуть новый компонент которым я никогда не пользовался = это ADOCommand1 (если я конечно правильно понимаю )
вот это я сделал и код изменил
Код:
var
  Command:DataModule3.TADOCommand1;
  i:integer;
если этого не сделать то делфи пишет = 'Undeclared indentefire:TADOCommand ' если сделать изменения на то что я написал то делфи пишет = Constant or type identifier expected. как быть может есть что по проще для понимания моей головешке
reihtmonbern вне форума Ответить с цитированием
Старый 22.01.2013, 11:10   #7
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

в uses добавь ADODB
кидать ниче нинадо, для разового вызова проще на месте создать, поюзать и убить
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 23.01.2013, 10:30   #8
reihtmonbern
Форумчанин
 
Регистрация: 08.01.2011
Сообщений: 102
По умолчанию

Здравствуйте ещё раз попробовал ваш код всё работает хорошо но , к сожалению не удаляется строка из главной мастер таблицы D вот и делфи ругается выдает ошибку
: Параметр PKey не имеет значения по умолчанию .
стоки из других детальных таблиц удаляются изумительно ,
Решил Ваш код немного изменить вообще удалить из него действия по таблице D чтоб он из неё ни чего не удалял
#
//DelTbl:array[0..5] of string=('P','F','K','DK','Budilnik' ,'D');
DelTbl:array[0..4] of string=('P','F','K','DK','Budilnik' );

#
вот всё работает так же но делфи стал выдавать другую ошибку
: Источник данных изменил или удалил значение ключа для данной строки в хранилище данных . Теперь удалена и локальная строка.

В принципе меня устраивает второй вариант я строку из главной строки удалю дополнительно (ADOTable1.Delete по нажатию на другую кнопку это не страшно , но как сделать так что бы во время работы приложения не выскакивало сообщение типо об ошибке (: Источник данных изменил или удалил значение ключа для данной строки в хранилище данных . Теперь удалена и локальная строка.) я не знаю ...
я использовал свой старый код
#
DataModule3.ADOQuery41.Active:=fals e;
DataModule3.ADOQuery41.SQL.Text := 'delete from P where PKey Like '''+DBEdit1.Text+'%'' ';
DataModule3.ADOQuery41.ExecSQL;
#
и этот код удалят то что мне нужно но всё равно выскакивает ошибка (: Источник данных изменил или удалил значение ключа для данной строки в хранилище данных . Теперь удалена и локальная строка.) ??? как сделать так что бы эта ошибка не выскакивала во время работы приложения ??
во время компиляции всё хорошо .

Последний раз редактировалось reihtmonbern; 23.01.2013 в 10:45.
reihtmonbern вне форума Ответить с цитированием
Старый 23.01.2013, 11:03   #9
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Все верно из базы удалил запросом, все таблицы с изменениями нужно переоткрыть Close Open или Requery

и что-то с логикой не клеится, у тебя главная таблица и подчиненные?
в правильной базе из главной удаляешь из подчиненных автоматом по ключу все чистится, нужно только правильно ключи и связи указать
и не Лайками а четко по значению
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 23.01.2013 в 11:11.
Slym вне форума Ответить с цитированием
Старый 23.01.2013, 11:19   #10
reihtmonbern
Форумчанин
 
Регистрация: 08.01.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от Slym Посмотреть сообщение
Все верно из базы удалил запросом, все таблицы с изменениями нужно переоткрыть Close Open или Requery

и что-то с логикой не клеится, у тебя главная таблица и подчиненные?
в правильной базе из главной удаляешь из подчиненных автоматом по ключу все чистится, нужно только правильно ключи и связи указать
и не Лайками а четко по значению
Да да ты всё правильно понял у меня одна главная D а все остальные подчинены но если я удалю просто из главной то да конечно эти стпроки не будут выводится в дб грид но они всё равно же останутся в базе или не ?? а поясни пожалуйста что значит Close Open или Requery и это как так не лайками типо через = что ли да
reihtmonbern вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать групповое удаление, а не по одному за щелчок. Bushel PHP 6 22.11.2010 12:02
удаление записей aiktz Microsoft Office Access 1 11.11.2010 22:25
Каскадное удаление записей Liones БД в Delphi 7 14.05.2009 08:04
Удаление записей Blackmore БД в Delphi 2 26.05.2008 08:18
Удаление записей Arsgun БД в Delphi 7 09.07.2007 11:56