Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/32: Рейтинг темы: голосов - 32, средняя оценка - 4.94
9 / 9 / 1
Регистрация: 20.12.2010
Сообщений: 192

Как правильно организовать отношение между таблицами(тематика: График работы сотрудника).

27.03.2012, 14:18. Показов 6614. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Народ есть такая проблема, с которой я изменяю жене, работе и жизни в целом.
Но ничего не поделаешь, как уперлось в голову так и стоит там.

Суть:

Есть 2 таблицы

1-я
Personal содержащая: |ID | Name | Speciality | WorkScheduleID |
в которой, по моим предположениям, сущьность "WorkScheduleID" является ссылкой на ИД в другой моей таблице

2-я
WorkSchedule содержащая: | ID | WorkPlan |, где WorkPlan - это datetime

Теперь я ума не приложу как мне связать это все так, чтобы у меня было следующее:

У каждого сотрудника - есть график работы в месяц, и время его труда.

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

Фамилия: Иванова
График работы: 21.03.2012 09:00
21.03.2012 09:30
21.03.2012 10:00
27.03.2012 10:30
27.03.2012 11:00
27.03.2012 11:30

Вроде бы все ясно, но вот я не понимаю как сделать взаимоотношения в таблицах БД, чтобы к конкретному парикмахеру
соответсвовало несколько дат. Как!?

Я что-то совсем уже запутался. Блин, зоть приезжай к кому-нибудь за деньги и урок по БД бери. Ну не допираю я в эти взаимосвязи на деле.
В теории все понятно, но стоит начать реализовывать как куча вопросов.


Просьба, кому не сложно, киньте советик!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.03.2012, 14:18
Ответы с готовыми решениями:

Как организовать связь между таблицами
Есть две таблицы и между ними нужно установить связь один ко многим. Если возможно попдробнее. И заодно подскажите сылки на учебники

Как грамотно организовать связь между таблицами
Здравствуйте, у меня такое задание создать БД в Access. Проблема в том что я не знаю как опимально мэто сделать. База содержит в...

Как организовать класс для работы с несколькими таблицами
private class DbOpenHelper extends SQLiteOpenHelper{ public DbOpenHelper(Context context, final String DB_NAME,...

21
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
27.03.2012, 16:57
Добавь в таблицу WorkSchrdule поле id_personal
0
9 / 9 / 1
Регистрация: 20.12.2010
Сообщений: 192
27.03.2012, 17:55  [ТС]
То есть и там и там должна быть ссылка друг на друга. Тоесть отношение многие ко многим?
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
27.03.2012, 18:17
Нет, из таблицы Сотрудника изыми ссылку на график - получишь 1-n
Хотя лучше всего полностью задачу огласить
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
27.03.2012, 18:17
Нужно убрать из таблицы персонала ссылку на график работы. А в таблицу график работы добавить ссылку на персонал. Кроме этого вместо поля WorkPlan можно сделать два поля StartWorkPlan и FinishWorkPlan.
В этом случае при добавлении в график служащего мы будем в таблице WorkSchrdule указывать на него ссылку, дату начала и дату завершения. Связь один ко многим поскольку одному служащему будет соответствовать множество записей в таблице расписания работ.
Что нам это дает:
Фильтруем таблицу WorkSchrdule по полю id_personal и получаем данные о расписании работ только одного служащего. Использование StartWorkPlan и FinishWorkPlan позволит хранить информацию о интервале времени на работу (хотя если интервал времени всегда один и тот же, то можно отказаться)
0
9 / 9 / 1
Регистрация: 20.12.2010
Сообщений: 192
28.03.2012, 15:25  [ТС]
Да, в принципе суть не сильно замысловатая. Нужно реализовать возможность при выборе сотрудника в комбобоксе, увидеть его часы приема(ну грубо говоря в чекед лист боксе) и мочь на них записаться(занять), чтобы при последующем выборе, то время что уже занято, выбрать было нельзя.
Ваши рекомендации принял, сейчас буду провобовать.
Со стартом и финишем пока сложно. Мне бы так реализовать

Добавлено через 17 часов 59 минут
Ребят все вроде получилось! Но вот я думаю, а внешнюю таблицу создать для 2 сущностей из разных таблиц, ну для удобства ввода данных и их считывания!?
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
28.03.2012, 16:23
Цитата Сообщение от Zilberman Посмотреть сообщение
Ребят все вроде получилось! Но вот я думаю, а внешнюю таблицу создать для 2 сущностей из разных таблиц, ну для удобства ввода данных и их считывания!?
Что сие значит?
0
9 / 9 / 1
Регистрация: 20.12.2010
Сообщений: 192
28.03.2012, 18:31  [ТС]
Ну я имел ввиду еще одну таблицу сделать для внешних ключей!? Или туплю!?
Просто я не смог ввести данные в каком то одном месте.
Я задаю параметры ввода в SQL строке, но не могу сообразить как задействовать таблицу WorkShedule

Грубо говоря у меня комбобокс, и дататаймпикер как-то не связываются. Точнее я не знаю как их в запросе связать. Ведь таблице WorkSchedule ссылка имеет int значение.

Примерно моя попытка выглядела так

INSERT WorkPlan INTO WorkSchedule Value (@date) WHERE PersonalID='cmbxPersonal.Text'
Я конечно понимаю что тут надо как-то преобразовать значения, но не знаю, поэтому и думаю на счет 3-й таблицы в который были бы собраны по fk персонал и дата.


Блин пишу наверное бред. Приду домой все конкретно распишу!
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
29.03.2012, 10:48
Цитата Сообщение от Zilberman Посмотреть сообщение
Ну я имел ввиду еще одну таблицу сделать для внешних ключей!?
Для внешнего ключа может быть тока одна таблица. (возможно что-то другое имеете в виду)) )
Цитата Сообщение от Zilberman Посмотреть сообщение
Просто я не смог ввести данные в каком то одном месте
Так а, что вы пытаетесь даелать? ADO.NET?
Цитата Сообщение от Zilberman Посмотреть сообщение
Я задаю параметры ввода в SQL строке, но не могу сообразить как задействовать таблицу WorkShedule
Вы имеете ввиду что пытаетесь сконфигурировать строку запроса в коде, но не знаете как правильно написать запрос?
Цитата Сообщение от Zilberman Посмотреть сообщение
Грубо говоря у меня комбобокс, и дататаймпикер как-то не связываются
Вот этот откровенно говоря я совсем не понимаю! Нужны подробности!
Цитата Сообщение от Zilberman Посмотреть сообщение
SQL
1
INSERT WorkPlan INTO WorkSchedule VALUE (@DATE) WHERE PersonalID='cmbxPersonal.Text'
Запрос написан неправильно.
1. Потому что надо так
INSERT INTO WorkSchedule (перечисляем здесь поля таблицы)
VALUES (перечисляем здесь значения для вставки)
2. Вот это здесь не катит - WHERE PersonalID='cmbxPersonal.Text' покскольку добавляем через VALUES
3. Если у вас комбобокс связан с источником данных и настроен на работу с ним, то тогда значение надо брать не из поля Text, а из поля Value.
0
9 / 9 / 1
Регистрация: 20.12.2010
Сообщений: 192
31.03.2012, 16:34  [ТС]
Итак, попытаюсь объяснить, что конкретно мне непонятно в этом вопросе. И почему у меня работа со связанными таблицами вызывает такое непонимание. Постараюсь лаконичнее объяснить.

1. У меня есть форма в которой я формирую график работы.
На ней расположены 1 Комбобокс и 1 дататаймпикер
Задачи контролов: в комбобоксе у меня подтянуты сотрудники (парикмахеры, массажисты, маникюршицы и т.д. по фамилиям не по специальностям). В дататаймпикер, дату которую я хочу выбрать и для установления рабочего дня(дней), конкретной фамилии(сотруднику).
Действие: Открываем комбобокс, выбираем Иванову Светлану, далее открываем датапикер, выбираем дату тыкаем, открываем опять, опять тыкаем, и так тыкаем в разные даты столько раз, сколько Иванова должна быть по графику на работе.

Тем временем, как я понимаю инфа будет писаться в таблицу WorkShedule, поле WorkPlan, c ссылкой на IDСотрудника Ивановой.

Вот это я не знаю как написать в запросе!!!
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
31.03.2012, 16:44
Запрос для сохранения данных в таблице должен выглядеть следующим образом:
INSERT INTO WorkSchedule (WorkPlan, IDСотрудника)
VALUES (Значение_из_контрола_с_датой, Значение_из_контрола_с_сотрудником)
0
9 / 9 / 1
Регистрация: 20.12.2010
Сообщений: 192
31.03.2012, 17:33  [ТС]
Пробую....

Добавлено через 21 минуту
предварительный вопрос, а IDСотрудника не будет конфликтовать с Текстовым значением Значение_из_контрола_с_сотрудником

Добавлено через 26 минут
Ну вот как и ожидалось!

Эксепшен: Конфликт типов операндов Text несовместим с Int
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
31.03.2012, 22:44
Так все правильно! У вас же вопрос был относительно запроса!!! А тему извлечения данных из контролов я даже не поднимал, потому, что нет информации. У вас не с запросом проблемы, а с извлечением данных и последующей генерацией его (запроса). К тому же вы еще и не сказали на каком языке кодируете (под какой платформой).
1
9 / 9 / 1
Регистрация: 20.12.2010
Сообщений: 192
31.03.2012, 23:59  [ТС]
Пишу на С# MS-SQL, но думаю что для SQL строки это не критично.
Смотрите, мне же нужно внести данные в БД это первая задача, я сейчас не говорю о выборке из таблицы.
Вы мне дали правильны ответ с точки зрения моего вопроса, но вот конструкция ошибочна.
Вот я не понимаю как ввести данные в таблицу, поэтому вводил в SQl команду конструкцию WHERE, но синтаксически она у меня не верна. Поэтому и спрашиваю как сдлать ее правильной.
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
01.04.2012, 00:30
Конструкция абсолютно точная. глянуть можно здесь - http://msdn.microsoft.com/ru-r... 74335.aspx.

Думаю проблема в том, что вы не показываете:
1. Как осуществляться настройка подключения к SQL-server;
2. Как осуществляется "сборка" строки запроса;
3. Как осуществляется выполнение запроса.

Нужен код, чтобы я или кто-то, кто достаточно хорошо разбирается в ado.net, смог вам помочь. При этом возможно вопросы снимутся сами собой если вы прочитаете все закрепленные темы на ветке https://www.cyberforum.ru/ado-net/

Я хорошо понял, что вы хотите сделать на уровне объектов базы данных, а вот с клиентской частью вам скорее всего придется объяснять все заново.
0
9 / 9 / 1
Регистрация: 20.12.2010
Сообщений: 192
01.04.2012, 00:36  [ТС]
Короче единственное что придумал, это "костыли" в виде добавления еще однго текстбокса, подвязал на него ID, который меняется в зависимости от выбора в комбобоксе ФИО сотрудника.
Теперь пользуюсь вашим SQL запросом но Значение_из_контрола_с_сотрудником - теперь служит новый текстбок с айдишкой. В принципе сделаю его сейчас невидимым и все будет ок! Хотя конечно извращение.


Если вдруг у кого-нибудь найдется еще решение тема все еще актуальна.
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
01.04.2012, 00:47
Так комбо-бокс же настраивается на заполнение из источника данных (свойство DataSource). вы типизированный датасет используете или вручную все объекты пишете?

После настройки можно будет брать значение из SelectdValue и никаких лишних котролов не надо будет.
0
9 / 9 / 1
Регистрация: 20.12.2010
Сообщений: 192
01.04.2012, 01:08  [ТС]
Именно!

katon - вроде все получается. На комбо повешена DataSourceX(пример) который тянет таблицу Personal(ID, Name и на всякий случай Speciality). Далее на SelectesValue кидаю Name (DataSourceX-a), а к текстбоксу клею из того же датасорса уже ID. Получается что когда выбираю в комбо Фио, в текстбоксе определяется ИД, вот его то и пишу в базу по вашей строке.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
string connStr = @"Data Source=(local)\SQLEXPRESS;
                           Initial Catalog=MyBD;
                           Integrated Security=True";
            SqlConnection conn = new SqlConnection(connStr);
            try
            {
                conn.Open();
            }
            catch (SqlException se)
            {
                MessageBox.Show("Ошибка подключения:", se.Message);
                return;
            }
       
           
            SqlCommand cmd = new SqlCommand("INSERT INTO WorkSchedule (WorkPlan, PersonalID) Values @Date, @Personal)", conn);
            SqlParameter param = new SqlParameter();
            param.ParameterName = "@Date";
            param.Value = dateTimePicker1.Text;
            param.SqlDbType = SqlDbType.DateTime;
            cmd.Parameters.Add(param);
            param = new SqlParameter();
            param.ParameterName = "@Personal";
            param.Value = textBox1.Text;
            param.SqlDbType = SqlDbType.Int;
            cmd.Parameters.Add(param);
            MessageBox.Show("Вставляем запись");
            try
            {
                cmd.ExecuteNonQuery();
                lblStatus.Text="Дата успешно добавлена";
            }
            catch(SqlException se)
            {
                MessageBox.Show(Convert.ToString(se));
                return;
            }
0
 Аватар для _katon_
414 / 265 / 25
Регистрация: 03.10.2011
Сообщений: 1,094
01.04.2012, 01:33
C#
1
param.Value = textBox1.Text;
а где же комбо-бох? вот тут и надо SelectedValue вставлять.
C#
1
"INSERT INTO WorkSchedule (WorkPlan, PersonalID) Values @Date, @Personal)
а где же открывающаяся скобка))) после Values.

Вы код частями выдирали? а то тут не видно что это и close() для подключения к базе.

Добавлено через 42 секунды
И еще где ошибку выдает (строка)?
0
9 / 9 / 1
Регистрация: 20.12.2010
Сообщений: 192
01.04.2012, 10:25  [ТС]
Нигде ошибок не выдает. Все исправно работает. Я же пишу что все получилось. Соединение не закрыл каюсь.

Комбобокс не виден потому, что он у меня переключателем служит. Переключил Иванову, в текстбоксе появилась цифирка ID=1, переключил с Ивановой на Петрову, в текстбоксе появилась цифирка ID= 5(соответствующая Петровой). Вот и все текст бокс это компромис, который помогает избежать конфликта операндов (text в int).

Вот и все!

Код естественно выдрал из обработчика событий. Все остально сгенерено студией.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.04.2012, 10:25
Помогаю со студенческими работами здесь

Отношение между таблицами
Есть какой- то класс, который мог сливать БД в DataSet таблицы с отношениями? что бы их в ручную не писать

Отношение между таблицами
Привет всем. Такой вопрос. Хочу создать отношение между двумя таблицами по foreign key. К примеру таблицы: CREATE TABLE . ( ...

Отношение между таблицами
Всем привет!! Я столкнулся с такой проблемой.. У меня есть таблица главная и несколько дочерних. Не хочется связывать их в Delphi. Таблицы...

Отношение между двумя таблицами
Привет всем. Есть две таблицы - Card и Pooshren. У Card есть первичный ключ(столбец itemperson). У pooshren есть столбец itemparent - это...

Отношение между несколькими таблицами
Привет всем. Тема в принципе похожа на предыдущую, но все же отличается. Итак, есть три таблицы - Data, History, TypeHistory. Data,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru