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

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

Как эмулировать связь между таблицами "master-detail"


DmitryNekl ©   (2004-03-23 11:00:00) 

при использовании Query?

Проблема такая. Есть 3 таблицы. 3-я использует данные из первой и второй (первая и вторая независимы), в каждой таблице - куча данных. Для доступа используются компоненты TADOQuery.

Около первой и второй таблиц есть checkboxы.

Если checkbox у первой таблицы отмечен, то в третьей таблице должны остаться только записи, у которых определенное поле совпадает с текущим в первой таблице. При движении по первой таблице третья меняется.
Аналогично - со второй таблицей. Одновременно оба checkboxа отмечены быть не могут.

Что я делаю? На щелчок по checkboxу обрабатываю событие:

procedure MakeMasterDetailExecute(Sender: TObject);
var s: string;
begin
 if (Sender = checkbox1) then
 begin
   checkbox2.Enabled := not checkbox2.Enabled;
   if checkbox1.Checked then
     s:='SELECT * FROM tbl3 where id1=' + '' + DataModule1.ADOQuery1.Fields.Fields[0].AsString + ''
   else
     s:='SELECT * FROM tbl3';
 end;
 if (Sender = checkbox2) then
 begin
   checkbox1.Enabled := not checkbox1.Enabled;
   if checkbox2.Checked then
     s:='SELECT * FROM tbl3 where id2=' + '' + DataModule1.ADOQuery2.Fields.Fields[0].AsString + ''
   else
     s:='SELECT * FROM tbl3';
 end;
 RunSQL(DataModule1.ADOQuery3, s); //выполняет запрос
end;


Далее обрабатываю событие DataSourceDataChange:

procedure DataModule1.DataSourceDataChange(Sender: TObject; Field: TField);
var
 s: string;
begin
 if Sender=DataSource1 then
 If Form1.checkbox1.Checked then
 begin
   s:='SELECT * FROM tbl3 where id1=' + '' + DataModule1.ADOQuery1.Fields.Fields[0].AsString + '';
   RunSQL(NewsDataModule.ADOQuery3, s);
 end;
 if Sender=DataSource2 then
 If Form1.checkbox2.Checked then
 begin
   s:='SELECT * FROM tbl3 where id2=' + '' + DataModule1.ADOQuery2.Fields.Fields[0].AsString + '';
   RunSQL(NewsDataModule.ADOQuery3, s);
 end;
end;


И при щелчке по любому checkboxу программа зацикливается и виснет при выполнении этой процедуры. Что я делаю не так? В чем ошибка? И как еще можно решить задачу (т.е. эмулировать связь master-detail)?


DmitryNekl   (2004-03-23 12:20:00) [1]

Переписал все с использованием afterscroll вместо DataSourceDataChange и увидел интересную фишку:

procedure DataModule1.ADOQuery1AfterScroll(DataSet: TDataSet);
procedure RunSQL(var Query: TADOQuery; s: string);
begin
 Query.Close;
 Query.SQL.Clear;
 Query.SQL.Add(s);
 Query.Active:=true;
end;
var
 s: string;
begin
 if DataSet=ADOQuery1 then
   If Form1.checkbox1.Checked then
   begin
     s:='SELECT * FROM tbl_Articles_Publications where
       id_gr=' + '' + DataSet.Fields.Fields[0].AsString + '';
     RunSQL(DataModule1.ADOQuery3, s);
   end;
end;


В режиме трассировки по F8 после вызова RunSQL(DataModule1.ADOQuery3, s) снова идет начало процедуры DataModule1.ADOQuery1AfterScroll...

Интересно, каким образом выполнение запроса над ADOQuery3 приводит к скроллингу ADOQuery1???


Sergey13   (2004-03-23 11:48:00) [2]

2DmitryNekl ©   (23.03.04 11:38) [5]
>А пытаюсь отловить изменение текущей записи
В смысле "изменение"? Апдейт или скрол? После перемещения по записям в головных таблицах тебе афтерскрол на них надо обрабатывать.


DmitryNekl   (2004-03-23 11:38:00) [3]

2 bushmen

Конечно, учитываю! Там же идет проверка: если галочка установлена - выбираем часть записей, снята - все записи.

2 Sergey13

Не, не происходит. Причем, что интересно: если вообще выкинуть обработку события DataSourceDataChange, то щелчки по checkboxам обрабатываются хорошо и все работает, как надо... только при изменении текущей записи ничего не происходит. А пытаюсь отловить изменение текущей записи в DataSourceDataChange - зацикливается... :(


bushmen   (2004-03-23 11:24:00) [4]

>На щелчок по checkboxу обрабатываю событие:
А ты не учитываешь, что снятие галочки с чекбокса - это тоже событие обрабатывается?!


Sergey13   (2004-03-23 11:21:00) [5]

Навскидку.
А не происходит по
checkbox2.Enabled := not checkbox2.Enabled;
событие смены значения чекбокса? Не проверял, но похоже. Посмотри под отладчиком.


DmitryNekl   (2004-03-23 11:16:00) [6]

Конструктивно 2 бокса лежат на разных панелях. А где они тут переключают друг друга в цикле? Ткнули по одному - он выключил второй... и пока мы не выключим первый, второй не включится...


stud   (2004-03-23 11:10:00) [7]

если два бокса одновременно активны быть не могут лучше использовать радиоргуп
они и будут зацикливаться. будут сами друг дргуа переключать в бесконечном цикле


Наверх

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