Тема курсового .
"магазин с одним продавцом . Компьютер вместо кассового аппарата . База наличия товаров ; наименование , единица измерения , цена еденицы , количевство , дата последнего завоза . Регистрация поступления товара ( как старых , так и новых наименований ). Оформление покупки : выписка чека , корректировка база . Проблема уценки и списания . И инвентаризация остататков товара с вычислением суммарной стоимости . "
В общем прошу помочь , опыт работы с SQL 2 ночи , профиль учебы тоже очень долек , но увы дали курсовой на бд . Я начитавшись сылок в гугле и покурив сайт майков + форум .
="Код бд на T-SQL ,делал в ssms2012"
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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
--create database magazin.net
use [magazin.net]
go
create table [customers]
(
[ID] INT NOT NULL IDENTITY ,
[FName] nvarchar(20) null,
[MName] nvarchar(20) null,
[LName] nvarchar(20) null,
[address] nvarchar(50) null,
[Citu] nvarchar(20) null,
[Phone] nvarchar(12) null,
[DateInSystem] date DEFAULT GETDATE()
)
create table [products]
(
[ID] INT NOT NULL IDENTITY ,
[Name] nvarchar(50) not null ,
)
create table [products_details]
(
[ID] INT NOT NULL,
[tupe] varchar(20) ,
[Naimenovanie] varchar(100) not null,
[description] varchar(500) not null,
[data_zavoza] date not null
)
create table [stock]
(
[ProductID] INT NOT NULL,
[Qtu] int DEFAULT 0 ,
[Name_Edinitsy] varchar(30) not null,
[prise] money NOT NULL ,
[total_prise] AS CONVERT ( money, Qtu*prise)
)
create table [order]
(
[ID] INT NOT NULL IDENTITY ,
[customersID] INT NULL ,
[OrderDate] date DEFAULT GETDATE()
)
create table [order_details]
(
[orderID] INT NOT NULL ,
[line_item] INT NOT NULL ,
[ProductID] INT NULL ,
[Qtu] int NOT NULL,
[prise] money NOT NULL ,
[total_prise] AS CONVERT ( money, Qtu*prise)
)
--КЛЮЧИ
ALTER TABLE [dbo].[customers]
ADD
PRIMARY KEY (ID)
go
ALTER TABLE [dbo].[products]
ADD
PRIMARY KEY (ID)
go
ALTER TABLE [dbo].[products_details]
ADD
UNIQUE(ID)
go
ALTER TABLE [dbo].[products_details]
ADD
FOREIGN KEY (ID) REFERENCES [dbo].[products](ID)
ON DELETE CASCADE
go
ALTER TABLE [dbo].[stock]
ADD
UNIQUE([ProductID])
go
ALTER TABLE [dbo].[stock]
ADD
FOREIGN KEY ([ProductID]) REFERENCES [dbo].[products](ID)
ON DELETE CASCADE
go
ALTER TABLE [dbo].[order]
ADD
PRIMARY KEY (ID)
go
ALTER TABLE [dbo].[order]
ADD
FOREIGN KEY ([customersID]) REFERENCES [dbo].[customers](ID)
ON DELETE SET NULL
go
ALTER TABLE [dbo].[order_details]
ADD
PRIMARY KEY ([orderID],[line_item])
go
ALTER TABLE [dbo].[order_details]
ADD
FOREIGN KEY ([orderID]) REFERENCES [dbo].[order](ID)
--НЕТ УДАЛЕНИЯ ЗКАЗА
go
ALTER TABLE [dbo].[order_details]
ADD
FOREIGN KEY ([ProductID]) REFERENCES [dbo].[products](ID)
ON DELETE SET NULL
go
--ПОЛЬЗОВАТЕЛЬСКИЕ ОГРАНИЧЕНИЯ
ALTER TABLE [dbo].[customers]
ADD
CHECK ([Phone] LIKE '([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])')
GO
ALTER TABLE [dbo].[order]
ADD
CHECK ([OrderDate] >= DATEADD(DAY ,- 900, GETDATE()) AND [OrderDate] <= GETDATE())
GO
ALTER TABLE [dbo].[stock]
ADD
CHECK ([Name_Edinitsy] IN ('л','м','кг','шт','ед'))
GO
ALTER TABLE [dbo].[customers]
ADD
CHECK ([DateInSystem] >= DATEADD(DAY ,- 900, GETDATE()) AND [DateInSystem] <= GETDATE())
GO
ALTER TABLE [dbo].[stock]
ADD
CHECK ([Qtu] >=0 )
GO
--ТРИГГЕРЫ
CREATE TRIGGER уменьшение_склада_при_заказе
ON [dbo].[order_details]
FOR INSERT
AS
IF @@ROWCOUNT = 0
RETURN
SET NOCOUNT ON
UPDATE [dbo].[stock]
SET Qtu = s.Qtu - i.Qtu
FROM [dbo].[stock] s JOIN
(SELECT [ProductID], SUM (Qtu) Qtu FROM inserted GROUP BY [ProductID] ) i
ON s.[ProductID] = i.[ProductID]
go
CREATE TRIGGER увеличение_склада_при_заказе
ON [dbo].[order_details]
FOR DELETE
AS
IF @@ROWCOUNT = 0
RETURN
SET NOCOUNT ON
UPDATE [dbo].[stock]
SET Qtu = s.Qtu + d.Qtu
FROM [dbo].[stock] s JOIN
(SELECT [ProductID], SUM (Qtu) Qtu FROM deleted GROUP BY [ProductID] ) d
ON s.[ProductID] = d.[ProductID]
go
CREATE TRIGGER изменение_заказа_и_склада
ON [dbo].[order_details]
FOR UPDATE
AS
IF @@ROWCOUNT = 0
RETURN
IF NOT UPDATE (Qtu)
RETURN
SET NOCOUNT ON
UPDATE [dbo].[stock]
SET Qtu = s.Qtu - (i.Qtu - d.Qtu)
FROM [dbo].[stock] s JOIN
(SELECT [ProductID], SUM (Qtu) Qtu FROM deleted GROUP BY [ProductID] ) d
ON s.[ProductID] = d.[ProductID]
JOIN
(SELECT [ProductID], SUM (Qtu) Qtu FROM inserted GROUP BY [ProductID] ) i
ON s.[ProductID] = i.[ProductID]
go
CREATE TRIGGER вз_удал_тавара_при_ост0_и_нет_в_заказах
ON [dbo].[products]
INSTEAD OF DELETE
AS
IF @@ROWCOUNT = 0
RETURN
SET NOCOUNT ON
IF EXISTS (SELECT 1 FROM [dbo].[order_details] od
JOIN deleted d
ON od.ProductID = d.ID)
RAISERROR ('Тавар не может быть удален т.к состоит в заказах', 10,1)
ELSE IF EXISTS (SELECT 1 FROM [dbo].[stock] s
JOIN deleted d
ON s.ProductID = d.ID
WHERE s.Qtu <> 0 )
RAISERROR ('Тавар не может быть удален т.к есть остаток на складе ', 10,2)
ELSE
DELETE [dbo].[products] WHERE ID IN (SELECT ID FROM deleted)
go
Прошу помочь . Прошу проявить терпение , вопросы наверное нубские .
1)Насколько соответствует заданию ?
2)Правильно реализована ?
3)Есть-ли критические ошибки ?
4)Насколько работоспособна ?(требуется всего ничего главное чтоб хоть 1 транзакцию/операцию совершила , увы таковы реалии )
5)Есть ли возможность упростить ?
6)Как реализовать чек , уценку и списание . Или это уже в раздел С#/VB ?
7)Триггеры корректны ?
Если есть какую полезную ссылку/материал/методичку (преподаватель отправил в пешее , дал только задание ).
Заранее спасибо !