Інформаційна система фотоцентру
Аналіз предметної області та визначення необхідного набору атрибутів для кожної із сутностей інформаційної системи фотоцентру. Створення спроектованої бази даних SQL із допомогою використання систем управління базами даних MS SQL Server 2000-2005.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | украинский |
Дата добавления | 11.11.2015 |
Размер файла | 1,5 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Міністерство освіти і науки України
Запорізька державна інженерна академія
Факультет автоматизованих систем виробництва
Кафедра програмного забезпечення автоматизованих систем
КУРСОВА РОБОТА
з курсу «Організація баз даних та знань»
тема: Інформаційна система фотоцентру
Спеціальність 7.05010301 «Програмне забезпечення систем»
Запоріжжя 2014
?????
1. ????????
2. ???? ??????
2.1 ????????? ??? ????????? ????????
2.2 ????????? ??? ???? ?????????????
2.3 ???? ????????? ???????
2.4 ???? Windows ??????????
2.5 ???? Web-??????????
??????????
1. Завдання
Для приведеної нижче задачі виповнюю наступний комплекс робіт:
1. Побудувати інформаційну концептуальну модель (ER - модель), необхідно для того щоб:
· Проаналізувати предметну область, при необхідності уточнити і удосконалити її, виявити необхідний набір сутностей
· Визначити потрібний набір атрибутів для кожної сутності, виділивши ідентифікуючий набір атрибутів
· Визначити зв'язки між об'єктами, формалізувати зв'язки між об'єктами ( множина и т.д.)
· Описати одержану ER - модель на язику ER - діаграми
2. Отримати реляційну схему із ER - моделі, для того щоб:
· Побудувати набір необхідних відносин бази даних;
· Виділити первісний і зовнішній ключі визначених відносин;
· Привести отримані відносини до третьої нормальної форми;
· Визначити обмеження цілісності для зовнішніх ключів відносин і для відносин взагалі;
· Представити зв'язки між зовнішніми і первинними ключами;
3. Використовуючи СУБД MS SQL Server 2000-2005 створити спроектовану базу даних на SQL.
4. Виконати на SQL необхідні дії з додавання, модифікації і видалення даних в таблицях створеної бази даних;
5. На мові SQL для вказаних у варіанті завдання запитів створити вистави(змінні і незмінні).
6. Перевірити працездатність вистав в інтерактивному режимі.
7. Призначені для користувача застосування
· Створити Windows- інтерфейс користувача і Web- інтерфейс.
· Створити систему безпеки.
Вивчити предметну область задану згідно варіанту. Продумати та спроектувати схему бази даних, яка має містити не менше 10 таблиць, та не менше 20 записів у кожній з них (за виключенням тих, які по змісту цього не потребують). Заповнити базу.
Інформаційна система фотоцентру
Фотоцентр має головний офіс і мережу філій і кіосків прийому замовлень, розташованих за певними адресами. Філії та кіоски розрізняються кількістю робочих місць. У кіосках здійснюється тільки прийом замовлень, тому кожен кіоск пpикpіплено до певної філії, в якій ці замовлення виконуються. У філіях є необхідне обладнання для пpоявки плівок і друку фотографій. Філії та кіоски приймають замовлення на пpоявку плівок, друк фотографій і пpоявку та друк разом. У замовленні на друк вказується кількість фотографій з кожного кадру, загальна кількість фотографій, формат, тип паперу та термін виконання замовлення. При замовленні великої кількості фотографій передбачаються знижки. Термінові замовлення приймаються тільки у філіях і вони мають ціну в два pази більшу, ніж звичайне замовлення. При придбанні дисконтної картки клієнт одержує значні знижки на друк фотографій. Плівка, яку придбали в тій самій філії, куди її принесли на пpоявку, проявляється безкоштовно. Клієнтів по всій базі розділяються на професіоналів і любителів. Професіоналам, які приносять замовлення в одну ту й саму філію, можуть бути запропоновані персональні знижки. Фотомагазин та кіоски пропонують на продаж різноманітні фототовари: фотоплівки, фотоапарати, альбоми. Фотомагазин також пропонує додаткові види послуг: фотографії на документи, реставрація фотографій, прокат фотоапаратів, художнє фото, послуги професійного фотографа. Відомості про виконані замовлення та продаж різних фототоварів збираються й обробляються, і на основі цієї інформації робиться загальне замовлення на поставку матеріалів (фотобумага, фотоплівка, хімічні реактиви), фототоварів і обладнання. Отримані товари і матеріали розподіляються відповідно до запитів по кіосках і магазинах. У фотоцентру може бути декілька постачальників, що спеціалізуються на різних поставках, або на постачанні фототоварів різних фірм.
Види запитів в інформаційній системі:
1. Одержати перелік і загальну кількість пунктів прийому замовлень на фотороботи по філіях, по кіосках прийому замовлень, в цілому по фотоцентру. інформаційний система база дані
2. Одержати перелік і загальну кількість замовлень на фотороботи по філіях, кіоскам прийому замовлень, в цілому по фотоцентру, що надійшли протягом деякого періоду часу.
3. Одержати перелік і загальну кількість замовлень (окремо простих і термінових) на окремі види фоторобіт, що надійшли протягом деякого періоду часу, до вказаної філії, кіоску прийому замовлень.
4. Одержати суму виторгу із замовлень (окремо простих і термінових) на окремі види фоторобіт, що надійшли протягом деякого періоду часу, до вказаної філії, кіоску прийому замовлень.
5. Отримати кількість надрукованих фотографій у рамках простих і термінових замовлень фотоцентру в цілому за певний період часу.
6. Отримати кількість проявлених фотоплівок в рамках простих і термінових замовлень вказаної філії, кіоску прийому замовлень, фотоцентру в цілому за певний період часу.
7. Отримати перелік постачальників у цілому по фотоцентру, постачальників окремих видів фототоварів, що зробили поставки в певний період, поставки певного обсягу.
8. Отримати список клієнтів в цілому по фотоцентру, клієнтів зазначеної філії, які мають знижки; що зробили замовлення певного обсягу.
9. Одержати суму виторгу від реалізації фототоварів в цілому по фотоцентру, вказаної філії; проданих протягом деякого періоду часу.
10. Отримати перелік фототоварів і фірм, що їх виробляють, які користуються найбільшим попитом у цілому по фотоцентру, у зазначеному філії.
11. Отримати перелік реалізованих фототоварів та обсяги їх реалізації в цілому по фотоцентру, вказаній філії, проданих протягом деякого періоду часу.
12. Отримати перелік робочих місць фотоцентру в цілому та зазначеного профілю.
2. Опис логіки
2.1 Відомості про структуру програми
Рисунок 1
Програма складається з серверної частини, додатку для користувача, який працює у ОС Windows та web-інтерфейсу. Серверна частина - це Microsoft SQL Server 2008 з встановленою базою даних. Схема бази даних представлена на рисунку 1.
2.2 Відомості про мову програмування
Windows та web клієнт написаний на мові С# у середовищі Microsoft Visual Studio 2010 з використанням ADO.NET. Код бази даних написаний за допомогою Microsoft SQL Server Management Studio на мові Transact-SQL.
2.3 Опис серверної частини
Нижче приведено код створення бази даних на мові Transact-SQL. Код складається с декількох частин, спочатку створюються необхідні таблиці та індекси, потім створюються необхідні представлення, функції та процедури. Для забезпечення цілісності базі даних створюються тригери, а для забезпечення безпеки створюються ролі та користувачі.
-------------------------------------------------------------
-- Створення бази даних PhotoCenterDB --
-------------------------------------------------------------
USE master;
GO
IF DB_ID (N'PhotoCenterDB') IS NOT NULL
DROP DATABASE PhotoCenterDB;
GO
CREATE DATABASE PhotoCenterDB
ON ( NAME = photo_dat, FILENAME = 'c:\photo_dat.mdf')
LOG ON ( NAME = photo_log, FILENAME = 'c:\photo_dat.ldf')
GO
SET DATEFORMAT dmy
GO
USE PhotoCenterDB
GO
-- Таблиці
CREATE TABLE Должности (
"IDДолжности" tinyint PRIMARY KEY,
"Название" nvarchar(20) NOT NULL,
"Оклад" money CHECK("Оклад">0)
)
GO
CREATE TABLE Филиалы (
"ID" tinyint PRIMARY KEY,
"Адрес" nvarchar(50) NOT NULL,
"Киоск" bit DEFAULT 0,
"IDФилиала" tinyint FOREIGN KEY REFERENCES "Филиалы" ON UPDATE NO ACTION ON DELETE NO ACTION
)
GO
CREATE TABLE Сотрудники (
"IDСотрудника" smallint IDENTITY(1,1) PRIMARY KEY,
"IDДолжности" tinyint FOREIGN KEY REFERENCES "Должности" ON UPDATE CASCADE ON DELETE SET NULL,
"IDФилиала" tinyint FOREIGN KEY REFERENCES "Филиалы" ON UPDATE CASCADE ON DELETE SET NULL,
"Фамилия" nvarchar(30) NOT NULL,
"Имя" nvarchar(15) NOT NULL,
"Отчество" nvarchar(15) NOT NULL,
"UserName" nvarchar(15)
)
GO
CREATE TABLE "Типы клиентов" (
"IDТипКлиента" tinyint PRIMARY KEY,
"Описание" nvarchar(20) NOT NULL
)
GO
CREATE TABLE Клиенты (
"IDКлиента" bigint IDENTITY(1,1) PRIMARY KEY,
"IDТипКлиента" tinyint FOREIGN KEY REFERENCES "Типы клиентов" ON UPDATE CASCADE ON DELETE SET NULL,
"Фамилия" nvarchar(30) NOT NULL,
"Имя" nvarchar(15) NOT NULL,
"Отчество" nvarchar(15) NOT NULL
)
GO
CREATE TABLE Заказы (
"IDЗаказа" int IDENTITY(1,1) PRIMARY KEY,
"IDФилиала" tinyint FOREIGN KEY REFERENCES Филиалы ON UPDATE NO ACTION ON DELETE NO ACTION,
"Дата приёма" datetime DEFAULT GETDATE(),
"Срочный" bit DEFAULT 0,
"IDКлиента" bigint FOREIGN KEY REFERENCES Клиенты ON UPDATE CASCADE ON DELETE SET NULL,
"IDСотрудника" smallint FOREIGN KEY REFERENCES Сотрудники ON UPDATE CASCADE ON DELETE SET NULL,
)
GO
CREATE TABLE "Дисконтные карты" (
"IDКарты" int PRIMARY KEY,
"IDКлиента" bigint UNIQUE FOREIGN KEY REFERENCES Клиенты ON UPDATE CASCADE ON DELETE CASCADE,
"Скидка" float NOT NULL
)
GO
CREATE TABLE "Проданные плёнки" (
"IDПлёнки" int IDENTITY(1,1) PRIMARY KEY,
"IDКлиента" bigint FOREIGN KEY REFERENCES Клиенты ON UPDATE CASCADE ON DELETE CASCADE,
"IDСотрудника" smallint FOREIGN KEY REFERENCES Сотрудники ON UPDATE CASCADE ON DELETE SET NULL,
"IDФилиала" tinyint FOREIGN KEY REFERENCES Филиалы ON UPDATE NO ACTION ON DELETE NO ACTION
)
GO
CREATE TABLE Продажи (
"IDПродажи" bigint IDENTITY(1,1) PRIMARY KEY,
"Дата" datetime DEFAULT GETDATE(),
"IDФилиала" tinyint FOREIGN KEY REFERENCES Филиалы ON UPDATE NO ACTION ON DELETE NO ACTION,
"IDСотрудника" smallint FOREIGN KEY REFERENCES Сотрудники ON UPDATE CASCADE ON DELETE SET NULL
)
GO
CREATE TABLE Категории (
"IDКатегории" smallint PRIMARY KEY,
"Описание" nvarchar(100) NOT NULL
)
GO
CREATE TABLE Поставщики (
"IDПоставщика" smallint PRIMARY KEY,
"Название" nvarchar(20) NOT NULL,
"Адрес" nvarchar(50)
)
GO
CREATE TABLE Товары (
"IDТовара" int IDENTITY(1,1) PRIMARY KEY,
"Описание" nvarchar(100),
"Цена" money CHECK("Цена">0),
"IDКатегории" smallint FOREIGN KEY REFERENCES Категории ON UPDATE CASCADE ON DELETE SET NULL,
"IDПоставщика" smallint FOREIGN KEY REFERENCES Поставщики ON UPDATE CASCADE ON DELETE SET NULL
)
GO
CREATE TABLE "Описание продажи" (
"IDПродажи" bigint NOT NULL,
"IDТовара" int NOT NULL,
"Количество" int CHECK ("Количество">0),
CONSTRAINT "PK_Описание_продажи" PRIMARY KEY
(
"IDПродажи",
"IDТовара"
),
CONSTRAINT "FK_Описание_продажи_Продажи" FOREIGN KEY
(
"IDПродажи"
) REFERENCES Продажи ("IDПродажи") ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT "FK_Описание_продажи_Продукты" FOREIGN KEY
(
"IDТовара"
) REFERENCES "Товары" ("IDТовара") ON UPDATE CASCADE ON DELETE CASCADE
)
GO
CREATE TABLE "Типы услуг" (
"IDТипУслуги" int PRIMARY KEY,
"Описание" nvarchar(100) NOT NULL,
"Стоимость" money CHECK("Стоимость">0)
)
GO
CREATE TABLE "Дополнительные услуги" (
"IDУслуги" int IDENTITY(1,1) PRIMARY KEY,
"IDТипУслуги" int FOREIGN KEY REFERENCES "Типы услуг" ON UPDATE CASCADE ON DELETE SET NULL,
"IDФилиала" tinyint FOREIGN KEY REFERENCES Филиалы ON UPDATE NO ACTION ON DELETE NO ACTION,
"Дата" datetime DEFAULT GETDATE(),
"IDКлиента" bigint FOREIGN KEY REFERENCES Клиенты ON UPDATE CASCADE ON DELETE SET NULL,
"IDСотрудника" smallint FOREIGN KEY REFERENCES Сотрудники ON UPDATE CASCADE ON DELETE SET NULL,
)
GO
CREATE TABLE "Тип Бумаги" (
"IDТипаБумаги" smallint PRIMARY KEY,
"Описание" nvarchar(100) NOT NULL
)
GO
CREATE TABLE "Формат Бумаги" (
"IDФормат" smallint PRIMARY KEY,
"Описание" nvarchar(100) NOT NULL
)
GO
CREATE TABLE "Типы фотографий" (
"IDТипаФото" smallint PRIMARY KEY,
"Цена" money CHECK("Цена">0),
"IDФормат" smallint FOREIGN KEY REFERENCES "Формат Бумаги" ON UPDATE CASCADE ON DELETE SET NULL,
"IDТипаБумаги" smallint FOREIGN KEY REFERENCES "Тип Бумаги" ON UPDATE CASCADE ON DELETE SET NULL
)
GO
CREATE TABLE Плёнка (
"IDПлёнки" int PRIMARY KEY
)
GO
CREATE TABLE "Описание заказа" (
"IDОписанияЗаказа" int IDENTITY(1,1) PRIMARY KEY,
"IDЗаказа" int FOREIGN KEY REFERENCES "Заказы" ON UPDATE CASCADE ON DELETE CASCADE,
"Проявка" bit,
"Печать" bit,
"IDПлёнки" int FOREIGN KEY REFERENCES "Плёнка" ON UPDATE CASCADE ON DELETE CASCADE
)
GO
CREATE TABLE Кадры (
"IDКадра" bigint IDENTITY(1,1) PRIMARY KEY NONCLUSTERED,
"IDПленки" int FOREIGN KEY REFERENCES Плёнка ON UPDATE CASCADE ON DELETE CASCADE,
"НомерКадра" tinyint,
"Количество" tinyint CHECK("Количество">0),
"IDТипаФото" smallint FOREIGN KEY REFERENCES "Типы фотографий" ON UPDATE CASCADE ON DELETE SET NULL
)
GO
-- Індекси
CREATE CLUSTERED INDEX ИндексПоПленкам ON Кадры (IDПленки)
GO
CREATE INDEX ИндексКлиентов ON Клиенты(Фамилия,Имя,Отчество)
GO
CREATE INDEX ИндексПоКлиентамВЗаказах ON Заказы (IDКлиента)
GO
-- Функціі
CREATE FUNCTION СтоимостьЗаказа ( @IDЗаказа int)
RETURNS MONEY
AS
BEGIN
DECLARE @Сумма MONEY
DECLARE @СуммаЗаПроявку MONEY
DECLARE @Скидка float
DECLARE @СкидкаДисконт float
DECLARE @Срочный bit
SELECT @Срочный = Срочный FROM Заказы WHERE Заказы.IDЗаказа = @IDЗаказа
SELECT @Скидка = (CASE WHEN IDТипКлиента = 1THEN 1 WHEN IDТипКлиента = 2 THEN 0.95 END)
FROM Заказы INNER JOIN Клиенты ON Заказы.IDКлиента = Клиенты.IDКлиента
WHERE Заказы.IDЗаказа = @IDЗаказа
SELECT @СкидкаДисконт = Скидка
FROM [Дисконтные карты] INNER JOIN (Заказы INNER JOIN Клиенты ON Заказы.IDКлиента = Клиенты.IDКлиента)
ON Клиенты.IDКлиента = [Дисконтные карты].IDКлиента
WHERE Заказы.IDЗаказа = @IDЗаказа
IF @СкидкаДисконт IS NOT NULL
SET @Скидка = @Скидка * ((100-@СкидкаДисконт)/100)
--Сумма за печать фотографий
SELECT @Сумма = SUM(Количество*Цена)
FROM (((Заказы INNER JOIN [Описание заказа] ON [Описание заказа].IDЗаказа = Заказы.IDЗаказа)
INNER JOIN Плёнка ON [Описание заказа].IDПлёнки = Плёнка.IDПлёнки )
INNER JOIN Кадры ON Кадры.IDПленки = Плёнка.IDПлёнки) INNER JOIN [Типы фотографий] ON [Типы фотографий].IDТипаФото = Кадры.IDТипаФото
WHERE Заказы.IDЗаказа = @IDЗаказа AND Печать = 1
--Сумма за проявку
SELECT @СуммаЗаПроявку = COUNT(*) * 5
FROM Заказы INNER JOIN [Описание заказа] ON [Описание заказа].IDЗаказа = Заказы.IDЗаказа
WHERE Заказы.IDЗаказа = @IDЗаказа AND Проявка = 1
IF @Сумма IS NULL
SET @Сумма = 0
IF @Срочный = 0
SET @Сумма =((@Сумма + @СуммаЗаПроявку)*@Скидка)
IF @Срочный = 1
SET @Сумма =(((@Сумма + @СуммаЗаПроявку)*@Скидка)*2)
RETURN @Сумма
END
GO
CREATE FUNCTION СтоимостьПродажи ( @IDПродажи int)
RETURNS MONEY
AS
BEGIN
DECLARE @Сумма MONEY
SELECT @Сумма = SUM(Цена*Количество)
FROM (Продажи INNER JOIN [Описание продажи] ON Продажи.IDПродажи =[Описание продажи].IDПродажи)
INNER JOIN Товары ON Товары.IDТовара = [Описание продажи].IDТовара
WHERE Продажи.IDПродажи = @IDПродажи
IF @Сумма IS NULL
SET @Сумма = 0
RETURN @Сумма
END
GO
CREATE FUNCTION ЗаказыЗаСегодня ()
RETURNS TABLE
AS
RETURN (
SELECT * FROM Заказы WHERE DATEPART(yyyy,Заказы.[Дата приёма]) = DATEPART(yyyy,GETDATE()) AND
DATEPART(dy,Заказы.[Дата приёма]) = DATEPART(dy,GETDATE()))
GO
CREATE FUNCTION Заказы_филиала( @fil tinyint)
RETURNS Table
AS
RETURN(SELECT * FROM Заказы WHERE Заказы.IDФилиала=@fil )
GO
-- Представлення
CREATE VIEW Список_всех_филиалов AS
SELECT *
FROM Филиалы
GO
CREATE VIEW Список_киосков_по_филиалам AS
SELECT ф1.ID,ф1.Адрес AS [Адрес филиала],ф2.ID AS IDКиоска,ф2.Адрес AS [Адрес киоска]
FROM Филиалы ф1, Филиалы ф2
WHERE ф1.ID = ф2.IDФилиала
GO
CREATE VIEW Список_филиалов AS
SELECT *
FROM Филиалы
WHERE Киоск = 0
GO
CREATE VIEW Список_киосков AS
SELECT *
FROM Филиалы
WHERE Киоск = 1
GO
CREATE VIEW Поставщики_по_категориям
AS
SELECT Distinct Поставщики.Название,Категории.Описание
FROM (Поставщики INNER JOIN Товары ON Поставщики.IDПоставщика = Товары.IDПоставщика) INNER JOIN Категории ON Категории.IDКатегории = Товары.IDКатегории
GO
CREATE VIEW Поставщики_по_товарам
AS
SELECT Поставщики.Название, Товары.Описание
FROM (Поставщики INNER JOIN Товары ON Поставщики.IDПоставщика = Товары.IDПоставщика)
GO
CREATE VIEW СписокЗаказов AS
SELECT Заказы.IDЗаказа AS ID, Клиенты.IDКлиента, Филиалы.ID AS IDФилиала, Сотрудники.IDСотрудника, [Типы клиентов].IDТипКлиента,
Сотрудники.Фамилия + ' ' + SUBSTRING(Сотрудники.Имя,0,2)+ '. ' + SUBSTRING(Сотрудники.Отчество,0,2) +'.' AS Сотрудник,
Филиалы.Адрес AS Филиал,[Дата приёма], Срочный AS Срочность,
Клиенты.Фамилия + ' ' + SUBSTRING(Клиенты.Имя,0,2)+ '. ' + SUBSTRING(Клиенты.Отчество,0,2) +'.' AS Клиент,
[Типы клиентов].Описание AS [Тип клиента],dbo.СтоимостьЗаказа(Заказы.IDЗаказа)AS Стоимость
FROM ((((Заказы INNER JOIN Филиалы ON Заказы.IDФилиала = Филиалы.ID)
INNER JOIN Клиенты ON Клиенты.IDКлиента = Заказы.IDКлиента) )INNER JOIN Сотрудники ON Сотрудники.IDСотрудника = Заказы.IDСотрудника)
INNER JOIN [Типы клиентов] ON [Типы клиентов].IDТипКлиента = Клиенты.IDТипКлиента
GO
CREATE VIEW СписокКлиентов AS
SELECT IDКлиента,Клиенты.Фамилия + ' ' + SUBSTRING(Клиенты.Имя,0,2)+ '. ' + SUBSTRING(Клиенты.Отчество,0,2) +'.' AS Клиент
FROM Клиенты
GO
CREATE VIEW СписокТиповБумаг AS
SELECT [Типы фотографий].IDТипаФото, [Тип Бумаги].Описание + ' ' + [Формат Бумаги].Описание AS Описание
FROM ([Типы фотографий] INNER JOIN [Формат Бумаги] ON [Типы фотографий].IDФормат = [Формат Бумаги].IDФормат)
INNER JOIN [Тип Бумаги] ON [Тип Бумаги].IDТипаБумаги = [Типы фотографий].IDТипаБумаги
GO
CREATE VIEW ОписаниеПлёнки AS
SELECT Кадры.IDПленки,Кадры.НомерКадра,Кадры.Количество, [Тип Бумаги].Описание AS Бумага, [Формат Бумаги].Описание AS Формат
FROM(([Типы фотографий] INNER JOIN [Формат Бумаги] ON [Типы фотографий].IDФормат = [Формат Бумаги].IDФормат)
INNER JOIN [Тип Бумаги] ON [Тип Бумаги].IDТипаБумаги = [Типы фотографий].IDТипаБумаги) INNER JOIN Кадры ON
Кадры.IDТипаФото = [Типы фотографий].IDТипаФото
GO
CREATE VIEW СписокПродаж AS
SELECT Продажи.IDПродажи AS ID, Продажи.Дата, Филиалы.ID AS IDФилиала, Сотрудники.IDСотрудника, Товары.IDТовара,
Сотрудники.Фамилия + ' ' + SUBSTRING(Сотрудники.Имя,0,2)+ '. ' + SUBSTRING(Сотрудники.Отчество,0,2) +'.' AS Сотрудник,
Филиалы.Адрес AS Филиал, Товары.Описание AS Товар,[Описание продажи].Количество, dbo.СтоимостьПродажи(Продажи.IDПродажи) AS Стоимость
FROM (((Продажи INNER JOIN [Описание продажи] ON Продажи.IDПродажи = [Описание продажи].IDПродажи)
INNER JOIN Товары ON Товары.IDТовара = [Описание продажи].IDТовара)
INNER JOIN Сотрудники ON Сотрудники.IDСотрудника = Продажи.IDСотрудника)
INNER JOIN Филиалы ON Продажи.IDФилиала = Филиалы.ID
GO
CREATE VIEW СписокКлиентовПолный AS
SELECT Клиенты.IDКлиента AS ID,Клиенты.Фамилия,Клиенты.Имя,Клиенты.Отчество,[Типы клиентов].Описание AS Тип,
ISNULL([Дисконтные карты].IDКарты,0) AS Карта, ISNULL([Дисконтные карты].Скидка,0) AS Скидка
FROM (Клиенты INNER JOIN [Типы клиентов] ON Клиенты.IDТипКлиента = [Типы клиентов].IDТипКлиента)
LEFT JOIN [Дисконтные карты] ON Клиенты.IDКлиента = [Дисконтные карты].IDКлиента
GO
CREATE VIEW Владельцы_дисконтных_карт AS
SELECT Фамилия,Имя,Отчество,IDКарты,Скидка
FROM КлиентыINNER JOIN [Дисконтные карты] ON [Дисконтные карты].IDКлиента = Клиенты.IDКлиента
GO
CREATE VIEW Список_поставщиков AS
SELECT *
FROM Поставщики
GO
CREATE VIEW ДопУслуги AS
SELECT[Дополнительные услуги].IDУслуги AS ID,Клиенты.IDКлиента, Филиалы.ID AS IDФилиала, Сотрудники.IDСотрудника,
Сотрудники.Фамилия + ' ' + SUBSTRING(Сотрудники.Имя,0,2)+ '. ' + SUBSTRING(Сотрудники.Отчество,0,2) +'.' AS Сотрудник,
Филиалы.Адрес AS Филиал,[Дополнительные услуги].Дата,
Клиенты.Фамилия + ' ' + SUBSTRING(Клиенты.Имя,0,2)+ '. ' + SUBSTRING(Клиенты.Отчество,0,2) +'.' AS Клиент,
[Типы услуг].Описание AS Услуга,[Типы услуг].Стоимость
FROM((([Дополнительные услуги] INNER JOIN [Типы услуг] ON [Дополнительные услуги].IDТипУслуги =[Типы услуг].IDТипУслуги)
INNER JOIN Клиенты ON [Дополнительные услуги].IDКлиента = Клиенты.IDКлиента)
INNER JOIN Филиалы ON [Дополнительные услуги].IDФилиала = Филиалы.ID)
INNER JOIN Сотрудники ON [Дополнительные услуги].IDСотрудника = Сотрудники.IDСотрудника
GO
CREATE VIEW СписокПроданныхПлёнок AS
SELECT[Проданные плёнки].IDПлёнки AS ID,
Сотрудники.Фамилия + ' ' + SUBSTRING(Сотрудники.Имя,0,2)+ '. ' + SUBSTRING(Сотрудники.Отчество,0,2) +'.' AS Сотрудник,
Филиалы.Адрес AS Филиал,
Клиенты.Фамилия + ' ' + SUBSTRING(Клиенты.Имя,0,2)+ '. ' + SUBSTRING(Клиенты.Отчество,0,2) +'.' AS Клиент
FROM(([Проданные плёнки] INNER JOIN Клиенты ON [Проданные плёнки].IDКлиента = Клиенты.IDКлиента)
INNER JOIN Филиалы ON [Проданные плёнки].IDФилиала = Филиалы.ID)
INNER JOIN Сотрудники ON [Проданные плёнки].IDСотрудника = Сотрудники.IDСотрудника
GO
CREATE PROCEDURE Киоски_по_филиалу
@fil tinyint
AS
SELECT ф1.ID,ф1.Адрес AS [Адрес филиала],ф2.ID AS IDКиоска,ф2.Адрес AS [Адрес киоска]
FROM Филиалы ф1, Филиалы ф2
WHERE ф1.ID = ф2.IDФилиала AND ф1.ID = @fil
GO
CREATE PROCEDURE Филиал_по_киоску
@fil tinyint
AS
SELECT ф1.ID,ф1.Адрес AS [Адрес филиала],ф2.ID AS IDКиоска,ф2.Адрес AS [Адрес киоска]
FROM Филиалы ф1, Филиалы ф2
WHERE ф1.ID = ф2.IDФилиала AND ф2.ID = @fil
GO
CREATE PROCEDURE Количество_филиалов AS
DECLARE @cnt int
SELECT @cnt = COUNT(*)
FROM Филиалы
RETURN @cnt
GO
CREATE PROCEDURE СписокЗаказовПоТипу
@type int,
@urgent bit = NULL,
@fil tinyint =NULL,
@date1 date =NULL,
@date2 date =NULL
AS
SELECT DISTINCT Заказы.IDЗаказа AS ID, Клиенты.IDКлиента, Филиалы.ID AS IDФилиала, Сотрудники.IDСотрудника, [Типы клиентов].IDТипКлиента,
Сотрудники.Фамилия + ' ' + SUBSTRING(Сотрудники.Имя,0,2)+ '. ' + SUBSTRING(Сотрудники.Отчество,0,2) +'.' AS Сотрудник,
Филиалы.Адрес AS Филиал,[Дата приёма], Срочный AS Срочность,
Клиенты.Фамилия + ' ' + SUBSTRING(Клиенты.Имя,0,2)+ '. ' + SUBSTRING(Клиенты.Отчество,0,2) +'.' AS Клиент,
[Типы клиентов].Описание AS [Тип клиента],dbo.СтоимостьЗаказа(Заказы.IDЗаказа)AS Стоимость
FROM (((((Заказы INNER JOIN Филиалы ON Заказы.IDФилиала = Филиалы.ID)
INNER JOIN Клиенты ON Клиенты.IDКлиента = Заказы.IDКлиента) )INNER JOIN Сотрудники ON Сотрудники.IDСотрудника = Заказы.IDСотрудника)
INNER JOIN [Типы клиентов] ON [Типы клиентов].IDТипКлиента = Клиенты.IDТипКлиента) INNER JOIN [Описание заказа] ON [Описание заказа].IDЗаказа = Заказы.IDЗаказа
WHERE (Заказы.Срочный = @urgent OR @urgent IS NULL)
AND (Заказы.IDФилиала = @fil OR @fil IS NULL)
AND (Заказы.[Дата приёма]>@date1 OR @date1 IS NULL)
AND (Заказы.[Дата приёма]<@date2 OR @date2 IS NULL)
AND ([Описание заказа].Проявка = CASE @type WHEN 1 THEN 1 WHEN 3 THEN 1 ELSE 0 END OR @type = 0)
AND ([Описание заказа].Печать = CASE @type WHEN 2 THEN 1 WHEN 3 THEN 1 ELSE 0 END OR @type = 0)
GO
CREATE PROCEDURE СуммаВыторга
@type int,
@urgent bit = NULL,
@fil tinyint =NULL,
@date1 date =NULL,
@date2 date =NULL
AS
SELECT SUM(dbo.СтоимостьЗаказа(Заказы.IDЗаказа)) AS [Сумма выторга]
FROM Заказы
WHERE Заказы.IDЗаказа IN (SELECT DISTINCT Заказы.IDЗаказа
FROM Заказы INNER JOIN [Описание заказа] ON [Описание заказа].IDЗаказа = Заказы.IDЗаказа
WHERE (Заказы.Срочный = @urgent OR @urgent IS NULL)
AND (Заказы.IDФилиала = @fil OR @fil IS NULL)
AND (Заказы.[Дата приёма]>@date1 OR @date1 IS NULL)
AND (Заказы.[Дата приёма]<@date2 OR @date2 IS NULL)
AND ([Описание заказа].Проявка = CASE @type WHEN 1 THEN 1 WHEN 3 THEN 1 ELSE 0 END OR @type = 0)
AND ([Описание заказа].Печать = CASE @type WHEN 2 THEN 1 WHEN 3 THEN 1 ELSE 0 END OR @type = 0))
GO
CREATE PROCEDURE Количество_напечатанных_фотографий
@urgent bit = NULL,
@fil tinyint =NULL,
@date1 date =NULL,
@date2 date =NULL
AS
SELECT SUM(Количество) AS Количество
FROM ((Заказы INNER JOIN [Описание заказа] ON [Описание заказа].IDЗаказа = Заказы.IDЗаказа)
INNER JOIN Плёнка ON [Описание заказа].IDПлёнки = Плёнка.IDПлёнки )
INNER JOIN Кадры ON Кадры.IDПленки = Плёнка.IDПлёнки
WHERE (Заказы.Срочный = @urgent OR @urgent IS NULL)
AND (Заказы.IDФилиала = @fil OR @fil IS NULL)
AND (Заказы.[Дата приёма]>@date1 OR @date1 IS NULL)
AND (Заказы.[Дата приёма]<@date2 OR @date2 IS NULL)
GO
CREATE PROCEDURE Количество_проявленных_плёнок
@urgent bit = NULL,
@fil tinyint =NULL,
@date1 date =NULL,
@date2 date =NULL
AS
SELECT COUNT (*) AS Количество
FROM (Заказы INNER JOIN Филиалы ON Заказы.IDФилиала = Филиалы.ID) INNER JOIN [Описание заказа] ON [Описание заказа].IDЗаказа = Заказы.IDЗаказа
WHERE [Описание заказа].Проявка = 1 AND(Заказы.Срочный = @urgent OR @urgent IS NULL)
AND (Заказы.IDФилиала = @fil OR @fil IS NULL)
AND (Заказы.[Дата приёма]>@date1 OR @date1 IS NULL)
AND (Заказы.[Дата приёма]<@date2 OR @date2 IS NULL)
GO
CREATE PROCEDURE Список_клиентов_по_филиалам
@fil int = NULL
AS
SELECT DISTINCT Клиенты.IDКлиента AS ID,Клиенты.Фамилия,Клиенты.Имя,Клиенты.Отчество,[Типы клиентов].Описание AS Тип,
ISNULL([Дисконтные карты].IDКарты,0) AS Карта, ISNULL([Дисконтные карты].Скидка,0) AS Скидка
FROM ((Клиенты INNER JOIN [Типы клиентов] ON Клиенты.IDТипКлиента = [Типы клиентов].IDТипКлиента)
LEFT JOIN [Дисконтные карты] ON Клиенты.IDКлиента = [Дисконтные карты].IDКлиента)
INNER JOIN Заказы ON Клиенты.IDКлиента = Заказы.IDКлиента
WHERE (Заказы.IDФилиала = @fil OR @fil IS NULL)
GO
CREATE PROCEDURE Клиенты_сделавшие_заказы_больше_чем
@pr money
AS
SELECT IDКлиента AS ID,Клиент, SUM(Стоимость) AS Сумма
FROM СписокЗаказов
GROUP BY СписокЗаказов.IDКлиента,СписокЗаказов.Клиент
HAVING SUM(Стоимость)>@pr
GO
CREATE PROCEDURE СписокРаботников
@id tinyint = NULL
AS
IF @id IS NOT NULL
SELECT IDСотрудника AS ID,Фамилия,Имя,Отчество,Название AS Должность, Адрес AS Филиал
FROM (Сотрудники INNER JOIN Должности ON Сотрудники.IDДолжности = Должности.IDДолжности) INNER JOIN Филиалы ON Сотрудники.IDФилиала = Филиалы.ID
WHERE Сотрудники.IDДолжности = @id
ELSE
SELECT IDСотрудника AS ID,Фамилия,Имя,Отчество,Название AS Должность, Адрес AS Филиал
FROM (Сотрудники INNER JOIN Должности ON Сотрудники.IDДолжности = Должности.IDДолжности) INNER JOIN Филиалы ON Сотрудники.IDФилиала = Филиалы.ID
GO
CREATE PROCEDURE Выторг_от_фототоваров
@fil tinyint =NULL,
@date1 date =NULL,
@date2 date =NULL
AS
SELECT SUM(Цена*Количество) AS [Сумма выторга]
FROM (Продажи INNER JOIN [Описание продажи] ON Продажи.IDПродажи = [Описание продажи].IDПродажи) INNER JOIN Товары ON Товары.IDТовара = [Описание продажи].IDТовара
WHERE (Продажи.IDФилиала = @fil OR @fil IS NULL)
AND (Продажи.Дата>@date1 OR @date1 IS NULL)
AND (Продажи.Дата<@date2 OR @date2 IS NULL)
GO
CREATE PROCEDURE Список_фототоваров
@fil tinyint =NULL,
@date1 date =NULL,
@date2 date =NULL
AS
SELECT Описание AS Товар, SUM(Количество) AS Количество
FROM (Продажи INNER JOIN [Описание продажи] ON Продажи.IDПродажи = [Описание продажи].IDПродажи) INNER JOIN Товары ON Товары.IDТовара = [Описание продажи].IDТовара
WHERE (Продажи.IDФилиала = @fil OR @fil IS NULL)
AND (Продажи.Дата>@date1 OR @date1 IS NULL)
AND (Продажи.Дата<@date2 OR @date2 IS NULL)
GROUP BY Описание
GO
CREATE PROCEDURE Популярные_товары
@fil tinyint =NULL,
@date1 date =NULL,
@date2 date =NULL
AS
SELECT TOP 5 Описание AS Товар, SUM(Количество) AS [Продано штук]
FROM (Продажи INNER JOIN [Описание продажи] ON Продажи.IDПродажи = [Описание продажи].IDПродажи) INNER JOIN Товары ON Товары.IDТовара = [Описание продажи].IDТовара
WHERE (Продажи.IDФилиала = @fil OR @fil IS NULL)
AND (Продажи.Дата>@date1 OR @date1 IS NULL)
AND (Продажи.Дата<@date2 OR @date2 IS NULL)
GROUP BY Описание
ORDER BY SUM(Количество) DESC
GO
-- Тригери
CREATE TRIGGER Добавление_филиала ON Филиалы
AFTER INSERT,UPDATE
AS
SET NoCount ON
IF EXISTS( SELECT * FROM Inserted WHERE Киоск = 0 AND IDФилиала IS NOT NULL)
BEGIN
ROLLBACK
RAISERROR('Филиал не может быть привязан к филиалу',16,1)
RETURN
END
IF EXISTS( SELECT * FROM Inserted WHERE Киоск = 1 AND IDФилиала IS NULL)
BEGIN
ROLLBACK
RAISERROR('Киоск должен быть привязан к филиалу',16,1)
RETURN
END
IF EXISTS( SELECT * FROM Inserted INNER JOIN Филиалы ON Inserted.IDФилиала = Филиалы.ID
WHERE Inserted.Киоск = 1 AND Филиалы.Киоск = 1)
BEGIN
ROLLBACK
RAISERROR('Киоск не может быть привязан к киоску',16,1)
RETURN
END
GO
CREATE TRIGGER Добавление_проданной_плёнки ON [Проданные плёнки]
AFTER INSERT,UPDATE
AS
SET NOCOUNT ON
IF EXISTS ( SELECT * FROM Inserted INNER JOIN Сотрудники ON Inserted.IDСотрудника = Сотрудники.IDСотрудника
WHERE Inserted.IDФилиала != Сотрудники.IDФилиала)
BEGIN
ROLLBACK
RAISERROR('Сотрудник должен работать в данном филиале',16,1)
RETURN
END
GO
CREATE TRIGGER Добавление_описания_заказа ON [Описание заказа]
INSTEAD OF INSERT
AS
SET NOCOUNT ON
IF EXISTS(SELECT * FROM [Описание заказа] INNER JOIN INSERTED ON [Описание заказа].IDПлёнки = Inserted.IDПлёнки
WHERE [Описание заказа].IDПлёнки = Inserted.IDПлёнки)
BEGIN
ROLLBACK
RAISERROR('Данная плёнка уже обрабатывается',16,1)
RETURN
END
DECLARE @IDЗаказа int
DECLARE @IDПлёнки int
DECLARE @Проявка bit
DECLARE @Печать bit
SELECT @IDЗаказа = Inserted.IDЗаказа, @Проявка = Inserted.Проявка, @Печать = Inserted.Печать, @IDПлёнки = Inserted.IDПлёнки FROM Inserted
INSERT [Описание заказа] VALUES (@IDЗаказа,@Проявка,@Печать,@IDПлёнки)
GO
CREATE TRIGGER Удаление_описания_заказа ON [Описание заказа]
AFTER DELETE
AS
SET NOCOUNT ON
DECLARE @ID int
SELECT @ID = IDПлёнки FROM Deleted
DELETE FROM Плёнка WHERE IDПлёнки = @ID
GO
CREATE TRIGGER Срочность_заказа ON Заказы
AFTER INSERT,UPDATE
AS
SET NOCOUNT ON
IF EXISTS (SELECT * FROM Inserted INNER JOIN Филиалы ON Филиалы.ID = Inserted.IDФилиала
WHERE Inserted.Срочный = 1 AND Филиалы.Киоск = 1)
BEGIN
ROLLBACK
RAISERROR('Срочные заказы выполняются только в филиалах',16,1)
RETURN
END
GO
CREATE TRIGGER Добавление_дисконта ON Владельцы_дисконтных_карт
INSTEAD OF INSERT
AS
SET NOCOUNT ON
DECLARE @Фамилия nvarchar(30)
DECLARE @Имя nvarchar(15)
DECLARE @Отчество nvarchar(15)
SELECT @Фамилия = Inserted.Фамилия, @Имя = Inserted.Имя, @Отчество = Inserted.Отчество FROM Inserted
INSERT INTO Клиенты (IDТипКлиента, Фамилия, Имя, Отчество) VALUES(2,@Фамилия,@Имя,@Отчество)
DECLARE @IDКарты int
DECLARE @Скидка float
SELECT @IDКарты = Inserted.IDКарты,@Скидка = Inserted.Скидка FROM Inserted
INSERT [Дисконтные карты] VALUES (@IDКарты, @@IDENTITY, @Скидка)
GO
CREATE TRIGGER Запрет_на_изменение_таблиц
ON DATABASE
FOR CREATE_TABLE,ALTER_TABLE,DROP_TABLE
AS
ROLLBACK
RAISERROR('Изменять таблицы запрещено',16,1)
RETURN
GO
-- Дані
INSERT "Должности" VALUES(1,'Продавец',1500)
INSERT "Должности" VALUES(2,'Менеджер',2500)
INSERT "Должности" VALUES(3,'Фотограф',3000)
INSERT "Должности" VALUES(4,'Дизайнер',3500)
INSERT "Должности" VALUES(5,'Техник',2000)
INSERT "Должности" VALUES(6,'Водитель',2000)
INSERT "Должности" VALUES(7,'Охранник',2500)
INSERT "Должности" VALUES(8,'Консультант',1800)
INSERT "Должности" VALUES(9,'Директор',10000)
INSERT "Должности" VALUES(10,'Администратор',10000)
GO
INSERT "Филиалы" VALUES(1,'пр.Ленина,150',0,NULL)
INSERT "Филиалы" VALUES(2,'ул.Победы,70',0,NULL)
INSERT "Филиалы" VALUES(3,'пр.Металлургов,30',0,NULL)
INSERT "Филиалы" VALUES(4,'пр.Ленина,100',1,1)
INSERT "Филиалы" VALUES(5,'ул.Героев Сталинграда',1,2)
INSERT "Филиалы" VALUES(6,'ул.Трегубенко,22',1,3)
GO
INSERT "Сотрудники" VALUES(1,4,'Петров', 'Василий', 'Александрович','kcashier1')
INSERT "Сотрудники" VALUES(1,5,'Иванов', 'Андрей', 'Васильевич',NULL)
INSERT "Сотрудники" VALUES(1,6,'Кукушкин', 'Константин', 'Валентинович',NULL)
INSERT "Сотрудники" VALUES(2,1,'Васильков', 'Федор', 'Александрович','manag')
INSERT "Сотрудники" VALUES(2,2,'Сапожников', 'Василий', 'Андреевич','OK')
INSERT "Сотрудники" VALUES(2,3,'Петренко', 'Валентин', 'Зиновьевич',NULL)
INSERT "Сотрудники" VALUES(3,1,'Гуров', 'Константин', 'Аркадьевич',NULL)
INSERT "Сотрудники" VALUES(3,2,'Сидоров', 'Петр', 'Прокофьевич',NULL)
INSERT "Сотрудники" VALUES(3,3,'Удалов', 'Валентин', 'Андреевич',NULL)
INSERT "Сотрудники" VALUES(4,1,'Пирогов', 'Владимир', 'Петрович',NULL)
INSERT "Сотрудники" VALUES(4,2,'Шапошников', 'Василий', 'Андреевич',NULL)
INSERT "Сотрудники" VALUES(4,3,'Суворый', 'Анатолий', 'Иванович',NULL)
INSERT "Сотрудники" VALUES(5,1,'Хвостков', 'Федор', 'Иванович',NULL)
INSERT "Сотрудники" VALUES(6,2,'Мечников', 'Аркадий', 'Владимирович',NULL)
INSERT "Сотрудники" VALUES(7,1,'Быков', 'Петр', 'Владимирович',NULL)
INSERT "Сотрудники" VALUES(7,2,'Крутой', 'Андрей', 'Денисович',NULL)
INSERT "Сотрудники" VALUES(7,3,'Прутков', 'Алексей', 'Петрович',NULL)
INSERT "Сотрудники" VALUES(8,3,'Сидоренко', 'Павел', 'Петрович',NULL)
INSERT "Сотрудники" VALUES(9,1,'Жучков', 'Владимир', 'Иванович',NULL)
INSERT "Сотрудники" VALUES(10,1,'Гаусс', 'Феофан', 'Иванович','admin1')
INSERT "Сотрудники" VALUES(1,1,'Серов', 'Пётр', 'Иванович','fcashier1')
GO
INSERT "Типы клиентов" VALUES(1,'Любитель')
INSERT "Типы клиентов" VALUES(2,'Профессионал')
GO
INSERT "Категории" VALUES(1,'Расходные материалы')
INSERT "Категории" VALUES(2,'Фотоаппараты')
INSERT "Категории" VALUES(3,'Аксессуары')
GO
INSERT "Поставщики" VALUES(1,'ООО ФотоМ','пр.Ленина.11')
INSERT "Поставщики" VALUES(2,'ЧП Петров','пр.Ленина.56')
INSERT "Поставщики" VALUES(3,'ФотоМир','пр.Ленина.120')
GO
INSERT "Товары" VALUES('Фотобумага Epson',10,1,1)
INSERT "Товары" VALUES('Фотобумага Canon',11,1,1)
INSERT "Товары" VALUES('Фотоаппарат Canon eos 50',2500,2,2)
INSERT "Товары" VALUES('Фотоаппарат Sony dsc 750',1500,2,2)
INSERT "Товары" VALUES('Фотоаппарат Sony dsc 350',800,2,2)
INSERT "Товары" VALUES('Рамка для фото',25,3,3)
INSERT "Товары" VALUES('Штатив',250,3,3)
GO
INSERT "Типы услуг" VALUES(1,'Фото на документы',15)
INSERT "Типы услуг" VALUES(2,'Реставрация',150)
INSERT "Типы услуг" VALUES(3,'Прокат',50)
INSERT "Типы услуг" VALUES(4,'Художественное фото',75)
INSERT "Типы услуг" VALUES(5,'Услуги фотографа',50)
GO
INSERT "Тип Бумаги" VALUES (1,'матовая Canon')
INSERT "Тип Бумаги" VALUES (2,'глянцевая Canon')
INSERT "Тип Бумаги" VALUES (3,'матовая Epson')
INSERT "Тип Бумаги" VALUES (4,'глянцевая Epson')
GO
INSERT "Формат Бумаги" VALUES(1,'10x15')
INSERT "Формат Бумаги" VALUES(2,'8x12')
INSERT "Формат Бумаги" VALUES(3,'15x17')
INSERT "Формат Бумаги" VALUES(4,'A4')
GO
INSERT "Типы фотографий" VALUES(1,0.70,1,1)
INSERT "Типы фотографий" VALUES(2,0.70,1,2)
INSERT "Типы фотографий" VALUES(3,0.60,2,1)
INSERT "Типы фотографий" VALUES(4,0.60,2,2)
INSERT "Типы фотографий" VALUES(5,1.80,3,3)
INSERT "Типы фотографий" VALUES(6,1.90,3,4)
INSERT "Типы фотографий" VALUES(7,3.80,4,2)
INSERT "Типы фотографий" VALUES(8,3.70,4,4)
GO
-- Ролі і користувачі
CREATE PROCEDURE RoleUser
AS
SET NOCOUNT ON
declare @curUser nvarchar(30)
declare @t table(UserName nvarchar(50), RoleName nvarchar(50), LoginName nvarchar(50), DefDBName nvarchar(50), DefSchemaName nvarchar(50), UserID smallint, [SID] varbinary(100))
declare @RoleName nvarchar(50)
set @curUser = USER
insert into @t
EXEC sp_helpuser @curUser
select @RoleName = RoleName from @t
declare @name nvarchar(30)
declare @name3 nvarchar(30)
declare @surname nvarchar(30)
declare @dolgnost nvarchar(30)
declare @filial int
declare @ID int
select@ID = Сотрудники.IDСотрудника,
@name = Сотрудники.Имя,
@name3 = Сотрудники.Отчество,
@surname = Сотрудники.Фамилия,
@dolgnost = Должности.Название,
@filial = Сотрудники.IDФилиала
from Сотрудники INNER JOIN Должности ON Сотрудники.IDДолжности = Должности.IDДолжности
WHERE Сотрудники.UserName = @curUser
select @ID as IDСотрудника,@name as Имя,@name3 as Отчество,@surname as Фамилия,
@dolgnost as Должность, @filial as IDФилиала,@RoleName as RoleName,@curUser as UserName
GO
-- Кассир_киоска
EXEC sp_addrole 'Кассир_киоска'
GO
GRANT SELECT,UPDATE,DELETE,INSERT ON Заказы TO Кассир_киоска
GRANT SELECT,UPDATE,DELETE,INSERT ON [Описание заказа] TO Кассир_киоска
GRANT SELECT,UPDATE,DELETE,INSERT ON Плёнка TO Кассир_киоска
GRANT SELECT,UPDATE,DELETE,INSERT ON Кадры TO Кассир_киоска
GRANT SELECT,UPDATE,DELETE,INSERT ON Клиенты TO Кассир_киоска
GRANT SELECT ON [Типы фотографий] TO Кассир_киоска
GRANT SELECT ON [Тип Бумаги] TO Кассир_киоска
GRANT SELECT ON [Формат Бумаги] TO Кассир_киоска
GRANT SELECT ON [Типы Клиентов] TO Кассир_киоска
GRANT SELECT ON [Дисконтные карты] TO Кассир_киоска
GRANT SELECT ON Сотрудники TO Кассир_киоска
GRANT SELECT ON Должности TO Кассир_киоска
GRANT SELECT ON Филиалы TO Кассир_киоска
GRANT EXECUTE ON СтоимостьЗаказа TO Кассир_киоска
GRANT SELECT ON СписокЗаказов TO Кассир_киоска
GRANT SELECT ON СписокКлиентов TO Кассир_киоска
GRANT SELECT ON СписокТиповБумаг TO Кассир_киоска
GRANT SELECT ON ОписаниеПлёнки TO Кассир_киоска
GRANT SELECT ON СписокКлиентовПолный TO Кассир_киоска
GRANT EXECUTE ON RoleUser TO Кассир_киоска
GRANT EXECUTE ON СписокЗаказовПоТипу TO Кассир_киоска
GRANT EXECUTE ON СуммаВыторга TO Кассир_киоска
GRANT EXECUTE ON Количество_напечатанных_фотографий TO Кассир_киоска
GRANT EXECUTE ON Количество_проявленных_плёнок TO Кассир_киоска
GO
-- Кассир_филиала
EXEC sp_addrole 'Кассир_филиала'
GO
GRANT SELECT,UPDATE,DELETE,INSERT ON Заказы TO Кассир_филиала
GRANT SELECT,UPDATE,DELETE,INSERT ON [Описание заказа] TO Кассир_филиала
GRANT SELECT,UPDATE,DELETE,INSERT ON Плёнка TO Кассир_филиала
GRANT SELECT,UPDATE,DELETE,INSERT ON Кадры TO Кассир_филиала
GRANT SELECT,UPDATE,DELETE,INSERT ON Клиенты TO Кассир_филиала
GRANT SELECT,UPDATE,DELETE,INSERT ON [Дисконтные карты] TO Кассир_филиала
GRANT SELECT,UPDATE,DELETE,INSERT ON Продажи TO Кассир_филиала
GRANT SELECT,UPDATE,DELETE,INSERT ON [Описание продажи] TO Кассир_филиала
GRANT SELECT ON Товары TO Кассир_филиала
GRANT SELECT ON Поставщики TO Кассир_филиала
GRANT SELECT,UPDATE,DELETE,INSERT ON [Дополнительные услуги] TO Кассир_филиала
GRANT SELECT ON [Типы услуг] TO Кассир_филиала
GRANT SELECT,UPDATE,DELETE,INSERT ON [Проданные плёнки] TO Кассир_филиала
GRANT SELECT ON Категории TO Кассир_филиала
GRANT SELECT ON [Типы фотографий] TO Кассир_филиала
GRANT SELECT ON [Тип Бумаги] TO Кассир_филиала
GRANT SELECT ON [Формат Бумаги] TO Кассир_филиала
GRANT SELECT ON [Типы Клиентов] TO Кассир_филиала
GRANT SELECT ON Сотрудники TO Кассир_филиала
GRANT SELECT ON Должности TO Кассир_филиала
GRANT SELECT ON Филиалы TO Кассир_филиала
GRANT EXECUTE ON СтоимостьЗаказа TO Кассир_филиала
GRANT SELECT ON СписокЗаказов TO Кассир_филиала
GRANT SELECT ON СписокКлиентов TO Кассир_филиала
GRANT SELECT ON СписокТиповБумаг TO Кассир_филиала
GRANT SELECT ON ОписаниеПлёнки TO Кассир_филиала
GRANT SELECT ON СписокКлиентовПолный TO Кассир_филиала
GRANT SELECT ON СписокПродаж TO Кассир_филиала
GRANT SELECT ON Список_поставщиков TO Кассир_филиала
GRANT SELECT ON Владельцы_дисконтных_карт TO Кассир_филиала
GRANT SELECT ON ДопУслуги TO Кассир_филиала
GRANT SELECT ON СписокПроданныхПлёнок TO Кассир_филиала
GRANT EXECUTE ON RoleUser TO Кассир_филиала
GRANT EXECUTE ON СписокЗаказовПоТипу TO Кассир_филиала
GRANT EXECUTE ON СуммаВыторга TO Кассир_филиала
GRANT EXECUTE ON Количество_напечатанных_фотографий TO Кассир_филиала
GRANT EXECUTE ON Количество_проявленных_плёнок TO Кассир_филиала
GRANT EXECUTE ON Список_клиентов_по_филиалам TO Кассир_филиала
GRANT EXECUTE ON Клиенты_сделавшие_заказы_больше_чем TO Кассир_филиала
GRANT EXECUTE ON Выторг_от_фототоваров TO Кассир_филиала
GRANT EXECUTE ON Список_фототоваров TO Кассир_филиала
GRANT EXECUTE ON Популярные_товары TO Кассир_филиала
GO
-- Менеджер
EXEC sp_addrole 'Менеджер'
GO
GRANT SELECT,UPDATE,DELETE,INSERT ON [Типы фотографий] TO Менеджер
GRANT SELECT,UPDATE,DELETE,INSERT ON [Тип Бумаги] TO Менеджер
GRANT SELECT,UPDATE,DELETE,INSERT ON [Формат Бумаги] TO Менеджер
GRANT SELECT,UPDATE,DELETE,INSERT ON [Типы Клиентов] TO Менеджер
GRANT SELECT,UPDATE,DELETE,INSERT ON [Дисконтные карты] TO Менеджер
GRANT SELECT,UPDATE,DELETE,INSERT ON Клиенты TO Менеджер
GRANT SELECT,UPDATE,DELETE,INSERT ON Филиалы TO Менеджер
GRANT SELECT ON Сотрудники TO Менеджер
GRANT SELECT ON Должности TO Менеджер
GRANT SELECT,UPDATE,DELETE,INSERT ON Товары TO Менеджер
GRANT SELECT,UPDATE,DELETE,INSERT ON Поставщики TO Менеджер
GRANT SELECT,UPDATE,DELETE,INSERT ON Категории TO Менеджер
GRANT SELECT,UPDATE,DELETE,INSERT ON [Типы услуг] TO Менеджер
GRANT SELECT,INSERT ON Владельцы_дисконтных_карт TO Менеджер
GRANT SELECT ON СписокКлиентовПолный TO Менеджер
GRANT SELECT ON Список_всех_филиалов TO Менеджер
GRANT SELECT ON Список_киосков_по_филиалам TO Менеджер
GRANT SELECT ON Список_филиалов TO Менеджер
GRANT SELECT ON Список_киосков TO Менеджер
GRANT SELECT ON Поставщики_по_категориям TO Менеджер
GRANT SELECT ON Поставщики_по_товарам TO Менеджер
GRANT EXECUTE ON RoleUser TO Менеджер
GRANT EXECUTE ON Киоски_по_филиалу TO Менеджер
GRANT EXECUTE ON Филиал_по_киоску TO Менеджер
GRANT EXECUTE ON Список_клиентов_по_филиалам TO Менеджер
GRANT EXECUTE ON Клиенты_сделавшие_заказы_больше_чем TO Менеджер
GO
-- Отдел_кадров
EXEC sp_addrole 'Отдел_кадров'
GO
GRANT SELECT,UPDATE,DELETE,INSERT ON Должности TO Отдел_кадров
GRANT SELECT,UPDATE,DELETE,INSERT ON Сотрудники TO Отдел_кадров
GRANT SELECT ON Филиалы TO Отдел_кадров
GRANT EXECUTE ON СписокРаботников TO Отдел_кадров
GRANT EXECUTE ON RoleUser TO Отдел_кадров
GO
-- Створення логінов
IF EXISTS(SELECT * FROM sys.syslogins WHERE name = N'admin1') DROP LOGIN admin1
IF EXISTS(SELECT * FROM sys.syslogins WHERE name = N'kcashier1') DROP LOGIN kcashier1
IF EXISTS(SELECT * FROM sys.syslogins WHERE name = N'fcashier1') DROP LOGIN fcashier1
IF EXISTS(SELECT * FROM sys.syslogins WHERE name = N'manag') DROP LOGIN manag
IF EXISTS(SELECT * FROM sys.syslogins WHERE name = N'OK') DROP LOGIN OK
GO
EXEC sp_addlogin 'admin1','pass@word1','PhotoCenterDB'
EXEC sp_addlogin 'kcashier1','pass@word1','PhotoCenterDB'
EXEC sp_addlogin 'fcashier1','pass@word1','PhotoCenterDB'
EXEC sp_addlogin 'manag','pass@word1','PhotoCenterDB'
EXEC sp_addlogin 'OK','pass@word1','PhotoCenterDB'
GO
-- Створення користувачів
EXEC sp_adduser 'admin1',NULL,db_owner
EXEC sp_adduser 'kcashier1',NULL,Кассир_киоска
EXEC sp_adduser 'fcashier1',NULL,Кассир_филиала
EXEC sp_adduser 'manag',NULL,Менеджер
EXEC sp_adduser 'OK',NULL,Отдел_кадров
GO
2.4 Опис Windows інтерфейсу
Після запуску виконуваного файлу “PhotoCenter.exe”, програма перевіряє налаштування, які зберігаються у файлі “PhotoCenter.exe.Config”. Якщо клієнт не може з'єднатися з сервером, то буде виведено повідомлення користувачу (Рисунок 2) о неможливості з'єднання.
Рисунок 2
Якщо користувач вирішить зробити нове з'єднання то буде виведено вікно для налаштування нового з'єднання (Рисунок 3). Це вікно дозволяє вибрати сервер, та аутентифікацію. Якщо з'єднання буде успішне, то нові налаштування будуть збережені у файлі “PhotoCenter.exe.Config” і при наступному запуску програми користувачу не потрібно буде вводити ці налаштування.
Головне вікно програми зображене на рисунку 4. При запуску клієнта чи зміні налаштувань визначається роль користувача. Наприклад на рисунку 4 зображено інтерфейс доступний адміністратору, а на рисунку 5 інтерфейс користувача, який зайшов під роллю відділу кадрів, і він не має тих можливостей, що має адміністратор.
Рисунок 3
Інтерфейс програми розділено на 6 вкладок: “Закази” (Рисунок 4), ”Продажі” (Рисунок 6), ”Послуги”(Рисунок 7), “Клієнти”, ”Працівники” (Рисунок 5), ”Управління” (Рисунок 8). На приклад, через вкладку “Закази” відбувається робота з заказами, тобто додавання заказу, його редагування та видалення. Також у цій вкладці розміщені запити, котрі дозволяють виводити список заказів, суму виторгу, кількість роздрукованих фотографій та кількість проявлених плівок.
Рисунок 4
Рисунок 5
Рисунок 6
Рисунок 7
Рисунок 8
Розглянемо на приклад додавання нового заказу. Це відбувається натисканням кнопки «Добавити», після чого виводиться вікно (Рисунок 9) в якому треба вибрати клієнта, вибрати терміновість, ввести код плівки і те що з нею треба зробити, тобто друк, проявлення, або і те і інше. У разі друку треба вибрати кількість кадрів та папір.
Рисунок 9
Якщо потрібне буде ввести нового клієнта то потрібно натиснути кнопку «Новий», після чого з'явиться вікно (Рисунок 10), де потрібно ввести прізвище, ім'я, по батькові та тип клієнта.
Рисунок 10
Розглянемо код, який виконується при додаванні нового заказу. Через те що додавання заказу відбувається у таблиці «Закази», «Опис заказу», «Плівка» та «Кадри» треба використовувати транзакції, тобто якщо у процесі вставки даних у якусь з цих таблиць виникне помилка, то транзакція буде відкинута і данні не вставляться у всі таблиці, таким чином не порушується цілісність бази даних.
string sqlInsert = "INSERT Заказы (IDФилиала,Срочный,IDКлиента,IDСотрудника)" +
"VALUES (@IDФилиала,@Срочный,@IDКлиента,@IDСотрудника); SET @IDЗаказа =SCOPE_IDENTITY()";
string sqlInsertПленка = "INSERT Плёнка (IDПлёнки) VALUES (@IDПлёнки)";
string sqlInsertОписаниеЗаказа = "INSERT [Описание заказа]" +
(IDЗаказа,Проявка,Печать,IDПлёнки) VALUES (@IDЗаказа,@Проявка,@Печать,@IDПлёнки)";
string sqlInsertКадры = @"INSERT Кадры (IDПленки,НомерКадра,Количество,IDТипаФото) " + "VALUES "(@IDПленки,@НомерКадра,@Количество,@IDТипаФото)";
SqlConnection conn = new SqlConnection(conString);
conn.Open();
SqlTransaction tran = conn.BeginTransaction();
SqlCommand cmd = new SqlCommand(sqlInsert, conn, tran);
cmd.Parameters.Add(new SqlParameter("@IDФилиала", SqlDbType.TinyInt));
cmd.Parameters.Add(new SqlParameter("@Срочный", SqlDbType.Bit));
cmd.Parameters.Add(new SqlParameter("@IDКлиента", SqlDbType.BigInt));
cmd.Parameters.Add(new SqlParameter("@IDСотрудника", SqlDbType.SmallInt));
SqlParameter param = new SqlParameter("@IDЗаказа", SqlDbType.Int);
param.Direction = ParameterDirection.Output;
cmd.Parameters.Add(param);
SqlCommand cmdInsПленка = new SqlCommand(sqlInsertПленка, conn, tran);
cmdInsПленка.Parameters.Add(new SqlParameter("@IDПлёнки", SqlDbType.Int));
SqlCommand cmdInsОписание = new SqlCommand(sqlInsertОписаниеЗаказа,conn,tran);
cmdInsОписание.Parameters.Add(new SqlParameter("@IDЗаказа",SqlDbType.Int));
cmdInsОписание.Parameters.Add(new SqlParameter("@Проявка",SqlDbType.Bit));
cmdInsОписание.Parameters.Add(new SqlParameter("@Печать",SqlDbType.Bit));
cmdInsОписание.Parameters.Add(new SqlParameter("@IDПлёнки",SqlDbType.Int));
SqlCommand cmdInsКадры = new SqlCommand(sqlInsertКадры, conn, tran);
cmdInsКадры.Parameters.Add(new SqlParameter("@IDПленки",SqlDbType.Int));
cmdInsКадры.Parameters.Add(new SqlParameter("@НомерКадра", SqlDbType.TinyInt));
cmdInsКадры.Parameters.Add(new SqlParameter("@Количество",SqlDbType.TinyInt));
cmdInsКадры.Parameters.Add(new SqlParameter("@IDТипаФото",SqlDbType.SmallInt));
try
{
// Вставляем заказ
cmd.Parameters["@IDФилиала"].Value = IDФилиала;
cmd.Parameters["@IDСотрудника"].Value = IDСотрудника;
cmd.Parameters["@IDКлиента"].Value = (long)(comboBoxClient.SelectedValue);
cmd.Parameters["@Срочный"].Value = checkBoxUrgent.Checked;
cmd.ExecuteNonQuery();
int IDЗаказа = (int)param.Value;
// Вставляем плёнку
cmdInsПленка.Parameters["@IDПлёнки"].Value = integerInputIDFilm.Value;
cmdInsПленка.ExecuteNonQuery();
// Вставляем описание заказа
cmdInsОписание.Parameters["@IDЗаказа"].Value = IDЗаказа;
cmdInsОписание.Parameters["@Проявка"].Value = checkBoxProyavka.Checked;
cmdInsОписание.Parameters["@Печать"].Value = checkBoxPrint.Checked;
cmdInsОписание.Parameters["@IDПлёнки"].Value = integerInputIDFilm.Value;
cmdInsОписание.ExecuteNonQuery();
// Вставляем кадры
if (checkBoxPrint.Checked)
{
foreach (Cadr cadr in cadrs)
{
cmdInsКадры.Parameters["@IDПленки"].Value = integerInputIDFilm.Value;
cmdInsКадры.Parameters["@НомерКадра"].Value = cadr.Number;
cmdInsКадры.Parameters["@Количество"].Value = cadr.Count;
cmdInsКадры.Parameters["@IDТипаФото"].Value = cadr.Type;
cmdInsКадры.ExecuteNonQuery();
}
}
tran.Commit();
MessageBox.Show("Заказ добавлен", "Добавление заказа", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (SqlException ex)
{
tran.Rollback();
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
conn.Close();
}
2.5 Опис Web-інтерфейсу
Web-інтерфейс являє собою сайт, який дозволяє переглядати таблиці бази даних та виконувати запити. Сайт має три сторінки: сторінка для входу, сторінка для роботи з таблицями та сторінка для роботи з запитами. Сторінки з таблицями та запитами не доступні для неавторизованих користувачів. Для того щоб авторизуватись треба на головній сторінці (Рисунок 8) ввести ім'я користувача та пароль. Після цього відкривається сторінка «Таблиці» (Рисунок 9). Вибрати таблицю можна у випадаючому списку.
Для роботи з запитами треба перейти на сторінку «Запити» (Рисунок 10), вибрати необхідний запит та ввести параметри.
Рисунок 8
Рисунок 9
Рисунок 10
Література
1. Microsoft SQL Server 2005. Библия пользователя: Пер. с англ. М.: ООО «И.Д.Вильямс», 2008.
2. Дж. Грофф, П. Вайнберг SQL: Полное руководство: Пер. с англ. 2-е изд., перераб. И доп. К.: Издательская группа BHV, 2001.
3. Б. Гамильтон ADO.NET Сборник рецептов. Для профессионалов. СПб.: Питер, 2005.
4. Сеппа Д. Программирование на Microsoft ADO.NET 2.0 Мастер-класс. / Пер. с англ. М.: Издательство «Русская редакция», 2005.
Размещено на Allbest.ru
Подобные документы
Поняття бази даних та основне призначення системи управління. Access як справжня реляційна модель баз даних. Можливості DDE і OLE. Модулі: Visual Basic for Applications програмування баз даних. Система управління базами даних Microsoft SQL Server 2000.
реферат [41,2 K], добавлен 17.04.2010Узагальнена структурна схема інформаційної системи та алгоритми її роботи. Проект бази даних. Інфологічне проектування і дослідження предметної області. Розробка інфологічної моделі предметної області. Розробка композиційної, логічної системи бази даних.
курсовая работа [861,7 K], добавлен 21.02.2010Виявлення основних сутностей предметної області. Побудова схеми реляційної бази даних. Вбудовані процедури і тригери. Опис архітектури програмної системи і концептуальної моделі бази даних, програмної реалізації та інтерфейсу користувача додатку.
курсовая работа [4,3 M], добавлен 05.12.2012Основні відомості про реляційні бази даних, система управління ними. Основні директиви для роботи в середовищі MySQ. Визначення та опис предметної області. Створення таблиць та запитів бази даних автоматизованої бази даних реєстратури в поліклініці.
курсовая работа [2,9 M], добавлен 06.11.2011Концептуальна модель бази даних, визначення зв’язків між ними, атрибутів сутностей їх доменів. Створення ORM source model та Database model diagram для бази даних "Автотранспортне підприємство". Генерування ddl-скрипта для роботи в СУБД SQL-Server.
курсовая работа [47,3 K], добавлен 17.10.2013Області застосування і реалізації інформаційних систем, вимоги до них. Призначення та класифікація систем управління базами даних. Основні достоїнства мови SQL. Програмний код додатку. Створення база даних "Мебельний магазин". Лістинг даної програми.
курсовая работа [747,0 K], добавлен 19.04.2015Системний аналіз бази даних за вхідною та вихідною документацією, визначення сутностей, атрибутів, зв’язків. Створення логічної моделі бази даних із застосуванням нормалізації, алгоритм її роботи. Розробка програмного забезпечення та інтерфейсу СУБД.
курсовая работа [946,8 K], добавлен 02.07.2015Особливості побудови та роботи з об’єктно-реляційною моделлю даних в інструментальній системі управління базами даних PostgreSQL. Розробка бази даних факультету, що має у підпорядкуванні кілька кафедр. Тестування роботи спроектованої бази даних.
курсовая работа [1,8 M], добавлен 09.05.2014Проектування бази даних предметної області "Магазин будівельних матеріалів". Аналіз сукупності вхідних і вихідних даних, шляхи удосконалення інформаційної системи обліку товару. Організація інформаційної бази, розробка логічної і фізичної моделі.
курсовая работа [559,2 K], добавлен 09.05.2016Фактори, що гальмують або обумовлюють впровадження інформаційних систем у навчально-виховний процес. Використання можливостей табличного процесору в процесі аналізу даних предметної області інформаційної системи "Видатні особистості Харківщини".
курсовая работа [14,0 M], добавлен 19.10.2014