Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-1079985015
td
2004-03-22 22:50
2004.04.18
BeforePost и LookUp поле


3-1079556435
dfg
2004-03-17 23:47
2004.04.18
Не восстанавливается бд


7-1076337539
Makhanev A.S.
2004-02-09 17:38
2004.04.18
Как получить название приложения?


14-1080044560
ИМХО
2004-03-23 15:22
2004.04.18
Задачка для шахматистов: хохотал 5 минут


14-1080119346
DEN75
2004-03-24 12:09
2004.04.18
передача звука по сети





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский