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

Вниз

Как организовать связь главный-детальный в таблицах InterBase ?   Найти похожие ветки 

 
rex   (2002-04-10 08:18) [0]

Уважаемые мастера ! Я создал базу данных состоящую из двух таблиц между которыми должна быть связь "главный-детальный". Для организации подобной связи я использовал следующий код. который записан по событию AfterScroll:

DataM.IBDataSet2.Close;
DataM.IBDataSet2.SelectSQL.Text:="select * from mytable2 where id="+""""+IntToStr(DataM.IBDataSet1id.Value)+"""";
DataM.IBDataSet2.Open;

Однако, если с базой работать по сетке программа начинает тормозить. По полю id создан индекс, что немного убыстрило работу, но не так как хотелось бы. Проблема ещё в том, что у второй таблицы также должна быть своя дочерняя таблица. Подскажите, как лучше связать таблицы ?


 
Джафар   (2002-04-10 08:33) [1]

Насколько я знаю такую связь можно заложить ещё при
создании таблиц в IB . Как это сделать описано в книгах
Архангельского . Я наизусть не помню , но если хотите могу
посмотреть .


 
rex   (2002-04-10 08:54) [2]

Было бы замечательно.


 
Johnmen ©   (2002-04-10 08:58) [3]

Если на уровне приложения с использованием IBX, то
свойство Datasource детального НД = мастерному НД.

На уровне БД - Primary key, Foreign key...


 
rex   (2002-04-10 09:54) [4]

2Johnmen
Я указал в свойстве IBDataSet2.DataSource=DataSource1, но так и не понял, что это даёт, поскольку никаких изменений не произошло.
А primary и foreign key необходимы для ссылочной целостности, а я сейчас хочу, чтобы при перемещении по главной таблице автоматически появлялись соответствующие записи из дочерней. Или я что-то путаю :)


 
Alexandr ©   (2002-04-10 10:00) [5]

нужно для дочерней таблицы запрос подкорректировать


 
Anatoly Podgoretsky ©   (2002-04-10 10:02) [6]

В BDE я бы написал так:
DataM.Query.SQL.Text:="select * from mytable2 where id=:ID";
Может и здесь так надо, только убери из обработчика


 
Johnmen ©   (2002-04-10 10:04) [7]

Поясняю :
1. IBDataSet2.DataSource=DataSource1
2. DataSource1.DataSet=IBDataSet1
3. В SelectSQL для IBDataSet2 должно быть ...WHERE id2=:id1 ...
где id1 - ссылочное поле из IBDataSet1, id2 - ключевое в IBDataSet2


 
Johnmen ©   (2002-04-10 10:05) [8]

Поясняю :
1. IBDataSet2.DataSource=DataSource1
2. DataSource1.DataSet=IBDataSet1
3. В SelectSQL для IBDataSet2 должно быть ...WHERE id2=:id1 ...
где id1 - ключевое поле из IBDataSet1, id2 - ссылочное в IBDataSet2


 
Sergey13 ©   (2002-04-10 10:07) [9]

Попробуй в запросе использовать параметры вместо прямого формирования текста запроса. А велика ли вторая таблица?


 
Johnmen ©   (2002-04-10 10:10) [10]

...и, как заметил Anatoly Podgoretsky ©, обработчик убрать...


 
rex   (2002-04-10 12:39) [11]

Заработало !!!
Кстати говоря вторая таблица не очень большая - около 29000 записей, но отсутствие опыта является самым большим тормозом :). Всем большое спасибо, особенно Johnmen.


 
Edas   (2002-04-10 14:55) [12]

A kak sdelat" chtoby takaja sviazka zarabotala s IBQueryMaster ir IBQueryDetail?

Spasibo.


 
Johnmen ©   (2002-04-10 15:21) [13]

>Edas (10.04.02 14:55)
IBQueryDetail.Filtered=True и в обработчике OnFilterRecord :
Accept:=IBQueryDetail["id2"]=IBQueryMaster["id1"]


 
Леха   (2002-04-10 15:43) [14]

По моему, надо все осуществить на уровне базы данных, созданием первичных и вторичных ключей. Посмотри help по SQL командам для Interbase.
ALTER TABLE table <operation> [, <operation> …];
| ADD <tconstraint>
<col_constraint> = [CONSTRAINT constraint]
{ UNIQUE
| PRIMARY KEY
| REFERENCES other_table [(other_col [, other_col …])]
[ON DELETE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}]
[ON UPDATE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}]

| CHECK (<search_condition>)}


 
Леха   (2002-04-10 15:44) [15]

По моему, надо все осуществить на уровне базы данных, созданием первичных и вторичных ключей. Посмотри help по SQL командам для Interbase.
ALTER TABLE table <operation> [, <operation> …];
| ADD <tconstraint>
<col_constraint> = [CONSTRAINT constraint]
{ UNIQUE
| PRIMARY KEY
| REFERENCES other_table [(other_col [, other_col …])]
[ON DELETE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}]
[ON UPDATE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}]

| CHECK (<search_condition>)}



Страницы: 1 вся ветка

Текущий архив: 2002.05.02;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.007 c
1-2532
Ежик2
2002-04-21 19:23
2002.05.02
А где берут модуль Match?


1-2614
dfdfd
2002-04-20 17:43
2002.05.02
Как перевести String в Pchar?


1-2566
Po
2002-04-19 12:29
2002.05.02
Печать


1-2571
Alexei_III
2002-04-19 13:29
2002.05.02
Как определить из какой формы было вызвано текущее окно?


1-2542
roman001
2002-04-18 18:32
2002.05.02
TStringGrid.Objects