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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.04.2009, 18:05
antonsnit antonsnit вне форума
Прохожий
 
Регистрация: 16.04.2009
Сообщения: 6
Репутация: 10
По умолчанию Как организовать связь многие ко многим через ADO?

Вопрос такой: каким образом можно организовать связь таблиц (ADOTable) находящихся в отношении многие ко многим между собой через кросс таблицу в делфи.

Связать две таблицы в отношении один-ко-многим просто - я указывал mastersource и masterfield у подчиненной таблицы, но два mastersource не существует...

-----------------------------------------------------
Чем пользуюсь: Delphi 7, MS SQL Server 2005 EE, ADO
Ответить с цитированием
  #2  
Старый 16.04.2009, 19:36
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Связь реализуется на БД.
А в клиенте ты ее нормально все-равно не покажешь. Так что тут достаточно 2х компонентов. Подробнее задачу давай, т.к. не понятно что конкретно ты хочешь.

Например, есть, ну не знаю... аренда машин. Есть табоица клиентов и таблица машин. Нам интересно знать какие машины клиент вообще брал в аренду. Задача чисто умозрительная. В реале такие задачи так не решаются.
Соответсвенно, делаем таблицу Clients и таблицу Cars, ну и отношение между ними м-к-м в таблице ClientsCars. Так вот в приложении тебе все-равно надо показывать либо машины, ктоторые брал конкретный клиент, либо клиентов, кторые брали конкретную машину. Т.е. в обоих случаях отношение отображается на самом деле один-ко-многим. Ну а запрос будет примерно такой:

Код:
SELECT C.*
FROM Cars C LEFT JOIN ClientsCars CC ON C.ID = CC.CarID
WHERE CC.ClientID = :ClientID

Т.е. мы сотмрим какие машины брал клиент. Для этого склеиваем таблицу Машин и таблицу МашинКлиентов и фильтруем результат по клиенту (параметр в WHERE).
Ответить с цитированием
  #3  
Старый 16.04.2009, 20:06
antonsnit antonsnit вне форума
Прохожий
 
Регистрация: 16.04.2009
Сообщения: 6
Репутация: 10
По умолчанию

ну это вроде понятно.. Меня интересует возможность редактирования информации и ввода новой информации, а с этим как я понимаю сложнее.
У меня есть такая связка таблиц "Сотрудник" <-> "СотрудникПриказ" <-> "Приказ". Таблица "СотрудникПриказ" содержит внеш.ключи на "Сотрудник" и на "Приказ". В своей программе я открываю сотрудников - они у меня отображены в dbgrid, а рядом кнопка "Создать приказ" по которой открывается новая форма, где вводятся данные приказа. Как сделать ввод и сохранение данных приказа?
Ответить с цитированием
  #4  
Старый 16.04.2009, 20:29
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Так и делать. Работа с таблицей приказов.
Только при сохранении данных ты должен добавить еще запись в таблицу СотрудникПриказ. Вот и вся разница.
Ответить с цитированием
  #5  
Старый 16.04.2009, 23:02
antonsnit antonsnit вне форума
Прохожий
 
Регистрация: 16.04.2009
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Так и делать. Работа с таблицей приказов.
Только при сохранении данных ты должен добавить еще запись в таблицу СотрудникПриказ. Вот и вся разница.

Меня как раз интересуют технические моменты: каким образом следует добавлять запись в "СотрудникиПриказы"? Допустим у меня такой код на сохранение изменений в таблице "Приказы":
if DataModuleUnit.OrdersTable.Modified then
DataModuleUnit.OrdersTable.Post;
Как теперь добавить запись в "СотрудникиПриказы"?
Ответить с цитированием
  #6  
Старый 16.04.2009, 23:26
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

1. Прежде чем добавить, сделайте проверку на повтор данных.
2. Постарайтесь неиспользовать прямое обращение к таблице. Все через запрос.
Примерно так можно организовать ввод сотрудника
Код:
Q := TAdoQuery.Create(nil); 
Q.Connection := MyDB;
Q.SQL.Text := 'select КодСотрудника from Сотрудники where Сотрудник=:Сотрудник';
Q.Parameters.ParamValues['Сотрудник'] := Edit1.Text;
Q.Open;
if Q.isEmpty
then begin
       Q.SQL.Text := 'insert into Сотрудники (Сотрудник) values(:Сотрудник)';
       Q.Parameters.ParamValues['Сотрудник'] := Edit1.Text;
       Q.ExecSql;
       Q.SQL.Text := 'select Max(КодСотрудника) as КодСотрудника from Сотрудники';
       Q.Open;
       end;
EmployeeKey := Q.FieldValues['КодСотрудника'];
По аналогии можете сделать все остальное
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #7  
Старый 17.04.2009, 01:33
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Цитата:
Сообщение от antonsnit
Меня как раз интересуют технические моменты: каким образом следует добавлять запись в "СотрудникиПриказы"? Допустим у меня такой код на сохранение изменений в таблице "Приказы":
if DataModuleUnit.OrdersTable.Modified then
DataModuleUnit.OrdersTable.Post;
Как теперь добавить запись в "СотрудникиПриказы"?
Вы про это?
Так как я писал ранее, прежде чем добавить в таблицу СотрудникиПриказы что-либо вам необходимо получить пару значений КодПриказа из Приказов и КодСотрудника из Сотруднков.
Или вы незнаете комманды Append для таблицы?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #8  
Старый 16.04.2009, 20:30
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Вы как-то не тем путем пошли. Делайте так как это происходит в реале.
Сначала рождается приказ за каким-то номером, в котором перечислены сотрудники.
1. Вы заносите в таблицу приказов новую запись, получаете ее номер.
2. Затем в таблицу Сотрудников добавляете/выбираете запись на сотрудника получаете его код.
3. Наконец в таблицу СотрудникПриказ добавляете запись с кодом сотрудника и кодом приказа.
4. Повторяете п.2,3 для всех сотрудников перечисленых в приказе.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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