Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо