Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.05.02;
Скачать: [xml.tar.bz2];

Вниз

Как организовать связь главный-детальный в таблицах 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.005 c
1-2533
ATLANTIDO
2002-04-17 23:15
2002.05.02
Button


4-2714
isaveliev
2002-02-27 13:16
2002.05.02
Как отловить факт окончания печати документа


3-2480
KoLega
2002-04-10 18:01
2002.05.02
Нехочу использовать доступ к базе через BDE, а хочу через ADO, но


6-2640
Basty
2002-02-16 09:26
2002.05.02
проблема с Server Socket


7-2703
azik
2002-02-05 14:23
2002.05.02
Люди помогите разобратся с сервисами в Delphi. Спасибо !!!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский