Topic: Связь "многое ко многим"

Уважаемый DriveSoft, помогите, пожалуйста!! smile
Слишком много я сделал, что бы не быть уверенным в результате! smile
Я отправляю вам PROJECT0_5 на почту, посмотрите пожалуйста!

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

Сделал все, как мне кажется, как в примере Books and Authors, настроил привязку мониторов ( через MonitorsUsers) и компьютеров ( через KomputerUsers) к сотрудникам. И вроде бы, просмотр человека к которому привязан комп (обратный процесс) тоже получалось, за это спасибо вам за советы! smile

Но заметил такие глюки / или мои недоработки:
1. Если добавить сотрудника, прикрепить ему комп и/или монитор и начать добавлять сразу нового сотрудника - все хорошо работает. Но если сначала открыть окно редактирования сотрудника, затем закрыть, а потом добавлять нового - грид в форме добавления НОВОГО сотрудника уже содержит строку с компьютером и монитором сотрудника, которого редактировали до этого sad
СИМПТОМЫ:
Причем эта надпись - "призрак". Если, не обращая на нее внимания, закрепить комп и монитор за сотрудником, при просмотре его записи будет отображаться только одна строка, которую добавили..
Если попытаться удалить запись "призрака" при добавлении нового сотрудника, комп удалится из "профиля" сотрудника которого редактировали до этого.. Как-то так.. Надеюсь объяснил понятно, думаю если вы попробуете это сделать в моей форме - все поймете

2. Поскольку я точно и досканально не понимаю как работает связь многое-ко-многим, сложно придумать как сделать сводный грид для отображения всей всей информации из 5 таблиц?
Например ФИО, комп, монитор, телефон, офисная техника, если для хранения каждого вида информации используется отдельная таблица связей Komputer users, Monitor users и т.п.?

3. ну и на будущее, если у человека не один монитор, как это отобразить в гриде? либо доп столбиками либо.. ?

Прошу прощения за такие нелепые запросы и заранее спасибо за посильную помощь smile

Re: Связь "многое ко многим"

1. На форме SotrudnikiAdd у гридов UsersComputer и TableGrid2 просто снимите галочку в настройках: "Включить автовыполнение запроса (показать все записи в таблице)"


2. Сводный грид сделать получиться только с помощью SQL запроса, в котором необходимо объединить 5 таблиц с помощью команды UNION, подробней об этом можно прочитать здесь http://www.sql.ru/docs/sql/u_sql/ch14.shtml


3. просто в грид добавить поле с данными о мониторе, т.о. в таблице будут данные вида:
Иванов А. А.   Монитор №345234534
Иванов А. А.   Монитор №754674567

Dmitry.

3 (edited by kodecs 2014-06-09 08:31:45)

Re: Связь "многое ко многим"

по пункту2. Правильно ли я понимаю что: SQL запрос при помощи UNION получится выполнить только в виде таблицы в несколько строк (строка = таблица)
Например:

SELECT Familia as "Tip", Ymia as "inventarnii", Otchestvo as "seriinii", login as "servisniy"                                              
FROM Sotrudniki
UNION
SELECT TypeComp, Inventar№, Servisniy№, Seriyniy№                
FROM Komputers
UNION
SELECT TypeMonitor, Inventar№, Servisniy№, Seriyniy№
FROM Monitor

Вернет три строки, одна из таблицы Sotrudniki, одна из Komputeri, третья из Monitor.. Причем, получается я даже не могу настроить в каком порядке отображать эти строки?
Тут вопрос, как же все таки сделать параметр Where (Его ли?), что бы запрос делался для выбранного в главной таблице сотрудника, а не вываливал мне весь массив данных имеющихся в этих всех таблиц?
Пока что так получается:

Компьютер    1040000001    3000000001    2000000001
Компьютер    1040000002    3000000002    2000000002
Иванов    Илья    Владимирович    ivanov-iv
Монитор    1000000009    2000000009    3000000009
Монитор    1111111111    2222222222    3333333333
Сидоров    Вячеслав    Владимирович    sidorov-vv

Проще говоря как осуществляется взаимодействие SQL кода и интерфейса форм программы? (Если вдруг я спрашиваю то что неоднократно обсуждалось - простите, отправляйте искать внимательнее smile )
В идеале, конечно, придумать или скрипт или запрос такой, что бы хоть в одну строку вернулось значение ФИО Монитор Компьютер..
Или так:
Фио (всегда вверху) (выбран в исходной таблице и по нему идет выборка закрепленных за ним ТМЦ)
Компьютер
Компьютер 2
Монитор
Монитор 2

Пока что, понятно, такой запрос ничего не дает, только вываливает массив всех имеющихся сотрудников вперемешку с компами и мониторами smile

4 (edited by kodecs 2014-06-09 10:54:08)

Re: Связь "многое ко многим"

Больше половины вопроса отпала сама собой (методом научного тыка)

SELECT Familia, Ymia, Otchestvo, login, TypeComp,ProizvodCMP, ModelCMP,
YmiaVSeti,KompIPAdress, KompInventar№,KompServisniy№, KompSeriyniy№,
TypeMonitor, MonitorInventar№,MonitorServisniy№, MonitorSeriyniy№

FROM Sotrudniki, Komputers, Monitor, CompProizvod, CompModel

возвращает строку вида:

Иванов    Илья    Владимирович    ivanov-iv    Компьютер    HP    BEST-3000    Ivanov-PC    127.0.0.1    10000000009    30000000009    20000000009    Монитор    10000000008    20000000008    30000000008

Теперь бы только узнать как добавить туда оператор WHERE со ссылкой на выбранную строку в таблице TabSotrudniki (не знаю синтаксис связи программного интерфейса и SQL запросов) Что бы выборка была по конкретному человеку, а не по всему массиву

И вопрос в догонку, скриптом можно написать такую команду, что бы результат запроса выводился на другую форму и / или в эксель?

Re: Связь "многое ко многим"

Сможете подсказать?)

Re: Связь "многое ко многим"

kodecs

Извиняюсь, забыл ответить.


>Больше половины вопроса отпала сама собой (методом научного тыка)
данный запрос просто перемешает все данные.


Запрос должен быть примерно такого вида, выведеь данные сотрудника, который был выбран в гриде TabSotrudniki

SELECT 0 as "sort", Familia as "Tip", Ymia as "inventarnii", Otchestvo as "seriinii", login as "servisniy"                                              
FROM Sotrudniki WHERE Sotrudniki.id = {TabSotrudniki}

UNION

SELECT 1 as "sort", TypeComp, Inventar№, Servisniy№, Seriyniy№                
FROM Komputers WHERE Komputers.id_Sotrudniki = {TabSotrudniki}

UNION

SELECT 2 as "sort", TypeMonitor, Inventar№, Servisniy№, Seriyniy№
FROM Monitor WHERE Monitor.id_Sotrudniki = {TabSotrudniki}

ORDER BY sort;
Dmitry.

Re: Связь "многое ко многим"

Попробовал, отображается только первая строка, где нет WHERE на связь...
Думаю заквоздка в том, что у меня связь многое ко многим через KomputerUsers и MonitorUsers, надо ковырять

8 (edited by kodecs 2014-06-16 08:01:36)

Re: Связь "многое ко многим"

kodecs wrote:

Попробовал, отображается только первая строка, где нет WHERE на связь...
Думаю заквоздка в том, что у меня связь многое ко многим через KomputerUsers и MonitorUsers, надо ковырять

Самое интересное что если я пытаюсь перенаправить запрос на

FROM Monitor WHERE MonitorUsers.id_Sotrudniki = {TabSotrudniki}


мне возвращается ошибка вида "Нет такого столбца KomputerUsers.id_Sotrudniki", хотя в таблице KomputerUsers есть связь Sotrudniki.. То же самое с мониторами sad
Уже и сам понимаю что перегибаю палку с обилием вопросов, но "пробел" в осознании того как конкретно работают связи в проге и связи "многое ко многим" взрывает мой мозг ) приходится все делать методом тыка smile

Re: Связь "многое ко многим"

Пришлите пожалуйста проект на support@drive-software.com
постараюсь помочь с SQL запросом.

Dmitry.