![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как организовать связь главный-детальный в таблицах 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 . Как это сделать описано в книгах
Архангельского . Я наизусть не помню , но если хотите могу
посмотреть .