![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как эмулировать связь между таблицами "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]если два бокса одновременно активны быть не могут лучше использовать радиоргуп
они и будут зацикливаться. будут сами друг дргуа переключать в бесконечном цикле