Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 04.09.2014
Сообщений: 28

Как связать столбец: Статус из трех таблиц к четвертой?

24.04.2016, 03:42. Показов 1194. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть база данных, в ней три таблицы.
А на четвертой должно быть, что-то вроде:

Первый столбец: ID естественно, он уже в базе вбит как AI
Второй столбец: Тут значение с первой таблицы
Третий столбец: Тут значение с второй таблицы
Четвертый столбец: Тут значение с третьей таблицы

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

Пример: В магазине работает охранник, продавец и менеджер.
В трех таблицах есть база сотрудников, но лишь некоторые сейчас на дежурстве.
Вот в каждой из тех трех есть ячейка: "На дежурстве/Выходной/Больничный".

И вот как бы, если на дежурстве, что бы имя человека (Fullname столбец) автоматически добавлялось в четвертую базу к его столбцу(будь то охранник, продавец или вовсе менеджер). Но была возможность замены как ComboBox в самой базе, для возможности замены того или иного сотрудника.

Типо сегодня в ID - 1 магазине, Вася-охранник работает с Асей-продавщицей и Дмитрием-менеджером.

Только у меня конечно идея не магазина, но суть та же. Уже неделю маюсь, не могу понять как их связать. И вот раз не получается сделать самому, решил спросить у опытных. По сути главное есть, только связать их как-то надо.

Если на dataGridView выбрать правка столбцов: И в ColumnType можно сделать ComboBox. Но связать всё равно их не смог.

Вот мини-примерная база:

Table1
ID || Fullname
Table2
ID || Fullname
Table3
ID || Fullname
Table4
ID || Table1 || Table2 || Table3

TestEntities test;

По сути я предполагаю, что там строк на 5-10 будет. Потому, что главная база создана.

Так, что я думаю хоть кто нибудь да помочь сможет.

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

P.S. Я создал базу через SQL Server Management Studio 2014 и потом добавил её как модель ADO.NET. Код писал только на Добавить/Удалить/Изменить/Сохранить всё это дело.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.04.2016, 03:42
Ответы с готовыми решениями:

Связать 1 столбец между 2 таблиц
Здравствуйте! Как можно связать в 2 разных таблицах только 1 столбец У меня есть что то вроде ------------------ items ...

Как связать через Binding контрол и статус DATAROW
Есть булевое значение Control, которое нужно связать со значением (bool)workRow(DataRow), при этом использовать метод...

Как составить массив m x 2, где 1-й столбец составлен из сумм трёх наименьших, 2-й из суммы трёх наибольших элементов массива m x n
Дан двумерный массив (m x n ) составить двумерный массив размерности m x 2, где 1 -ы столбец составлен из сумм трёх наименьших элементов ,...

8
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
24.04.2016, 18:25
Цитата Сообщение от Eazy_Nick Посмотреть сообщение
В магазине работает охранник, продавец и менеджер.
В трех таблицах есть база сотрудников, но лишь некоторые сейчас на дежурстве.
Если добавится уборщик, то будете еще одну таблицу добавлять? А потом колонку к той, четвертой таблице?
Полезное правило при планировании базы: при нормальной работе меняться должно только количество строк в таблицах, но не количество таблиц и колонок в них.

Сделайте нормальную организацию: таблица, в которой хранятся возможные должности; таблица, в которой хранятся сотрудники. Если сотрудник может иметь только одну должность, то к ним в таблицу ключ должности из первой таблицы. Если может иметь несколько должностей, то делайте таблицу-связку, в которой будет ИД сотрудника и должности.
Потом сделайте таблицу для расписания, где каждый сотрудник или связка сотрудник/должность привязаны к дням недели и часам работы. И, наконец, таблицу посещаемости, где будет отмечаться дата и время выхода на работу каждого сотрудника и причина ухода (конец смены, туалет, обед и т.д.). Последнюю можно разбить на две таблицы (пришел/ушел), если нужны определенные типы запросов. Но я бы оставил одну таблицу с двумя колонками: мне неизвестны случаи, когда сотрудник пришел бы на работу, но не ушел (или его не вынесли оттуда).

Сделайте что-то вроде этого и жить станет намного проще.
1
0 / 0 / 0
Регистрация: 04.09.2014
Сообщений: 28
25.04.2016, 11:18  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Сделайте нормальную организацию: таблица, в которой хранятся возможные должности; таблица, в которой хранятся сотрудники. Если сотрудник может иметь только одну должность, то к ним в таблицу ключ должности из первой таблицы. Если может иметь несколько должностей, то делайте таблицу-связку, в которой будет ИД сотрудника и должности.
Потом сделайте таблицу для расписания, где каждый сотрудник или связка сотрудник/должность привязаны к дням недели и часам работы. И, наконец, таблицу посещаемости, где будет отмечаться дата и время выхода на работу каждого сотрудника и причина ухода (конец смены, туалет, обед и т.д.). Последнюю можно разбить на две таблицы (пришел/ушел), если нужны определенные типы запросов. Но я бы оставил одну таблицу с двумя колонками: мне неизвестны случаи, когда сотрудник пришел бы на работу, но не ушел (или его не вынесли оттуда).

Сделайте что-то вроде этого и жить станет намного проще.
Вот в том-то и дело, организация: Имеет только три этих работника. И никак иначе, в них поля: ФИО, Дата рождения, Номер, Адрес, Статусна работе/выходной/больничный) и Нарушения: 0-3.

И как я знаю, если человек на выходном, то его могут запросто вызвать и он обязан прийти. Просто по звонку. Для замены другого. И расписание у них каждый день выставляется на только три дня, а может даже два дня вперед. Постоянно варьируется. Поэтому, мне надо, что бы на четвертой таблице человек мог видеть:

ID || Table1 || Table2 || Table3
Тут AI || ComboBox || ComboBox || ComboBox

Если в Править столбцы я смог сделать их ComboBox, и там же DataSource подключаю к Table1BindingSource, DisplayMember - Fullname, ValueMember - Fullname.
И также с другими Table2, Table3.

И получается у меня есть доступ к Fullname с других таблиц. Но, в чём суть, мне надо, что бы в списке убирались строки Fullname которые: 1. Уже добавлены. 2. В Status - у них значение не "На линии". А то список весь кидает.

Как бы человек пришёл, открыл таблицу Table1. Выбрал несколько людей, поставил на Линию. Потом с Table2, Table3.

Затем переходит к 4, и там просто сопоставляет людей между собой. Что бы Вася был сегодня с Асей и Димой. А Ваня и Даша помогали Лере.

Да, насчёт расписания вы правильно сказали, но если бы они хотя бы на неделю писали это расписание и можно было бы создать новую форму и в ней составляли бы расписание. Но, у них это не реально. Постоянные замены идут. Поэтому в онлайн режиме получается смена будет, как я уже описал выше.

Добавлено через 2 часа 12 минут
К примеру, я бы мог использовать SqlCommand добавив: using System.Data.SqlClient;
Что-то вроде:
Если, при проверке, стоит На линии, то не показывать.

SqlConnection con = new SqlConnection("Подключение к базе");
SqlCommand cmd = new SqlCommand("select * from table1 where Status = '"На линии"", con);

И опять же толком не знаю как обращаться потом к тем ComboBox в dataGridView.

Я ведь использую Entity Framework. У меня в app.config уже есть подключение. Поэтому, он еще и начинает ссылаться на то, что моё SqlConnection требует открытого подключения.

Как правильно написать код, что бы если стоит в Status = "На линии", и если он есть уже в Table4. То убрать из ComboBox в DataGridView.

Добавлено через 1 час 6 минут
Сделал проще, чем мудрить с базой:

ID || Table1 || Table2 || Table3

Кнопка добавить, выбирает в ComboBox из Table1 значение Fullname. И также с другими.

Но как убирать строки Fullname которые:
1. Уже добавлены в таблицу №4.
2. В Status - у них значение не "На работе".

Я до сих пор не знаю.

Вот как я добавлял значения в таблицы:
после первого паблика TestEntities test;

В кнопке Добавить.
C#
1
2
3
4
5
6
7
8
9
10
11
try
{
panel1.Enabled = true;
textBox1.Focus();
Table1 c = new Table1();
test.Table1.Add(c);
Table1BindingSource.Add(c);
busBusBindingSource.MoveLast();
}
catch (Exception ex)
{
Ну тут сообщение об ошибке.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.04.2016, 11:47
Цитата Сообщение от Eazy_Nick Посмотреть сообщение
Вот в том-то и дело, организация: Имеет только три этих работника. И никак иначе
Это учебная задача или для какой-то реальной организации делается?
Если учебная, то по какому предмету?
0
0 / 0 / 0
Регистрация: 04.09.2014
Сообщений: 28
26.04.2016, 00:27  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Это учебная задача или для какой-то реальной организации делается?
Если учебная, то по какому предмету?
Дипломная, для организации, завтра пойду показывать что есть. Щас маюсь с запуском на других компах. Что-то не хочет.

Но всё равно трабл с 4 таблицей есть. Вот думаю как сделать.. Нас в колледже учили Delphi, а когда начали сишку, то поувольнялись все преподы. Разрешили делать дипломную на Делфи, но хочется новое, да и он старый как бы. С# щас более востребован. Вот и не всё понимаю как сделать.

Запуск программы на другом компе - в этой теме прочел:

Цитата Сообщение от silent_1991 Посмотреть сообщение
Проект -> Свойства -> Свойства конфигурации -> С/С++ -> Создание кода -> Библиотека времени выполнения. Для Debug-конфигурации выбрать Многопоточная отладка (/MTd), для Releade - Многопоточная (/MT).
Только видимо там для другой версии VS, у меня 2012. Свойства проекта только открываю, не могу найти.

Попробую добавить в настройках добавление установщика .Net FrameWork. Но если у них интернета не будет, то я хз

Добавлено через 6 минут
Пробовал на другом ноуте, там нет .net, и ни один из Release, Debug и даже собирал сборку, что бы вышел setup.exe , ни что не открывает программу, ругается на Entity Framework.

Добавлено через 35 минут
Как оказалось:

<add name="TestEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClien t;provider connection string=&quot;data source=WIN-OAL0QTQQV05;initial catalog=BusApp;persist security info=True;user id=sa;password=123456;MultipleActiveResu ltSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Он же идёт от SQL Server Manager Studio. И как бы на другом компе, он не знает где база данных. Ща думаю как решить это

Добавлено через 37 минут
я взял базу BusApp.mdf , как теперь заменить ту строку, что бы она не разрушила всё, но и была получается локальной, прямо в папке, сойдет
0
Warrior
 Аватар для _exp10der_
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
26.04.2016, 00:32
Очевидно нужен корректный "data source" сейчас он у вас ведет на имя компьютера WIN-OAL0QTQQV05. Можно предположить что у вас дефолтный инстанс у службы ms sql.
0
0 / 0 / 0
Регистрация: 04.09.2014
Сообщений: 28
26.04.2016, 00:48  [ТС]
Цитата Сообщение от _exp10der_ Посмотреть сообщение
Очевидно нужен корректный "data source" сейчас он у вас ведет на имя компьютера WIN-OAL0QTQQV05. Можно предположить что у вас дефолтный инстанс у службы ms sql.
Это я уже понял, а как сделать, что бы он тогда шёл к папке с его корректным data source? Допустим, я возьму эту базу из папки SQL Server и затем положу в корень папки Release. Что бы , потом при транспортировки программы, я мог её запустить на другом компьютере. Так как я полагаю, самые важные файлы в этой папке. А значит, что Release - корень программы будет, на другом компьютере. Вот как мне теперь соединить.
0
0 / 0 / 0
Регистрация: 04.09.2014
Сообщений: 28
11.05.2016, 19:16  [ТС]
Разобрался с подключением.
Создал отдельные ComboBox 1,2,3.
Подключил их к столбцу из других баз.
Подключил их к моей 4 таблице.

И всё хорошо и сохраняется.

Но, до сих пор не знаю как убирать те, которые уже есть в базе. И те строки, которые имеют статус: Выходной.

C#
1
2
3
4
5
6
using (SqlConnection con = new SqlConnection("Подключение к базе"))
using (SqlCommand cmd = new SqlCommand("SELECT * FROM [Table1] status=status, con))
{
                    connection.Open();
                    command.Parameters.AddWithValue("status", "На линии");
...
Не могу додумкать..
P.S. На SqlConnection больше не ругается. И насчёт транспортировки не страшно. Оказалось, там есть SQL Server. И я просто перенесу свою базу туда и в app.config изменю Имя Компьютера и пароль от сервера. Так, что осталось только вот с ComboBox траблы..((((
0
0 / 0 / 0
Регистрация: 04.09.2014
Сообщений: 28
14.05.2016, 19:44  [ТС]
Вот что получилось. Кто может помочь, доработать...

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int count = 0;
using (SqlConnection connection = new SqlConnection(@"ТУТ ПОДКЛЮЧЕНИЕ"))
using (SqlCommand command = new SqlCommand("SELECT * FROM [Table1] WHERE Status ='" + txtHide.Text + "'", connection))
{
     connection.Open();
     command.Parameters.AddWithValue("Status", txtHide.Text); // В txtHide.Text - "На линии". Он скрыт.
     using (SqlDataReader reader = command.ExecuteReader())
     {
           while (reader.Read())
           count += 1;
     }
     connection.Close();
}
if (count == 0)
{
     MessageBox.Show("Ошибка");
     return;
}
Таким образом, я получаю строку, которая имеет статус: "На линии".

C#
1
2
DgvValue = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
DgvValue = cmbBox1.Text;
Этот код, как я понял должен брать ячейку и вставлять её в cmbBox1. Но, всё равно ума не приложу, как простую задачу. Найти Status = "На линии" и потом взять со этой же строки Fullname. А потом пойти искать следующий....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.05.2016, 19:44
Помогаю со студенческими работами здесь

сколько таблиц и как их связать?
Данные: номер бригады, фамилия И.О. бригадира (всего 2 бригады), фамилию, имя, отчество, пол, специальность, разряд, работников бригад (по...

Как связать несколько таблиц?
Доброго времени суток. Работаю в Vs 2010. Создаю отчет по таблице Book. Выводится информация о книге. Но, например, в поле AuthorID...

Как связать несколько таблиц
Здравствуйте, у меня имеется 6 таблицы. В первый таблице будет храниться данные об учителе, а в остальных таблицах будут храниться о...

Несколько таблиц на форме - как связать?
Таблица Юрики- КОД и НАЗВАНИЕ Таблица МАГАЗИНЫ - КОД, КОД_ЮРЛИЦА, НАЗВАНИЕ Таблица ВЕРСИИ - КОД, КОД_МАГАИЗНА, ВЕРСИЯ Таблица...

Как в Экселе связать порядка 40 таблиц
Подскажите, пожалуйста, как в Экселе связать порядка 40 таблиц?


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru