Форум программистов, компьютерный форум, киберфорум
Наши страницы
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/17: Рейтинг темы: голосов - 17, средняя оценка - 4.71
Zilberman
6 / 6 / 1
Регистрация: 20.12.2010
Сообщений: 191
#1

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

27.03.2012, 14:18. Просмотров 3152. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2012, 14:18
Ответы с готовыми решениями:

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

Отношение между таблицами "многие ко многим"
Доброго времени суток! Дано: Таблица "Продукты для рецептов" Ключ -...

Как создать запрос на создание связи 1:1 между таблицами?
Задание такое, нужно сделать так, чтобы между табл Сотрудник и МатОтветственный...

Как правильно организовать БД?
Есть база данных о предприятии. В ней есть данные об отделах и о сотрудниках. С...

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

21
pincet
1315 / 903 / 122
Регистрация: 23.07.2010
Сообщений: 4,902
27.03.2012, 16:57 #2
Добавь в таблицу WorkSchrdule поле id_personal
0
Zilberman
6 / 6 / 1
Регистрация: 20.12.2010
Сообщений: 191
27.03.2012, 17:55  [ТС] #3
То есть и там и там должна быть ссылка друг на друга. Тоесть отношение многие ко многим?
0
pincet
1315 / 903 / 122
Регистрация: 23.07.2010
Сообщений: 4,902
27.03.2012, 18:17 #4
Нет, из таблицы Сотрудника изыми ссылку на график - получишь 1-n
Хотя лучше всего полностью задачу огласить
0
_katon_
380 / 237 / 18
Регистрация: 03.10.2011
Сообщений: 965
27.03.2012, 18:17 #5
Нужно убрать из таблицы персонала ссылку на график работы. А в таблицу график работы добавить ссылку на персонал. Кроме этого вместо поля WorkPlan можно сделать два поля StartWorkPlan и FinishWorkPlan.
В этом случае при добавлении в график служащего мы будем в таблице WorkSchrdule указывать на него ссылку, дату начала и дату завершения. Связь один ко многим поскольку одному служащему будет соответствовать множество записей в таблице расписания работ.
Что нам это дает:
Фильтруем таблицу WorkSchrdule по полю id_personal и получаем данные о расписании работ только одного служащего. Использование StartWorkPlan и FinishWorkPlan позволит хранить информацию о интервале времени на работу (хотя если интервал времени всегда один и тот же, то можно отказаться)
0
Zilberman
6 / 6 / 1
Регистрация: 20.12.2010
Сообщений: 191
28.03.2012, 15:25  [ТС] #6
Да, в принципе суть не сильно замысловатая. Нужно реализовать возможность при выборе сотрудника в комбобоксе, увидеть его часы приема(ну грубо говоря в чекед лист боксе) и мочь на них записаться(занять), чтобы при последующем выборе, то время что уже занято, выбрать было нельзя.
Ваши рекомендации принял, сейчас буду провобовать.
Со стартом и финишем пока сложно. Мне бы так реализовать

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

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

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

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


Блин пишу наверное бред. Приду домой все конкретно распишу!
0
_katon_
380 / 237 / 18
Регистрация: 03.10.2011
Сообщений: 965
29.03.2012, 10:48 #9
Цитата Сообщение от 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
Zilberman
6 / 6 / 1
Регистрация: 20.12.2010
Сообщений: 191
31.03.2012, 16:34  [ТС] #10
Итак, попытаюсь объяснить, что конкретно мне непонятно в этом вопросе. И почему у меня работа со связанными таблицами вызывает такое непонимание. Постараюсь лаконичнее объяснить.

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

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

Вот это я не знаю как написать в запросе!!!
0
_katon_
380 / 237 / 18
Регистрация: 03.10.2011
Сообщений: 965
31.03.2012, 16:44 #11
Запрос для сохранения данных в таблице должен выглядеть следующим образом:
INSERT INTO WorkSchedule (WorkPlan, IDСотрудника)
VALUES (Значение_из_контрола_с_датой, Значение_из_контрола_с_сотрудником)
0
Zilberman
6 / 6 / 1
Регистрация: 20.12.2010
Сообщений: 191
31.03.2012, 17:33  [ТС] #12
Пробую....

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

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

Эксепшен: Конфликт типов операндов Text несовместим с Int
0
_katon_
380 / 237 / 18
Регистрация: 03.10.2011
Сообщений: 965
31.03.2012, 22:44 #13
Так все правильно! У вас же вопрос был относительно запроса!!! А тему извлечения данных из контролов я даже не поднимал, потому, что нет информации. У вас не с запросом проблемы, а с извлечением данных и последующей генерацией его (запроса). К тому же вы еще и не сказали на каком языке кодируете (под какой платформой).
1
Zilberman
6 / 6 / 1
Регистрация: 20.12.2010
Сообщений: 191
31.03.2012, 23:59  [ТС] #14
Пишу на С# MS-SQL, но думаю что для SQL строки это не критично.
Смотрите, мне же нужно внести данные в БД это первая задача, я сейчас не говорю о выборке из таблицы.
Вы мне дали правильны ответ с точки зрения моего вопроса, но вот конструкция ошибочна.
Вот я не понимаю как ввести данные в таблицу, поэтому вводил в SQl команду конструкцию WHERE, но синтаксически она у меня не верна. Поэтому и спрашиваю как сдлать ее правильной.
0
_katon_
380 / 237 / 18
Регистрация: 03.10.2011
Сообщений: 965
01.04.2012, 00:30 #15
Конструкция абсолютно точная. глянуть можно здесь - http://msdn.microsoft.com/ru-ru/library/ms174335.aspx.

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

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

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


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

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

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_
380 / 237 / 18
Регистрация: 03.10.2011
Сообщений: 965
01.04.2012, 01:33 #19
C#
1
param.Value = textBox1.Text;
а где же комбо-бох? вот тут и надо SelectedValue вставлять.
C#
1
"INSERT INTO WorkSchedule (WorkPlan, PersonalID) Values @Date, @Personal)
а где же открывающаяся скобка))) после Values.

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

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

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

Вот и все!

Код естественно выдрал из обработчика событий. Все остально сгенерено студией.
0
01.04.2012, 10:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2012, 10:25

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

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

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


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

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

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