Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.18;
Скачать: CL | DM;

Вниз

Как эмулировать связь между таблицами "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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.036 c
1-1080127152
Samael6
2004-03-24 14:19
2004.04.18
LZW and PDF


7-1075682062
Bes
2004-02-02 03:34
2004.04.18
COM порт


1-1080922357
Mim
2004-04-02 20:12
2004.04.18
Клоентно-OLAPные кубы


3-1080065748
pashtet
2004-03-23 21:15
2004.04.18
Oracle и передача данных через итернет.


1-1080795275
GreatMaster
2004-04-01 08:54
2004.04.18
Генерация номеров вида "4E7A9129-A289-4B79-A71C-6883C016A0FE"