Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.01.2011, 19:27
Аватар для NightVamp
NightVamp NightVamp вне форума
Прохожий
 
Регистрация: 03.01.2011
Адрес: г. Улан-Удэ
Сообщения: 18
Репутация: 10
По умолчанию Межтабличные связи

Собственно, буду кратка - как создать связи между таблицами, например 1:1 или один ко многим. Я имею ввиду с помощью какого компонента? Поподробнее, пожалуйста, напишите! Тип таблиц - dBase IV, создать связи нужно для базы данных, не для приложения. Читала, что компонент MasterSource делает связи, но тогда как с ним работать, если так?
Ответить с цитированием
  #2  
Старый 04.01.2011, 01:01
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вообще, создать физическую связь для таблиц dBase невозможно (на сколько я помню), т.к. данный функционал не поддерживается на уровне БД. Однако, в программе можно настроить компоненты доступа к данным (TTable и TQuery) так, чтобы получить желаемую связь.

Связь создается с помощью свойства MasterSource в подчиненном компоненте. Там при установке значения должен появиться диаложек, где указываются поля для связи.
Ответить с цитированием
  #3  
Старый 04.01.2011, 14:17
Аватар для NightVamp
NightVamp NightVamp вне форума
Прохожий
 
Регистрация: 03.01.2011
Адрес: г. Улан-Удэ
Сообщения: 18
Репутация: 10
По умолчанию

А можно поподробнее, пожалуйста, про настройку компонентов Table и Ouery? Знаю, что как-то можно создать связь через компонент Table по принципу главная-подчинённая таблицы, но как точно? Если знаете, и не трудно, по шагам можете написать? Благодарна за ответ!
Ответить с цитированием
  #4  
Старый 04.01.2011, 14:49
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Допустим вы подключаетесь к DBF через BDE.
1. Добавляете на форму компоненты Table1 и Table2
2. Добавляете на форму компонент DataSource1
Допустим Table1 у вас главная, а Table2 подчиненая, тогда:
Код:
DataSource1.DataSet := Table1;
Table2.MasterSource := DataSource1;
Table2.MasterFields := 'ID'; // ID - это ключевое поле мастер-таблицы
Table2.IndexFieldNames := 'MasterID'; // MasterID - это поле из детайл-таблицы по которому осуществялется связь с мастер-таблицей

Вот собственно и все. Теперь при смене записи в мастер-таблице будет автоматом выбраны подходящие записи из детайл-таблицы
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 04.01.2011, 17:45
Аватар для NightVamp
NightVamp NightVamp вне форума
Прохожий
 
Регистрация: 03.01.2011
Адрес: г. Улан-Удэ
Сообщения: 18
Репутация: 10
По умолчанию

А можно ли так связать таблицы находящиеся на разных формах? Дело в том, что у меня концептуальная модель с бинарными связями и нет таблиц с общими полями соответсвенно...Т.е. на форме с главной таблицей поставить Table1 и DataSource1, а на форме с подчинённой таблицей поставить Table2, который будет видеться как Table1, т.к он на другой форме..? И где писать код, в смысле надо просто писать его во вкладке Unit, если не ошибаюсь?
Ответить с цитированием
  #6  
Старый 04.01.2011, 20:06
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Можно, достаточно в секции Uses упомянуть имя модуля с таблицей, но обычно так не делают. В Дельфи есть специальный вид формы Data Module в котором и размещают все компоненты доступа к БД, а уже потом подключают его к нужным формам по той-же схеме, что я упомянул вначале.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #7  
Старый 04.01.2011, 20:42
Аватар для NightVamp
NightVamp NightVamp вне форума
Прохожий
 
Регистрация: 03.01.2011
Адрес: г. Улан-Удэ
Сообщения: 18
Репутация: 10
По умолчанию

А как создать эту форму Data Module? Как понять подключаться к DBF через BDE? Я вроде никак не подключалась... Просто создавала формы, размещала на них таблицы, запросы, компоненты, необходимые для каждой таблицы или запроса. Мне ведь не нужно удалять созданные формы, а насколько поняла, создать одну Data Module и на ней создавать связи между таблицами?
Ответить с цитированием
  #8  
Старый 04.01.2011, 21:54
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Удалять конечно нет необходимости. Создаете одну форму DataModule куда переносите все компоненты доступа к базе данных. У вас это должны быть TTable,TQuery,TDataSource

Создать Data module можно так:
File|New|Other|Delphi files|Data module

BDE - это просто технология подключения к базам данных. На сегодняшний день считается устаревшей, но во многих случаях - это более удобный способ подключения. Дельфи предоставляет еще ряд технологий подключения к базам данных в том числе ADO. ADO - более продвинутая технология доступа и является альтернативой BDE.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #9  
Старый 06.01.2011, 11:20
Аватар для NightVamp
NightVamp NightVamp вне форума
Прохожий
 
Регистрация: 03.01.2011
Адрес: г. Улан-Удэ
Сообщения: 18
Репутация: 10
По умолчанию

Почитала статью о компонентах доступа с другого сайта с этого форума -там создаётся связь БД Поставщики и Поставки через Table. Но какая именно связь - 1:1, один ко многим, или вообще другого типа, скажите? Спасибо, что отвечаете.
Ответить с цитированием
  #10  
Старый 06.01.2011, 13:10
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Какой именно тип связи определяется содержимым таблиц. Указать каким-либо образом, в настройках этих связей какого они типа для DBF нельзя.
Например, если у меня есть таблица Лицо и в нем есть словарное поле [Пол], то очевидно что связь может быть только 1:1
А вот если мне потребуется хранить информацию об адресе прописки и фактическом адресе проживания, то тут уже будет связь 1:Много
И в первом и втором случае связь между таблицами будет настроена одинаково.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 06.01.2011 в 13:13.
Ответить с цитированием
  #11  
Старый 07.01.2011, 13:18
Аватар для NightVamp
NightVamp NightVamp вне форума
Прохожий
 
Регистрация: 03.01.2011
Адрес: г. Улан-Удэ
Сообщения: 18
Репутация: 10
По умолчанию

Я понимаю, что вы имеете ввиду, но у меня вот такой случай: я делаю БД про собак...Приведу например такие таблиц, которые должны быть связаны между собой связью один ко многим:

СОБАКА
№ Собаки
Кличка
Порода
Возраст
Дата прививки


ВЫСТУПАЕТ
№ Собаки
№ Клуба
№ Ринга
Дата


КЛУБ
№ Клуба
Название
Адрес
Телефон

Т.е. одна собака может выступать в нескольких клубах и в одном клубе может выступать несколько собак. Таблица "Выступает" - таблица-связка из логической модели, насколько я поняла, она не создаётся и не заполняется..? Причём я создала 30 собак и 20 клубов, чтобы как-раз таки в некоторых клубах выступало несколько собак. Вопрос - для таких таблиц с разным количеством записей возможна такая связь через Table? И если сделать такую связь, как распределить какая собака в каком клубе выступает без добавления нового поля?

Последний раз редактировалось NightVamp, 07.01.2011 в 13:36.
Ответить с цитированием
  #12  
Старый 07.01.2011, 14:27
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Не так. Таблица Выступает должна быть реальной. В ней просто будут хранится ссылки (ключи) на таблицу Собака,Клуб и возможно Ринг(если необходимость в такой таблице есть) и какие-то вспомогательные данные - Дата и т.д.
На мой взгляд этих 3-таблиц достаточно для получения полной информации о Выступлении,Клубе,Собаке.
Для ввода информации вполне достаточно такой связки:
Выступает.№Собаки -> Собака.№Собаки
Выступает.№Клуба -> Клуб.№Собаки
С поиском нужной информации по одному или нескольким полям из этих таблиц уже сложнее, но можно реализовать через SQL-запросы.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #13  
Старый 07.01.2011, 19:36
Аватар для NightVamp
NightVamp NightVamp вне форума
Прохожий
 
Регистрация: 03.01.2011
Адрес: г. Улан-Удэ
Сообщения: 18
Репутация: 10
По умолчанию

Т.е. создать эту таблицу-связку также как остальные через DataBase Dekstop и просто заполнить её имеющимися номерами собак, клубов? Кстати, насчёт ринга вы угадали - есть такая таблица(в ней тоже 20 записей). И ещё вопрос - тип таблицы "Выступает" сделать Paradox наверно нужно? И этот способ связи через Table будет подходить если, скажем, выставить на форму все три эти таблицы и начать связывать таблицу "Собака" с "Выступает" и таблицу "Клуб" с "Выступает"?
Ответить с цитированием
  #14  
Старый 07.01.2011, 20:42
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Не надо делать таблицы в разных базах данных. Это не виннегрет. Все таблицы должны быть одного типа. Раз вы начали делать как DBF, то и заканчивать надо тем-же.
Схема конечно сильно упрощенная, по хорошему тут много чего надо добавить и переделать, но для начала и так пойдет.
Изображения
Тип файла: jpg Untitled.jpg (30.7 Кбайт, 10 просмотров)
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 07.01.2011 в 20:59.
Ответить с цитированием
  #15  
Старый 09.01.2011, 13:02
Аватар для NightVamp
NightVamp NightVamp вне форума
Прохожий
 
Регистрация: 03.01.2011
Адрес: г. Улан-Удэ
Сообщения: 18
Репутация: 10
По умолчанию

Вроде бы нашла код для создания первичного ключа:
ALTER TABLE Имя_таблицы
ADD PRIMARY KEY(имя_поля).
Не могу понять куда и как его писать? Раз это команда SQL, значит нужно добавить Query и в его свойстве SQL записать этот код? А можно просто через Database Dekstop изменить структуру таблицы, выбрав индекс?

В вашем файле поля Порода и Кличка указаны как вторичные ключи, кажется..? Зачем они нужны?

Последний раз редактировалось NightVamp, 09.01.2011 в 14:09.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:07.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter