Форум по 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,015
Версия 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,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Так и делать. Работа с таблицей приказов.
Только при сохранении данных ты должен добавить еще запись в таблицу СотрудникПриказ. Вот и вся разница.
Ответить с цитированием
  #5  
Старый 16.04.2009, 20:30
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

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

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

Меня как раз интересуют технические моменты: каким образом следует добавлять запись в "СотрудникиПриказы"? Допустим у меня такой код на сохранение изменений в таблице "Приказы":
if DataModuleUnit.OrdersTable.Modified then
DataModuleUnit.OrdersTable.Post;
Как теперь добавить запись в "СотрудникиПриказы"?
Ответить с цитированием
  #7  
Старый 16.04.2009, 23:26
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 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['КодСотрудника'];
По аналогии можете сделать все остальное
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #8  
Старый 17.04.2009, 00:00
antonsnit antonsnit вне форума
Прохожий
 
Регистрация: 16.04.2009
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
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['КодСотрудника'];
По аналогии можете сделать все остальное
Спасибо, попробую сделать так.
Ответить с цитированием
  #9  
Старый 17.04.2009, 00:10
antonsnit antonsnit вне форума
Прохожий
 
Регистрация: 16.04.2009
Сообщения: 6
Репутация: 10
По умолчанию

lmikle, интересно еще твое мнение по вопросу #6.
Ответить с цитированием
  #10  
Старый 17.04.2009, 01:33
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
Сообщение от antonsnit
Меня как раз интересуют технические моменты: каким образом следует добавлять запись в "СотрудникиПриказы"? Допустим у меня такой код на сохранение изменений в таблице "Приказы":
if DataModuleUnit.OrdersTable.Modified then
DataModuleUnit.OrdersTable.Post;
Как теперь добавить запись в "СотрудникиПриказы"?
Вы про это?
Так как я писал ранее, прежде чем добавить в таблицу СотрудникиПриказы что-либо вам необходимо получить пару значений КодПриказа из Приказов и КодСотрудника из Сотруднков.
Или вы незнаете комманды Append для таблицы?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #11  
Старый 19.12.2010, 02:32
ColoCat ColoCat вне форума
Прохожий
 
Регистрация: 19.12.2010
Сообщения: 1
Репутация: 10
Восклицание Создание БД каталога автозапчастей

Здравствуйте!
Помогите пожалуйста!
Мне нужно создать проект работы каталога автозапчастей.
Т.е. каталог я создала всё по нему сделала,теперь нужно сделать так что бы осуществлялся заказ из этого каталога
И у меня получается что один клиент может заказать несколько деталей
И мне нужно что бы на форме выводился список список клиентов,и при нажатии на одного из них выдавался список деталей которые он заказал
Из каталога должны браться два поля Номер по каталогу и Наименование детали
Как это можно осуществить,подскажите пожалуйста!!Очень срочно нужно
Работа с БД в Accesse
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter