Форум: "Базы";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
ВнизКак эмулировать связь между таблицами "master-detail" Найти похожие ветки
← →
DmitryNekl © (2004-03-23 11:00) [0]при использовании 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)?
← →
stud © (2004-03-23 11:10) [1]если два бокса одновременно активны быть не могут лучше использовать радиоргуп
они и будут зацикливаться. будут сами друг дргуа переключать в бесконечном цикле
← →
DmitryNekl © (2004-03-23 11:16) [2]Конструктивно 2 бокса лежат на разных панелях. А где они тут переключают друг друга в цикле? Ткнули по одному - он выключил второй... и пока мы не выключим первый, второй не включится...
← →
Sergey13 © (2004-03-23 11:21) [3]Навскидку.
А не происходит по
checkbox2.Enabled := not checkbox2.Enabled;
событие смены значения чекбокса? Не проверял, но похоже. Посмотри под отладчиком.
← →
bushmen © (2004-03-23 11:24) [4]>На щелчок по checkboxу обрабатываю событие:
А ты не учитываешь, что снятие галочки с чекбокса - это тоже событие обрабатывается?!
← →
DmitryNekl © (2004-03-23 11:38) [5]2 bushmen
Конечно, учитываю! Там же идет проверка: если галочка установлена - выбираем часть записей, снята - все записи.
2 Sergey13
Не, не происходит. Причем, что интересно: если вообще выкинуть обработку события DataSourceDataChange, то щелчки по checkboxам обрабатываются хорошо и все работает, как надо... только при изменении текущей записи ничего не происходит. А пытаюсь отловить изменение текущей записи в DataSourceDataChange - зацикливается... :(
← →
Sergey13 © (2004-03-23 11:48) [6]2DmitryNekl © (23.03.04 11:38) [5]
>А пытаюсь отловить изменение текущей записи
В смысле "изменение"? Апдейт или скрол? После перемещения по записям в головных таблицах тебе афтерскрол на них надо обрабатывать.
← →
DmitryNekl © (2004-03-23 12:20) [7]Переписал все с использованием 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???
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.037 c