Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Удаление в таблице


Автор: Digo 15.10.2004, 09:18
Приветствую всех обитателей форума.
Я столкнулся с небольшой проблемой. У меня 2 таблицы данных. Между ними
связь мастер детальный по ключевым полям. Нужно что бы при удалении
записи из мастера удалялись все записи относящиеся к тому полю, но сдвига в главной табл.
не происходило. Я пытаюсь удалять записи по средствам перебора по значению
мастера RecNo и ключевому полю подчиненой таблицы. Высвечивается ошибка что таблица не находbncz в режиме редактирования.
Спасибо. qstn.gif
Вот код удаления из подчиненой таблицы
Код

     Max:=DataModule1.CardList.RecordCount;
     DataModule1.CardList.First;
     for i:=1 to max do
     begin
    {ошибка! }    If DataModule1.CardList.Fields[1].AsInteger=DataModule1.Alldilers.RecNo then begin DataModule1.CardList.Edit; DataModule1.CardList.Delete; DataModule1.CardList.Post; end;
     DataModule1.CardList.Next;
     end;

Автор: innok 15.10.2004, 10:13
в "Королевстве Дельфи" есть 3 статьи про ADO, "Немного об использовании ADO в Delphi 1,2,3", там все подробно и прктически твой пример. Можно поискать и через яндекс по названию статьи. Сам искал. Вот выдержки:

Все просто - свойству 'Unique Table' нужно присвоить имя той таблицы, над которой производятся манипуляции (удаления и исправления).
ADODataSet1.Properties['Unique Table'].Value:='Calls';

Свойство 'Resync Command' используется совместно с 'Unique Table' - в этом свойстве задается команда, с помощью которой должна быть обновлена текущая строка, основываясь на значении колонок из таблицы, имя которой заданно свойством 'Unique Table'.
В нашем случае:
ADODataSet1.Properties['Resync Command'].Value:=
'SELECT Abonents.AbonentID AS A_AbonentID, Abonents.AbonentName, Calls.*
FROM Abonents INNER JOIN Calls ON Abonents.AbonentID = Calls.AbonentID
WHERE Calls.CallID = ?';
Это почти такая же SQL команда как и та, с помощью которой открыт наш набор данных - с тем лишь отличием, что она считывает только одну строку, ограничивая по условию WHERE Calls.CallID = ?.
Cursor Engine подставит вместо вопросительного знака текущее значение CallId и выполнит эту команду при обновлении строки.


Автор: Akella 15.10.2004, 15:46
1. на форму кидаешь доп. TQuery
2. в поле MasterSource выбираешь TDataSource мастер-таблицы
3. пишешь в сво-ве SQL
Код
DELETE FROM detailtable WHERE MASTER_ID = :ID


поле ID в местер таблице и поле MASTER_ID в детаил-таблице связаны

в свойстве BeforDelete мастер-таблицы
Код
 if MessageDlg('Удалить все записи из мастер-таблицы', mtWarning, [mbYes, mbNo], 0) = mrYes then  Query1.ExecSQL;

Автор: Vit 15.10.2004, 15:54
Неплохо было бы знать базу данных, иногда такие вещи удобно например триггерами делать

Автор: Akella 15.10.2004, 16:32
Цитата
Неплохо было бы знать базу данных, иногда такие вещи удобно например триггерами делать


абсолютно согласен, но мне почему-то кажется, что он работает с Paradox

Автор: Digo 15.10.2004, 21:39
Спасибо за ответы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)