![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление [D7, MySQL]
Вовчик © (2004-07-26 12:43:00)Хочу чтобы при удалении записи из таблицы Cartypes удалялись соответствующие записи в таблице Marks. Пишу вот такой код:
procedure TfDM.CartypesMySqlQueryBeforeDelete(DataSet: TDataSet);
var Count: integer;
begin
if Application.MessageBox(PChar('Удалить все марки автомобилей, имеющих тип "'+CartypesMySqlQuery.FieldByName('Название').AsString+'"?'),'Вопрос',
MB_YESNO+MB_DEFBUTTON2+MB_ICONQUESTION+MB_SYSTEMMODAL)=IDYES then begin
Count:=0;
while MarksMySqlQuery.Locate('Тип',CartypesMySqlQuery.FieldByName('Название').AsString,[]) do begin
inc(Count);
MarksMySqlQuery.Delete;
end;
Application.MessageBox(PChar('Удалено '+IntToStr(Count)+' записей'),'Информация',
MB_ICONINFORMATION+MB_SYSTEMMODAL);
end;
end;
Но удаляются все записи в таблице Marks. Помогите! Что я делаю не так?
Вовчик (2004-07-26 17:04:00) [1]Уф, справился! Часик отдохнул и все решил... :)
Сделал так:
procedure TfDM.CartypesMySqlQueryBeforeDelete(DataSet: TDataSet);
var k,Count: integer; S: string;
begin
if Application.MessageBox(PChar('Удалить все марки автомобилей, имеющих тип "'+CartypesMySqlQuery.FieldByName('Название').AsString+'"?'),'Вопрос',
MB_YESNO+MB_DEFBUTTON2+MB_ICONQUESTION+MB_SYSTEMMODAL)=IDYES then begin
k:=CartypesMySqlQuery.RecNo;
S:=CartypesMySqlQuery.FieldByName('Название').AsString;
Count:=0;
while MarksMySqlQuery.Locate('Тип',S,[]) do begin
inc(Count);
MarksMySqlQuery.Delete;
end;
CartypesMySqlQuery.RecNo:=k;
Application.MessageBox(PChar('Удалено '+IntToStr(Count)+' записей'),'Информация',
MB_ICONINFORMATION+MB_SYSTEMMODAL);
end;
end;
Дело в том, что производя поиск в таблице Marks, курсор перемещается, а т.к. таблицы связаны через DBLookupComboBox, то перемещаемся и по Cartypes. Приходится запоминать текущее значение поля в строке S, чтобы искать всегда одно и то же, и запоминать позицию в Cartypes в переменной k, чтобы удалить потом именно это поле ;) Молодец я? ;)
Соловьев (2004-07-26 15:59:00) [2]
> И все таки какая ошибка в коде?
может баг АДО - ппатч вроде есть на сайте борланда под 7 делфю
Соловьев (2004-07-26 15:58:00) [3]та вообще-то 4 метра
Вовчик (2004-07-26 15:54:00) [4]Сервер весит 800 кБ? Не мало ли?
Соловьев (2004-07-26 15:48:00) [5]
> А про Firebird где можно найти инфу? Как таблицы создавать,
> индексы, установка и настройка сервера... Все с самого начала.
> Спасибо
http://ibase.ru/develop.htm
> Конкретизируйте, будут ли сложности перехода? То "да", то
> "нет"... Ничего не понял :)
я не перходил, но зеос поддерживает Интербез и Файрборд
Вовчик (2004-07-26 15:47:00) [6]И все таки какая ошибка в коде?
Вовчик (2004-07-26 15:44:00) [7]
> Соловьев © (26.07.04 14:15) [8]
>
> > нет, они тоже с ним работают
>
> :) надо под нет- понимать да
Конкретизируйте, будут ли сложности перехода? То "да", то "нет"... Ничего не понял :)
А про Firebird где можно найти инфу? Как таблицы создавать, индексы, установка и настройка сервера... Все с самого начала. Спасибо
Соловьев (2004-07-26 14:15:00) [8]
> нет, они тоже с ним работают
:) надо под нет- понимать да
Соловьев (2004-07-26 14:14:00) [9]
> Где можно взять полнофункциональный сервер IB?
уже давно существует бесплатный(лучший) клон - Firebird
htt://firebird.sourceforge.net
> И сложно ли будет перейти на IB, если я использую компоненты
> Zeos?
нет, они тоже с ним работают
> де почитать можно?
http://www.mysql.ru
Вовчик (2004-07-26 14:12:00) [10]
> триггеры, внешние ключи(кстати, есть уже в Мускуле)
где почитать можно?
> Вообще-то MySQL для таких целе мало подходит.
Ну так люди захотели...
А если перейти на IB? Где можно взять полнофункциональный сервер IB? И сложно ли будет перейти на IB, если я использую компоненты Zeos?
Вовчик (2004-07-26 14:09:00) [11]
> Соловьев © (26.07.04 12:50) [1]
>
> > MarksMySqlQuery.Delete;
>
> а что там за запрос?
> а не проще сделать запрос вида:
> delete from Marks
> where Marks.Type = :param_Cartypes
Запрос обычный типа SELECT * FROM marks
А удалить запросом нельзя, потому что удаление Cartype ведет за собой удаление записей Marks, а удаление Marks ведет удаление записей третьей таблицы (Cars), а если удалять Marks SQL-запросом, то записи в Cars останутся нетронутыми...
Почему-то
MarksMySqlQuery.Locate('Тип',CartypesMySqlQuery.FieldByName('Название').AsString,[])
постоянно возращает ИСТИНу?
Неужели нет выхода?
bushmen (2004-07-26 13:36:00) [12]> (кстати, есть уже в Мускуле)
В том-то и дело, что УЖЕ. Кстати, если мне не изменяет память, то все эти нововведения пошли с версии 4.1. Но многие еще сидят на 4.0... и более ранних. Я только с этой точки зрения. А потом, надо будет еще потестировать этот "навороченный" MySQL по скорости в сравнении с другими СУБД - может уже не будет таким "легким"
Соловьев (2004-07-26 13:30:00) [13]
>
> Вообще-то MySQL для таких целе мало подходит.
почему? вещде это можно сделать: или руцями или автоматом - триггеры, внешние ключи(кстати, есть уже в Мускуле)
bushmen (2004-07-26 13:28:00) [14]> Хочу чтобы при удалении записи из таблицы Cartypes удалялись
> соответствующие записи в таблице Marks.
Вообще-то MySQL для таких целе мало подходит.
Соловьев (2004-07-26 12:50:00) [15]
> MarksMySqlQuery.Delete;
а что там за запрос?
а не проще сделать запрос вида:
delete from Marks
where Marks.Type = :param_Cartypes