Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запросы select. Триггер  [new]
Selecsus
Member

Откуда:
Сообщений: 5
Доброго времени суток!
Просьба помочь, по-возможности...

Задание:
+
Вариант 14
Разработать информационную систему учета проведения строительных работ. Система должна учитывать комплектацию бригад и направление бригад на различные объекты строительства. В системе должны сохраняться данные как о выполненных работах, так и о запланированных работах бригад на объектах строительства.

Требования к данным
1. Система должна обеспечивать хранение информации о следующих объектах:
 Рабочий
 Бригада
 Объект строительства
2. Информация, описывающая отдельного рабочего, включает фамилию, имя, отчество рабочего; табельный номер; дату рождения; место жительства и телефон.
3. Информация, описывающая бригаду, включает номер бригады; информацию о количестве человек в бригаде.
4. Информация об объекте строительства состоит из названия объекта строительства; адреса объекта; сроков начала и окончания строительства.
5. Каждый рабочий зачисляется в бригаду, при этом рабочий может работать только в одной бригад.
6. Численность каждой бригады составляет от 3 до 20 человек.
7. Каждая бригада имеет одного бригадира из числа рабочих бригады.
8. Бригада может работать на нескольких объектах, и на одном объекте может работать несколько бригад.
9. *В случае если бригада работает на нескольких объектах, необходимо фиксировать сроки работы бригады на каждом из объектов.
10. *Требуется исключить ситуацию, когда бригада в одно и то же время работает на разных объектах.

Требования к операциям над данными
1. Система должна обеспечивать доступ к информации следующим категориям пользователей:
 Менеджер
 Бригадир
 Рабочий
2. Операции, выполняемые менеджером:
 добавление, изменение, удаление информации о рабочих и бригадах
 добавление, изменение, удаление информации об объектах строительства
 смена бригадиров в бригадах
 составление расписания работ бригад на объектах
 получение информации о количестве рабочих в каждой бригаде
 получение информации об общем количестве рабочих
 получение отчета о бригадах, работающих на заданном объекте, с указанием дат работы
 нахождение бригад с максимальным и минимальным количеством рабочих
3. Операции, выполняемые бригадирами:
 получение полной информации о рабочих бригады
 получение информации о среднем возрасте рабочих бригады
 получение расписания работ бригады на различных объектах строительства
 получение отчета о бригадах, с которыми данной бригаде предстоит работать на каждом объекте строительства
4. Операции, выполняемые рабочими:
 получение полной информации о бригаде, в которой работает рабочий
 получение расписания работ данного рабочего на объектах строительства




Картинка с другого сайта.
Вставить диаграмму, что-то не получается. Поэтому сссылка на картинку:
Картинка: http://i078.radikal.ru/1305/1b/342940994870.png

Соответственно, самое простое-то у меня получилось...
Т.е. create table, insert и простейшие Select.


use Buildings
go
	/*получение информации о количестве рабочих в каждой бригаде */
SELECT * FROM WorkGroup
 /*group by Amount;*/

	/*получение информации об общем количестве рабочих*/
select count(*) as Sum_Worker from Worker;
	/*получение отчета о бригадах, работающих на заданном объекте, с указанием дат работы */
select * from Group_on_Object where Title='Дом';
	/*нахождение бригад с максимальным и минимальным  количеством рабочих */
select MAX(amount) as Max_Brig from WorkGroup;
select MIN(amount) as Min_Brig from WorkGroup;  

	/*получение полной информации о рабочих бригады - Додумать*/
select WorkGroup.*, Brigadier.*, Worker_in_Group.* from
	WorkGroup left join Brigadier on Brigadier.number = WorkGroup.number
	left join Worker_in_Group on Worker_in_Group.number = WorkGroup.number;

	/*получение информации о среднем возрасте рабочих бригады  */
SELECT b.Number, AVG(DATEDIFF(yy, w.Birthday, GETDATE())) AS 'Средний возраст в бригаде' 
FROM Worker w
    INNER JOIN [Worker_in_Group] b ON w.[Tab_Number] = b.[Tab_Number]
GROUP BY b.Number;	
	
	/*получение расписания работ бригады на различных объектах строительства*/
	/*получение отчета о бригадах, с которыми данной бригаде предстоит работать на каждом объекте строительства */


	/*получение полной информации о бригаде, в которой работает рабочий - Додумать */
select Tab_Number, Name from Wokers
where (select Tab_Number from Brigadier where (select Number from WorkGroup where (select Tab_Number from Worker_in_Group )));


	/*получение расписания работ данного рабочего на объектах строительства*/


Начиная с "получение полной информации о рабочих бригады " у меня ничего не получается...

Триггер: "10. *Требуется исключить ситуацию, когда бригада в одно и то же время работает на разных объектах. "

use Buildings
go

Create Trigger Work
on Group_on_Object
for insert, update
as
begin
if exists (select * from Group_on_Object where inserted >= Begin_Date_WG and inserted <= End_date_WG)
rollback
print 'Бригада в это время уже занята'
end

Но он тоже не работает.

Может, подскажете что-нибудь?
20 май 13, 16:56    [14322471]     Ответить | Цитировать Сообщить модератору
 Re: Запросы select. Триггер  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Selecsus
Триггер: "10. *Требуется исключить ситуацию, когда бригада в одно и то же время работает на разных объектах. "

use Buildings
go

Create Trigger Work
on Group_on_Object
for insert, update
as
begin
if exists (select * from Group_on_Object where inserted >= Begin_Date_WG and inserted <= End_date_WG)
rollback
print 'Бригада в это время уже занята'
end

Но он тоже не работает.

inserted — это таблица. Begin_Date_WG и End_date_WG — это, как я понимаю, поля с типом datetime (или date). Каким образом SQL Server должен проводить сравнение таблицы со значением типа datetime?
20 май 13, 17:05    [14322553]     Ответить | Цитировать Сообщить модератору
 Re: Запросы select. Триггер  [new]
aleks2
Guest
Create Trigger Work
on Group_on_Object
for insert, update
as
begin
if exists (select * 
             from Group_on_Object g inner join inserted i
                  on i.End_date_WG>= g.Begin_Date_WG and i.Begin_Date_WG <= g.End_date_WG
                     and i.ID_Work<>g.ID_Work
           )
  raiserror('Бригада в это время уже занята', 16, 1)
end
20 май 13, 17:36    [14322785]     Ответить | Цитировать Сообщить модератору
 Re: Запросы select. Триггер  [new]
Selecsus
Member

Откуда:
Сообщений: 5
Хм... А как тогда можно ввести, чтобы он сравнивал ведённые данные с существующими? Если просто с таблицей сранивать - номера бригад разные => он сразу скажет, что всё нормально...

Begin_Date_WG и End_date_WG - это smalldatetime, как вариант - datetime или date. суть это не особо меняет. :) "date" sql 2005 у меня не принял.
20 май 13, 17:37    [14322794]     Ответить | Цитировать Сообщить модератору
 Re: Запросы select. Триггер  [new]
Selecsus
Member

Откуда:
Сообщений: 5
aleks2, спасибо.

Но тут тогда вопрос:
on i.End_date_WG>= g.Begin_Date_WG and i.Begin_Date_WG <= g.End_date_WG


Что за такая "хитрая" проверка?
Конец нового позже начала старого и начало нового раньше конца старого?
20 май 13, 17:56    [14322888]     Ответить | Цитировать Сообщить модератору
 Re: Запросы select. Триггер  [new]
Selecsus
Member

Откуда:
Сообщений: 5
Так сделал. Вроде, работает.
Create Trigger Work
on Group_on_Object
for insert, update
as
begin
if exists (select * 
             from Group_on_Object g inner join inserted i
                  on i.End_date_WG>= g.Begin_Date_WG and i.Begin_Date_WG <= g.End_date_WG
                     and i.ID_Work<>g.ID_Work
					 and i.Number=g.Number
           )
  raiserror('Бригада в это время уже занята', 16, 1)
end
21 май 13, 01:14    [14324129]     Ответить | Цитировать Сообщить модератору
 Re: Запросы select. Триггер  [new]
Selecsus
Member

Откуда:
Сообщений: 5
Остальное, вроде, додумал. Не знаю, насколько верно ли. Больно фигово получилось, но что-то выводит... :)

Осталось:

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

Может, кто подскажет?
21 май 13, 02:40    [14324181]     Ответить | Цитировать Сообщить модератору
 Re: Запросы select. Триггер  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
Selecsus
Осталось:
получение отчета о бригадах, с которыми данной бригаде предстоит работать на каждом объекте строительства
Может, кто подскажет?
Что конкретно Вам непонятно? Если задание, то нужно спрашивать у руководителя. Вы уже поняли как должен выглядеть этот отчет?
21 май 13, 04:27    [14324204]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить