Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 05.06.2011, 07:18   #1
%$PROregRAMi$t%
Заблокирован
 
Регистрация: 28.05.2010
Сообщений: 65
По умолчанию Связь многие ко многим

Здравствуйте.
В прикрепленном файле реализована связь "многие ко многим" в виде простейшей БД.

В моем примере при просмотре содержимого коробки - открывается список с идентификаторами фруктов, а не с названием фруктов...
А при просмотре места, где лежит определенный фрукт - ID коробки соответственно, вместо характеристик коробки...

Вопрос: Как правильно настроить корректное отображение связи в MS ACCESS???

Спасибо всем заранее!
Вложения
Тип файла: zip База.zip (32.2 Кб, 38 просмотров)

Последний раз редактировалось %$PROregRAMi$t%; 05.06.2011 в 07:22.
%$PROregRAMi$t% вне форума Ответить с цитированием
Старый 05.06.2011, 08:49   #2
ovt256
Форумчанин
 
Регистрация: 01.04.2011
Сообщений: 226
По умолчанию

У Вас все правильно сделано. Только связь фрукта с коробкой 1 есть, а самой коробки 1 нет. Поэтому результат несколько отличается от ожидаемого. Чтобы избежать подобных ситуаций, поставьте галочку "Обеспечение целостности данных" при описании связи. А запрос должен выглядеть так:
Код:
SELECT Фрукты.Название, Коробки.[Характеристики коробки]
FROM Фрукты INNER JOIN (Коробки INNER JOIN [Коробки-фрукты] ON Коробки.BoxID = [Коробки-фрукты].BoxID) ON Фрукты.FrutID = [Коробки-фрукты].FrutID;
Если руки золотые, то не важно, откуда они растут.

Последний раз редактировалось ovt256; 05.06.2011 в 08:52.
ovt256 вне форума Ответить с цитированием
Старый 05.06.2011, 09:07   #3
%$PROregRAMi$t%
Заблокирован
 
Регистрация: 28.05.2010
Сообщений: 65
По умолчанию

Цитата:
Сообщение от ovt256 Посмотреть сообщение
У Вас все правильно сделано. Только связь фрукта с коробкой 1 есть, а самой коробки 1 нет. Поэтому результат несколько отличается от ожидаемого. Чтобы избежать подобных ситуаций, поставьте галочку "Обеспечение целостности данных" при описании связи. А запрос должен выглядеть так:
Код:
SELECT Фрукты.Название, Коробки.[Характеристики коробки]
FROM Фрукты INNER JOIN (Коробки INNER JOIN [Коробки-фрукты] ON Коробки.BoxID = [Коробки-фрукты].BoxID) ON Фрукты.FrutID = [Коробки-фрукты].FrutID;
Спасибо, исправил. Поставил обеспечение целостности данных и изменил связи со связывающей таблицей - на 1 ко многим. Файл перезалит.

Насчет запросов можно поподробнее, вплоть до матчасти?
Вложения
Тип файла: zip База.zip (31.9 Кб, 32 просмотров)

Последний раз редактировалось %$PROregRAMi$t%; 05.06.2011 в 09:09.
%$PROregRAMi$t% вне форума Ответить с цитированием
Старый 05.06.2011, 09:24   #4
ovt256
Форумчанин
 
Регистрация: 01.04.2011
Сообщений: 226
По умолчанию

Создайте новый запрос с помощью конструктора запросов, добавив любую из Ваших таблиц. Переключите вид просмотра в режим SQL и замените текст запроса на присланный мной. Переключите вид запроса в режим таблица.
Изображения
Тип файла: jpg 1.JPG (45.6 Кб, 170 просмотров)
Тип файла: jpg 2.JPG (17.0 Кб, 91 просмотров)
Тип файла: jpg 3.JPG (27.4 Кб, 100 просмотров)
Если руки золотые, то не важно, откуда они растут.
ovt256 вне форума Ответить с цитированием
Старый 05.06.2011, 10:03   #5
%$PROregRAMi$t%
Заблокирован
 
Регистрация: 28.05.2010
Сообщений: 65
По умолчанию

Спасибо, сделал. Результатом запроса является таблица с полями:
Название
Характеристики коробки

В принципе с таким же успехом можно построить одну таблицу в екселе.


Моя же задача организовать иерархическую структуру в виде открывающихся списков в акссесе.
Так чтобы при вводе в конкретную коробку значений лежащих там фруктов - значения в таблице коробки-фрукты вбивались автоматом, задавая соответствие ID конкретной коробки и ID фрукта. Ну, чтобы в каждой таблице - были эти долбанные плюсики как в explorer'e на папках! )))
Нашел нужное место, открыл список, ввел, и все.

В общем как-то так, как в прикрепленном ниже файле. Пароль - 2 Там одна связь, и данные в обоих таблицах повторяются...
Поэтому решил переделать все в две компактные таблицы и сделать связь "многие ко многим".

ЗЫ: Кстати, гляньте связь в файле ниже.
Она вроде один-к-одному стоит, но по факту - один-ко-многим, не так-ли?
Например в 'коробке с пометкой "Юля" ' находится 5 фруктов в то же время, как 'яблоки' лежат в двух коробках... Не глюк ли это?

Пытался сделать эту связь в новом аксесс-документе - не получилось.
Вложения
Тип файла: zip Еще база.zip (14.3 Кб, 24 просмотров)

Последний раз редактировалось %$PROregRAMi$t%; 05.06.2011 в 10:42.
%$PROregRAMi$t% вне форума Ответить с цитированием
Старый 05.06.2011, 11:01   #6
ovt256
Форумчанин
 
Регистрация: 01.04.2011
Сообщений: 226
По умолчанию

Поскольку у Вас 5 фруктов с разными названиями имеют одинаковый код 1, что не есть правильно, то именно поэтому в коробке с кодом 30 Вы и получили 5 фруктов. Так что это глюк не аксесса, а Ваш

То, что Вы планируете сделать непосредственно из таблиц, невозможно (имхо). Для этого надо использовать формы.
Если руки золотые, то не важно, откуда они растут.
ovt256 вне форума Ответить с цитированием
Старый 05.06.2011, 11:18   #7
%$PROregRAMi$t%
Заблокирован
 
Регистрация: 28.05.2010
Сообщений: 65
По умолчанию

Цитата:
Сообщение от ovt256 Посмотреть сообщение
То, что Вы планируете сделать непосредственно из таблиц, невозможно (имхо). Для этого надо использовать формы.
Все сабжем (с оформлением) разобрался. Вопрос снят. Кому интересно - Тык

Теперь о моей проблеме: хорошо бы было реализовать подтаблицы в виде запросов.

Сообщите пожалуйста, кто нибудь - какой запрос нужно создать для вывода наименований только тех фруктов, которые находятся в конкретной коробке:
Код:
SELECT Фрукты.Название, FROM Фрукты INNER JOIN (Коробки INNER JOIN [Коробки-фрукты] ON Коробки.BoxID = [Коробки-фрукты].BoxID) ON Фрукты.FrutID = [Коробки-фрукты].FrutID;
Этот запрос выводит названия всех фруктов.

Также интересует запрос на выборку данных из "Характеристики коробки" в тех коробках, где содержится определенный тип фруктов.

Как указать текущее значение в виде переменной??? Заранее спасибо!

Последний раз редактировалось %$PROregRAMi$t%; 05.06.2011 в 13:43.
%$PROregRAMi$t% вне форума Ответить с цитированием
Старый 05.06.2011, 15:56   #8
ovt256
Форумчанин
 
Регистрация: 01.04.2011
Сообщений: 226
По умолчанию

Код:
SELECT Фрукты.Название
FROM Фрукты INNER JOIN (Коробки INNER JOIN [Коробки-фрукты] ON Коробки.BoxID = [Коробки-фрукты].BoxID) ON Фрукты.FrutID = [Коробки-фрукты].FrutID
WHERE (((Коробки.BoxID)=2));
где 2 - код исследуемой коробки
Если руки золотые, то не важно, откуда они растут.
ovt256 вне форума Ответить с цитированием
Старый 10.06.2011, 21:12   #9
%$PROregRAMi$t%
Заблокирован
 
Регистрация: 28.05.2010
Сообщений: 65
По умолчанию

В том то и дело, код исследуемой коробки необходимо каждый раз изменять.
Можно ли его указать в виде изменяющейся переменной, значение которой привязано к ID активной строки главной таблицы?

Последний раз редактировалось %$PROregRAMi$t%; 10.06.2011 в 21:15.
%$PROregRAMi$t% вне форума Ответить с цитированием
Старый 11.06.2011, 22:30   #10
ovt256
Форумчанин
 
Регистрация: 01.04.2011
Сообщений: 226
По умолчанию

Создайте форму на базе главной таблицы.
В запросе замените 2 на [Форма]![ID_Коробки]
Если руки золотые, то не важно, откуда они растут.
ovt256 вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме 20000 рублей в месяц

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание связи многие ко многим в Delphi rockedit БД в Delphi 1 11.01.2011 15:10
Связь многие ко многим Dirt БД в Delphi 10 11.05.2010 17:28
Запрос из нескольких таблиц (отношение многие-ко-многим) Машуля SQL, базы данных 6 28.03.2010 08:51
Связь многие-ко-многим andirock2112 БД в Delphi 10 12.04.2009 21:05
Многие ко многим ("")(Э_Є)("") БД в Delphi 1 12.03.2009 01:18


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS