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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2008, 09:18   #1
Alexsandr
Пользователь
 
Аватар для Alexsandr
 
Регистрация: 30.09.2007
Сообщений: 70
Вопрос Удаление в связаных таблицах ADO

Доброе время суток! Я начинающий программер, у меня возникла проблемма. Есть БД Access в ней 2 связаные талицы Klient и Rab. При удалении из табл.Klient строка1 удаляеться но с таблицы Rab строка1 не удаляеться Делаю так:

procedure TDelForm.Button1Click(Sender: TObject);
begin
ZakazForm.ZKADOTable.Delete;
Close;
end;

Последний раз редактировалось Alexsandr; 09.02.2008 в 09:55.
Alexsandr вне форума Ответить с цитированием
Старый 09.02.2008, 12:09   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Называется "каскадное" удаление.
Сначала
Код:
SQL.Text:='delete from rab where <поле связи>='+
Quoted(ZakazForm.ZKADOTable.FieldByName('<поле связи>').AsString);
А уже потом
Код:
ZakazForm.ZKADOTable.Delete;
mihali4 вне форума Ответить с цитированием
Старый 10.02.2008, 12:12   #3
Alexsandr
Пользователь
 
Аватар для Alexsandr
 
Регистрация: 30.09.2007
Сообщений: 70
По умолчанию

Спасибо! Но можно по подробней Я не понял надо на форму бросить ADOQuery, а дальше
что писать в SQL и Parametrs ??? В SQL написал
DELETE FROM Rab
WHERE Rab_ID1 = '+'
Выдаёт ошибку Параметры Rab_ID1 не имеет значения по умолчанию.
В что я не правильно сделал подскажите плиз?

Последний раз редактировалось Alexsandr; 10.02.2008 в 12:51.
Alexsandr вне форума Ответить с цитированием
Старый 10.02.2008, 14:28   #4
Pitbull
детский тренер
Форумчанин
 
Аватар для Pitbull
 
Регистрация: 08.06.2007
Сообщений: 532
По умолчанию

Код:
try
              //начинаем транзакцию
DataModule1.ADOConnection1.BeginTrans;
adoQuery1.close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.add('delete from rab where Rab_ID1=' +
Quoted(ZakazForm.ZKADOTable.FieldByName('<поле связи>').AsString);
ADOQuery1.ExecSQL;
ZakazForm.ZKADOTable.Delete; 
DataModule1.ADOConnection1.CommitTrans;
except
ADOConnection1.RollbackTrans;
              ShowMessage('Невозможно выполнить удаление. Повторите.');
end;

или в одном запросе:
Код:

procedure del();
var iDel : integer; //можите String
begin
 if ZakazForm.ZKADOTable.RecordCount=0 then
     begin
        Application.MessageBox(PChar('В базе нет больше записей!'), 'Внимание!!!', MB_OK);
        exit;
     end;
if Application.MessageBox(PChar('Вы действительно хотите удалить данную запись? '), 'Внимание!!!', MB_OKCANCEL)=id_OK then
        //блок обработки исключений
        try
              //начинаем транзакцию
              ADOConnection1.BeginTrans;
              ZakazForm.ZKADOTable.Edit;
              iDel:=ZakazForm.ZKADOTable.fieldByName<имя поля>.AsInteger;//можно указать String-поле...
       //удаление из дочерней таблицы 
                 adoQuery1.close;
                 adoQuery1.sql.Clear;
                 adoQuery1.sql.add('delete from rab');
                 adoQuery1sql.add('where rab_id1= :id;');
                 adoQuery1.Parameters[0].Value :=iDel ;
                 adoQuery1.ExecSQL;
     //удаление из основной таблицы
                       adoQuery1.Active :=false;
                       adoQuery1.sql.Clear;
                       adoQuery1.sql.add('delete from <имя главной таблиці>');
                       adoQuery1.sql.add('where <поле>= :id;');
                       adoQuery1.Parameters[0].Value:=iDel ;
                       adoQuery1.ExecSQL;


             //подтверждаем транзакцию
             ADOConnection1.CommitTrans;
   
  except
              //при ошибке отменяем транзакцию
              ADOConnection1.RollbackTrans;
              ShowMessage('Невозможно выполнить удаление. Повторите.');
     end;
     //обновляем данные
    ZakazForm.ZKADOTable.Active:=false;
    ZakazForm.ZKADOTable.Active:=true;//или Refresh
end;
Я злой и страФный серррый воФк, и в пАрАсятах знаю толк - ppp ppp pp p pp pp

Последний раз редактировалось Pitbull; 10.02.2008 в 14:31.
Pitbull вне форума Ответить с цитированием
Старый 10.02.2008, 16:04   #5
Alexsandr
Пользователь
 
Аватар для Alexsandr
 
Регистрация: 30.09.2007
Сообщений: 70
По умолчанию

что писать в SQL и Parametrs ???
Alexsandr вне форума Ответить с цитированием
Старый 11.02.2008, 01:36   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от Alexsandr Посмотреть сообщение
что писать в SQL и Parametrs ???
Мы вам уже 2 раза ответили на этот вопрос.
У вас со зрением плохо? Или вы только с третьего раза понимать начинаете?
Читайте внимательнее...
А если неясности так и останутся, скачайте с нашего сайта книгу для начинающих. Найдете много интересного для себя.
mihali4 вне форума Ответить с цитированием
Старый 11.02.2008, 15:24   #7
Pitbull
детский тренер
Форумчанин
 
Аватар для Pitbull
 
Регистрация: 08.06.2007
Сообщений: 532
По умолчанию

Я тренером работал мне частенько приходилось встречаться с непониманием...
я так понял,Вам не понятна сама технология запросов..постараюсь объяснить...
Вы можите добавить в самом Delphi (в окне object inspector) вібрать AdoQuery, и в своствах AdoQuery.sql добавить свой запрос...А можно єто делать в самом коде, вот как я делал

Код:
 adoQuery1.close; // закрываем компонент, на открытом нельзя работать   
                 adoQuery1.sql.Clear; //очищаем поле SQL   
                 //добавляем нужній скрипт в запрос
                 adoQuery1.sql.add('delete from rab');   
                 adoQuery1sql.add('where rab_id1= :id;');  //Здесь :id - єто и есть параметр, тоесть SQL  считает, что если стоит : ,то далее следует параметр, которій мі потом передадим
                 adoQuery1.Parameters[0].Value :=iDel ;  //а вот тут мі и передаем параметр, которій первім встречается первім в запросе, если б у нас  біл  еще какой-то параметр, то у него б біл индекс 1... Можно параметр передавать  по имени.... Єто как вам удобнее  
                 adoQuery1.ExecSQL; //віполняем написанное в запросе....

Если Вам не понятно само действие с параметрами, то откажитесь от него и используйте просто :
SQL.Text:='delete from rab where <поле связи>='+
QuotedStr(ZakazForm.ZKADOTable.Fiel dByName('<поле связи>').AsString); // где ві сразу передаете в запрос значение поля таблиці, которое нужно удалить(ваш ключ)... QuotedStr() - єто функция ковычек......
Я злой и страФный серррый воФк, и в пАрАсятах знаю толк - ppp ppp pp p pp pp

Последний раз редактировалось Pitbull; 11.02.2008 в 15:32.
Pitbull вне форума Ответить с цитированием
Старый 18.02.2008, 23:15   #8
Alexsandr
Пользователь
 
Аватар для Alexsandr
 
Регистрация: 30.09.2007
Сообщений: 70
По умолчанию

Спасибо всем большое за науку,всё получилось!!!
Alexsandr вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одновременное удаление записей в разных таблицах Lkhasa БД в Delphi 9 16.12.2010 13:21
Как редактировать дату в связаных таблицах ADO Alexsandr БД в Delphi 1 27.05.2008 09:38
Поиск изменений в Таблицах Pabelu Microsoft Office Excel 3 26.04.2008 17:57
Регистр в таблицах БД Alexij БД в Delphi 3 17.04.2008 13:38