Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как организовать связь главный-детальный в таблицах InterBase ? [D5, IB6.x]


rex ©   (2002-04-10 08:18:00) 

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

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

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


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

По моему, надо все осуществить на уровне базы данных, созданием первичных и вторичных ключей. Посмотри 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:43:00) [2]

По моему, надо все осуществить на уровне базы данных, созданием первичных и вторичных ключей. Посмотри 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>)}


Johnmen   (2002-04-10 15:21:00) [3]

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


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

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

Spasibo.


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

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


Johnmen   (2002-04-10 10:10:00) [6]

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


Sergey13   (2002-04-10 10:07:00) [7]

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


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

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


Johnmen   (2002-04-10 10:04:00) [9]

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


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

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


Alexandr   (2002-04-10 10:00:00) [11]

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


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

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


Johnmen   (2002-04-10 08:58:00) [13]

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

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


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

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо