Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 175
1

Связь один-ко-многим. Разъяснение

08.09.2017, 09:38. Показов 4009. Ответов 19
Метки нет (Все метки)

Здравствуйте, Уважаемые форумчане!

Подскажите, пожалуйста. Дано: таблица с работами и таблица с проектами, связь один-ко-многим. То есть, каждая работа содержит в себе множество проектов. Связь Код-idJobs. В данный момент, в idJobs пишем Код из таблицы с работами, и можно фильтровать по этому полю, получая проекты привязанные к конкретно этому виду работ.

Необходимо: проект из одной работы увязать с другой работой. То есть, чтобы один проект мог участвовать (а значит быть виден при фильтрации/отборе в форме) в разных работах. Дабы не дублировать записи о проектах. Записать бы в idJobs 1,4,18,5, но как это обрабатывать? Да и поле придется перевести в строку...Вобщем, как-то это делается, а я не знаю

Картинки прилагаю.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Миниатюры
Связь один-ко-многим. Разъяснение   Связь один-ко-многим. Разъяснение   Связь один-ко-многим. Разъяснение  

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.09.2017, 09:38
Ответы с готовыми решениями:

Устанавливается связь один-к-одному вместо один-ко-многим
Здравствуйте, скажите пожалуйста почему между данными таблицами устанавливается связь один-к-одному...

Связь один ко многим
Помогите пожалуйста. Проблема со связью "Один ко многим". Мне нужно чтобы связь была такой: а...

Связь один ко многим
Здравствуйте уважаемые форумчане. Помогите с базой данных. Я сделала базу данных, теперь такая...

Связь один-ко-многим
Здравствуйте! В БД есть таблицы bulding и flat, в них содержатся поля STREET и HOUSE. Пытаюсь...

19
943 / 391 / 110
Регистрация: 21.03.2013
Сообщений: 1,042
08.09.2017, 09:44 2
Это уже другая задача
Имеем ТаблицаРаботы и таблицаПроекты. Работа может состоять из нескольких проектов и Проект может входить в разные работы
Делаем новую таблицу РаботаПроект из двух ключевых полей КодРаботы и КодПроекта. Старые связи разрываем и делаем связи один ко многим ТаблицаРаботы(КодРаботы) - РаботаПроект(Кодработы) и аналогично таблицаПроекты(КодПроекта)- РаботаПроект(КодПроекта)
2
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 175
08.09.2017, 09:58  [ТС] 3
Вон оно как, не подумал...
0
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 175
08.09.2017, 10:49  [ТС] 4
Правильно?
0
Миниатюры
Связь один-ко-многим. Разъяснение  
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 175
08.09.2017, 10:50  [ТС] 5
В таком случае не позволяет ввести только лишь работу, требует наличия записи в NameProject.
А работа может пока повисеть и без проекта...
0
943 / 391 / 110
Регистрация: 21.03.2013
Сообщений: 1,042
08.09.2017, 11:12 6
Цитата Сообщение от Chuvaschow Посмотреть сообщение
А работа может пока повисеть и без проекта...
тогда зачем ее добавлять в связку РаботаПроект? Нет необходимости.
Работа есть в таблицеРабота - когда появится связанный проект, тогда и добавите в связку. Более того можно будет запросом выбрать работы без проекта. Тоже по аналогии относится и к проекту - который тоже может повисеть без работы.
1
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 175
08.09.2017, 11:53  [ТС] 7
Понял. Попробую запилить.
0
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 175
08.09.2017, 12:25  [ТС] 8
Из той же оперы (чтобы не плодить тем) - сделал форму, в которой хочу отмечать флажками работы, в которые хочу включить проект. Флажки, ясное дело, нажимаются все разом. Но и в таблицу сделать логическое поле с флажком никак нельзя - ведь он будет принимать разные значения.
0
Миниатюры
Связь один-ко-многим. Разъяснение  
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 175
08.09.2017, 14:20  [ТС] 9
Такая простая вещь, но не для accessa...всю голову сломал...
0
Эксперт MS Access
26636 / 14329 / 3172
Регистрация: 28.04.2012
Сообщений: 15,713
08.09.2017, 14:28 10
Цитата Сообщение от Chuvaschow Посмотреть сообщение
Такая простая вещь, но не для accessa...
Ну не все так безрадостно . И в аксе что-то можно придумать
2
Вложения
Тип файла: rar FormCheck2003.rar (34.0 Кб, 15 просмотров)
Модератор
Эксперт MS Access
3404 / 1898 / 470
Регистрация: 12.06.2016
Сообщений: 4,848
08.09.2017, 15:14 11
Chuvaschow,

Табличку служебную с флажками заведите и связывайте по INNER JOIN.

Пример уважаемого mobile пока посмотреть не могу - без компьютера.
Потом посмотрю, если версия Access не больше 2007-го.
1
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 175
08.09.2017, 15:24  [ТС] 12
Цитата Сообщение от mobile Посмотреть сообщение
И в аксе что-то можно придумать
Это видел, да. Фиговенько как-то. Кроме того нужно галочки выставлять при открытии такой формы с разными отборами, а это уже совершенно другая история, страна
0
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 175
11.09.2017, 12:34  [ТС] 13
Господа, подскажите как быть. Пытаю все вытащить все работы, в которых не участвует конкретный проект, то есть по которому нет записи в общей таблице.

при таком запросе:

SQL
1
2
3
4
5
6
7
SELECT tblJobs.Код, tblJobs.TypesJobs, tblJobsNameProject.idJobs,
 tblJobsNameProject.idNameProject
 
FROM tblJobs
 LEFT JOIN tblJobsNameProject
   ON tblJobs.Код = tblJobsNameProject.idJobs
WHERE (((tblJobs.idObjectBuilding)=[Формы]![frmJobsJournal]![KodObjectBuilding]));
Получаю полный перечень работ в рамках объекта строительства. (картинка Запрос 1)
Номер проекта 17. Видим, что связь по некоторым работам уже есть (idNameProject = 17). Логично было бы исключить все строки с idNameProject равным 17 и тогда мы узнаем в каких работах этот проект еще не участвует.

Привожу запрос к виду

SQL
1
2
3
4
5
6
7
8
SELECT tblJobs.Код, tblJobs.TypesJobs, tblJobsNameProject.idJobs,
 tblJobsNameProject.idNameProject
 
FROM tblJobs
 LEFT JOIN tblJobsNameProject
   ON tblJobs.Код = tblJobsNameProject.idJobs
WHERE (((tblJobsNameProject.idNameProject)<>[Формы]![frmJobsJournal]![KodProject])
 AND ((tblJobs.idObjectBuilding)=[Формы]![frmJobsJournal]![KodObjectBuilding]));
И access убирает строки, в которых idNameProject не заполнен. Пробовал в условие дописать что-то вроде ИЛИ равно NULL, но результат тот же.

Как надо?
0
Миниатюры
Связь один-ко-многим. Разъяснение   Связь один-ко-многим. Разъяснение  
Эксперт MS Access
26636 / 14329 / 3172
Регистрация: 28.04.2012
Сообщений: 15,713
11.09.2017, 14:00 14
Цитата Сообщение от Chuvaschow Посмотреть сообщение
вытащить все работы, в которых не участвует конкретный проект, то есть по которому нет записи в общей таблице.
Попробуйте так
SQL
1
2
3
4
5
6
7
SELECT tblJobs.Код, tblJobs.TypesJobs
FROM tblJobs LEFT JOIN 
(SELECT idJobs, SUM(idObjectBuilding=Forms!frmJobsJournal!KodObjectBuilding) AS v 
   FROM tblJobsNameProject 
   GROUP BY idJobs) z
ON tblJobs.Код = z.idJobs
WHERE z.v=0
Добавлено через 16 минут
Поправка. Наверное перепутал коды и поля формы. Видимо правильно будет так
SQL
1
2
3
4
5
6
7
SELECT tblJobs.Код, tblJobs.TypesJobs
FROM tblJobs LEFT JOIN 
(SELECT idJobs, SUM(idNameProject=Forms![frmJobsJournal]![KodProject]) AS v 
   FROM tblJobsNameProject 
   GROUP BY idJobs) z
ON tblJobs.Код = z.idJobs
WHERE z.v=0
1
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 175
11.09.2017, 14:00  [ТС] 15
Получается нечто из другого объекта строительства даже
0
Изображения
 
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 175
11.09.2017, 14:24  [ТС] 16
во втором случае набирает пустоту
0
Эксперт MS Access
26636 / 14329 / 3172
Регистрация: 28.04.2012
Сообщений: 15,713
11.09.2017, 15:10 17
Цитата Сообщение от Chuvaschow Посмотреть сообщение
во втором случае набирает пустоту
Значит для заданного проекта есть все работы. Выберите другой объект, где видов работ меньше. Выбрать можно из запроса
SQL
1
2
3
4
SELECT top 1 idNameProject, COUNT(*) AS colJobs
FROM (SELECT DISTINCT idJobs, idNameProject tblJobsNameProject) z
GROUP BY idNameProject
ORDER BY 2
Если и это не поможет значит во всех проектах есть все виды работ. Уберите Top 1 из запроса, посмотрите поле colJobs - всюду ли оно одинаково. Или структура данных не соответствует описанной в запросе. Тогда выкладывайте фрагмент БД с данными по этим 2 таблицам, попробуем разобраться на конкретных данных

Добавлено через 6 минут
from забыл
SQL
1
2
3
4
SELECT top 1 idNameProject, COUNT(*) AS colJobs
FROM (SELECT DISTINCT idJobs, idNameProject FROM tblJobsNameProject) z
GROUP BY idNameProject
ORDER BY 2
0
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 175
12.09.2017, 14:11  [ТС] 18
Никак не идет.

Попробуем так. Вот запрос:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
SELECT tblJobs.Код, tblJobs.TypesJobs, tblJobsNameProject.idJobs,
 tblJobsNameProject.idNameProject
 
FROM tblJobs
 LEFT JOIN tblJobsNameProject
   ON tblJobs.Код = tblJobsNameProject.idJobs
 
WHERE (((tblJobs.Код)<>EXISTS (SELECT  tblJobs.Код
                                            FROM tblJobs
                                            INNER JOIN tblJobsNameProject
                                               ON tblJobs.Код = tblJobsNameProject.idJobs
                                             WHERE ( tblJobsNameProject.idNameProject = [Формы]![frmJobsJournal]![KodProject]))));
Что я хочу получить. С конца. Получаем по конкретному проекту уже связанные работы:

SQL
1
2
3
4
5
....SELECT  tblJobs.Код
 FROM tblJobs 
 INNER JOIN tblJobsNameProject
   ON tblJobs.Код = tblJobsNameProject.idJobs
 WHERE ( tblJobsNameProject.idNameProject = [Формы]![frmJobsJournal]![KodProject]))));
Таким образом у нас есть Код работ (назовем их "не нужные"), в которых уже участвует проект. Эти коды необходимо исключить из общего списка работ. Далее говорим "Отбираем только те коды, которые не похожи на "не нужные"". И левым соединением с общим списком работ, чтобы получить их наименование.

SQL
1
2
3
4
5
6
7
8
SELECT tblJobs.Код, tblJobs.TypesJobs, tblJobsNameProject.idJobs,
 tblJobsNameProject.idNameProject
 
FROM tblJobs
 LEFT JOIN tblJobsNameProject
 ON tblJobs.Код = tblJobsNameProject.idJobs
 
WHERE (((tblJobs.Код)<>EXISTS......
Смысл примерно такой

 Комментарий модератора 
Вы уже не новичок --пора освоить теги оформления текстов запросов и функций


Добавлено через 21 час 24 минуты
Ребят, нет мыслей? все дело встало, никак не могу решить...
0
Эксперт MS Access
26636 / 14329 / 3172
Регистрация: 28.04.2012
Сообщений: 15,713
12.09.2017, 15:22 19
Лучший ответ Сообщение было отмечено Chuvaschow как решение

Решение

Если правильно понял, то наверное так. Без самой базы трудно ручаться за адекватность коленочных запросов
SQL
1
2
3
4
5
6
7
8
9
10
11
12
SELECT tblJobs.Код, tblJobs.TypesJobs, tblJobsNameProject.idJobs,
 tblJobsNameProject.idNameProject
 
FROM tblJobs
 LEFT JOIN tblJobsNameProject
   ON tblJobs.Код = tblJobsNameProject.idJobs
 
WHERE tblJobs.Код NOT IN (SELECT  tblJobs.Код
                           FROM tblJobs
                           INNER JOIN tblJobsNameProject
                               ON tblJobs.Код = tblJobsNameProject.idJobs
                           WHERE tblJobsNameProject.idNameProject = [Forms]![frmJobsJournal]![KodProject])
1
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 175
13.09.2017, 09:36  [ТС] 20
Цитата Сообщение от mobile Посмотреть сообщение
Если правильно понял, то наверное так.
Именно так!!!!
Спасибо огромное!!!

Получилась вот такая форма на основе двух запросов. А кнопочки добавляют или удаляю записи в таблице, после чего форма обновляется. Работает идеально!
0
Миниатюры
Связь один-ко-многим. Разъяснение  
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.09.2017, 09:36

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Автоматизация заполнения (связь один-ко-многим)
Казалось бы простой вопрос. Есть две таблицы, организована связь &quot;один-ко-многим&quot;. В таблице...

Нужно создать связь один-ко-многим
Доброго времени суток. Столкнулся с такой проблемой. Нужно создать базу данных гитар. Таблицу...

Связь один ко многим Access 2007
Как сделать свзяь один ко многим? Таблица слушатель ФАМИЛИЯ - к таблице Уровень физ. подготов....

Связь один ко многим таблицы и запроса на объединение
всем привет! как правильно организовать следующее? есть две таблицы: &quot;физлица&quot; и &quot;юрлица&quot; на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.