Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВОЛОШИН_КП_СУБД(1).docx
Скачиваний:
3
Добавлен:
22.09.2019
Размер:
5.63 Mб
Скачать

Приложение 9 – процедуры удаления

CREATEPROCPHydrantDelete

@IDWSINT

AS

DELETE FROM Hydrant

WHERE IDWaterSource=@IDWS

CREATE PROC PPondDelete

@IDWS INT

AS

DELETE FROM Pond

WHERE IDWaterSource=@IDWS

CREATE PROC PStreetDelete

@IDStr INT

AS

DELETE FROM Street

WHERE IDStreet=@IDStr

CREATE PROC PToOrganozationDelete

@IDTypeOfOrganization INT

AS

DELETE FROM TypeOfOrganization

WHERE IDTypeOfOrganization=@IDTypeOfOrganization

CREATE PROC POrganizationDelete

@IDOrg INT

AS

DELETE FROM Organization

WHERE IDOrganization=@IDOrg

CREATE PROC PWaterSourceDelete

@IDWS INT

AS

DELETE FROM WaterSource

WHERE IDWaterSource=@IDWS

CREATE PROC PInspectionDelete

@IDIn INT

AS

DELETE FROM Inspection

WHERE IDInspection=@IDIn

CREATE PROC PDefectDelete

@IDDef INT

AS

DELETE FROM Defect

WHERE IDDefect=@IDDef

CREATE PROC PLetterDelete

@IDLet INT

AS

DELETE FROM Letter

WHERE IDLetter=@IDLet

CREATE PROC PTestDefectDelete

@IDDefect INT,

@IDInspection INT,

@IDLetter INT

AS

DELETE FROM TestDefect

WHERE (IDDefect=@IDDefect AND IDInspection=@IDInspection AND IDLetter=@IDLetter)

Приложение 10 – триггеры

CREATE TRIGGER TrDefect

ON Defect FOR UPDATE

AS

IF EXISTS

(SELECT 'TRUE'

FROM inserted i LEFT JOIN TestDefect T

ON i.IDDefect=T.IDDefect

LEFT JOIN Inspection Ins

ON T.IDInspection=Ins.IDInspection

LEFT JOIN Letter L

ON Ins.IDInspection=L.IDInspection

WHERE (L.IDLetter IS NOT NULL))

BEGIN

RAISERROR ('Нельзя изменять данные о неисправности!Отправлено письмо!',1,1)

ROLLBACK TRAN

END

CREATE TRIGGER TrLetter

ON Letter

FOR INSERT,UPDATE

AS

IF EXISTS

(SELECT 'TRUE'

FROM Letter L LEFT JOIN Inspection I

ON L.IDInspection=I.IDInspection

WHERE (L.DataSend<I.DateInspection))

BEGIN

RAISERROR ('Дата отправки должна быть не раньше даты проверки!',1,1)

ROLLBACK TRAN

END

CREATE TRIGGER TrLetter2

ON Letter

FOR INSERT,UPDATE

AS

IF EXISTS

(SELECT 'TRUE'

FROM Letter L LEFT JOIN Inspection I

ON L.IDInspection=I.IDInspection

LEFT JOIN TestDefect T

ON I.IDInspection=T.IDInspection

LEFT JOIN Defect D

ON T.IDDefect=D.IDDefect

WHERE (L.DateNextInspection<DATEADD(dd,D.RepairTime,I.DateInspection)))

BEGIN

RAISERROR ('Дата следующей проерки должна быть больше, чем даты проверки и время, отведенное на ремонт!',1,1)

ROLLBACK TRAN

END

Приложение 11 – отчетные формы

CREATE FUNCTION PlanProverki (@DAT DATE)

RETURNS @Result TABLE (

NameWaterSource VARCHAR (10),

NameStreet VARCHAR(40),

Building VARCHAR(10),

NameDefect VARCHAR(100),

RepairTime INT,

DateInspection DATE)

AS

BEGIN

declare @IDDP TABLE (

IDWaterSource INT,

DateP DATE)

INSERT INTO @IDDP

SELECT

WS.IDWaterSource,

MAX(DateInspection) [DP]

FROM WaterSource WS INNER JOIN Street S

ON WS.IDStreet=S.IDStreet

INNER JOIN Inspection I

ON WS.IDWaterSource=I.IDWaterSource

INNER JOIN TestDefect TD

ON TD.IDInspection=I.IDInspection

INNER JOIN Defect D

ON D.IDDefect=TD.IDDefect

GROUP BY

WS.IDWaterSource

INSERT INTO @Result

SELECT

WS.NameWaterSource [Название],

S.NameStreet [Улица],

WS.Building [Дом],

D.NameDefect [Неисправность],

D.RepairTime [Время на устранение],

I.DateInspection [Датапроверки]

FROM WaterSource WS INNER JOIN Street S

ON WS.IDStreet=S.IDStreet

INNER JOIN Inspection I

ON WS.IDWaterSource=I.IDWaterSource

INNER JOIN TestDefect TD

ON TD.IDInspection=I.IDInspection

INNER JOIN Defect D

ON D.IDDefect=TD.IDDefect

INNER JOIN @IDDP IDDP

ON IDDP.IDWaterSource=WS.IDWaterSource

WHERE ((IDDP.DateP=I.DateInspection) AND (D.NameDefect='исправен') AND (DATEADD(dd,30,IDDP.DateP)<=@DAT))

INSERT INTO @Result

SELECT

WS.NameWaterSource [Название],

S.NameStreet [Улица],

WS.Building [Дом],

D.NameDefect [Неисправность],

D.RepairTime [Время на устранение],

I.DateInspection [Датапроверки]

FROM WaterSource WS INNER JOIN Street S

ON WS.IDStreet=S.IDStreet

INNER JOIN Inspection I

ON WS.IDWaterSource=I.IDWaterSource

INNER JOIN TestDefect TD

ON TD.IDInspection=I.IDInspection

INNER JOIN Defect D

ON D.IDDefect=TD.IDDefect

INNER JOIN @IDDP IDDP

ON IDDP.IDWaterSource=WS.IDWaterSource

INNER JOIN Letter L

ON L.IDLetter=TD.IDLetter

WHERE ((IDDP.DateP=I.DateInspection) AND (D.NameDefect!='исправен') AND (L.DateNextInspection<=@DAT))

RETURN;

END

CREATE PROC PPlanProverki(@Dat DATE)

AS

SELECT

NameWaterSource [Название],

NameStreet [Улица],

Building [Дом],

NameDefect [Неисправность],

RepairTime [Время на устранение],

DateInspection [Дата предыдущей проверки]

FROM PlanProverki(@Dat)

EXEC PPlanProverki '21-01-2012'

CREATE FUNCTION LetterToOrganization (@WS INT)

RETURNS

@Result TABLE (

NameWaterSource VARCHAR (10),

NameStreet VARCHAR(40),

Building VARCHAR(10),

NameDefect VARCHAR(100),

RepairTime INT,

DateInspection DATE)

AS

BEGIN

declare @temp1 TABLE (

IDD INT IDENTITY,

IDWaterSource INT,

DateP DATE,

IDDef INT,

Def VARCHAR(100))

INSERT INTO @temp1

SELECT

WS.IDWaterSource,

I.DateInspection,

D.IDDefect,

D.NameDefect

FROM WaterSource WS INNER JOIN Street S

ON WS.IDStreet=S.IDStreet

INNER JOIN Inspection I

ON WS.IDWaterSource=I.IDWaterSource

INNER JOIN TestDefect TD

ON TD.IDInspection=I.IDInspection

INNER JOIN Defect D

ON D.IDDefect=TD.IDDefect

WHERE WS.IDWaterSource=@WS

declare @temp2 TABLE (

IDD INT,

IDWaterSource INT,

DateP DATE,

IDDef INT,

Def VARCHAR(100))

INSERT INTO @temp2

SELECT top 2 *

FROM @temp1

order by IDD desc

IF ((SELECT DISTINCT COUNT (Def) FROM @temp2 WHERE Def!='исправен')=1)

BEGIN

INSERT INTO @Result

SELECT

WS.NameWaterSource [Название],

S.NameStreet [Улица],

WS.Building [Дом],

D.NameDefect [Неисправность],

D.RepairTime [Время на устранение],

I.DateInspection [Датапроверки]

FROM WaterSource WS INNER JOIN Street S

ON WS.IDStreet=S.IDStreet

INNER JOIN Inspection I

ON WS.IDWaterSource=I.IDWaterSource

INNER JOIN TestDefect TD

ON TD.IDInspection=I.IDInspection

INNER JOIN Defect D

ON D.IDDefect=TD.IDDefect

INNER JOIN @temp2 t2

ON t2.IDDef=D.IDDefect

WHERE D.IDDefect=(SELECT MAX(IDDef) FROM @temp2)

END;

RETURN;

END

CREATE PROC PLetterToOrganization(@WS INT)

AS

SELECT

NameWaterSource [Название],

NameStreet [Улица],

Building [Дом],

NameDefect [Неисправность],

RepairTime [Время на устранение],

DateInspection [Датапроверки]

FROM LetterToOrganization(@WS)

EXEC PLetterToOrganization 1

CREATE FUNCTION LetterToGPN (@WS INT)

RETURNS

@Result TABLE (

NameWaterSource VARCHAR (10),

NameStreet VARCHAR(40),

Building VARCHAR(10),

NameOrg VARCHAR(50))

AS

BEGIN

declare @temp1 TABLE (

IDD INT IDENTITY,

IDWaterSource INT,

DateP DATE,

IDDef INT,

Def VARCHAR(100))

INSERT INTO @temp1

SELECT

WS.IDWaterSource,

I.DateInspection,

D.IDDefect,

D.NameDefect

FROM WaterSource WS INNER JOIN Street S

ON WS.IDStreet=S.IDStreet

INNER JOIN Inspection I

ON WS.IDWaterSource=I.IDWaterSource

INNER JOIN TestDefect TD

ON TD.IDInspection=I.IDInspection

INNER JOIN Defect D

ON D.IDDefect=TD.IDDefect

WHERE WS.IDWaterSource=@WS

declare @temp2 TABLE (

IDD INT,

IDWaterSource INT,

DateP DATE,

IDDef INT,

Def VARCHAR(100))

INSERT INTO @temp2

SELECT top 2 *

FROM @temp1

order by IDD desc

IF ((SELECT DISTINCT COUNT (Def) FROM @temp2 WHERE Def!='исправен')>1)

BEGIN

INSERT INTO @Result

SELECT

WS.NameWaterSource [Название],

S.NameStreet [Улица],

WS.Building [Дом],

O.NameOrganization [Названиеорганизации]

FROM WaterSource WS INNER JOIN Street S

ON WS.IDStreet=S.IDStreet

INNER JOIN Inspection I

ON WS.IDWaterSource=I.IDWaterSource

INNER JOIN TestDefect TD

ON TD.IDInspection=I.IDInspection

INNER JOIN Defect D

ON D.IDDefect=TD.IDDefect

INNER JOIN @temp2 t2

ON t2.IDDef=D.IDDefect

INNER JOIN Organization O

ON WS.IDOrganization=O.IDOrganization

WHERE D.IDDefect=(SELECT MAX(IDDef) FROM @temp2)

END;

RETURN;

END

CREATE PROC PLetterToGosPN(@WS INT)

AS

SELECT

NameWaterSource [Название],

NameStreet [Улица],

Building [Дом],

NameOrg [Название организации]

FROM LetterToGPN(@WS)

CREATE PROC PWSFind(@NStreet VARCHAR(40), @Build VARCHAR(10))

AS

SELECT

WS.IDWaterSource [ID],

NameWaterSource [Название],

NameStreet [Улица],

Building [Дом],

NameOrganization [Организация],

NameDefect [Неисправность],

DateInspection [Датапроверки]

FROM WaterSource WS INNER JOIN Hydrant H

ON WS.IDWaterSource=H.IDWaterSource

INNER JOIN Street S

ON WS.IDStreet=S.IDStreet

INNER JOIN Organization O

ON WS.IDOrganization=O.IDOrganization

INNER JOIN Inspection I

ON WS.IDWaterSource=I.IDWaterSource

INNER JOIN TestDefect TD

ON I.IDInspection=TD.IDInspection

INNER JOIN Defect D

ON D.IDDefect=TD.IDDefect

WHERE NameStreet LIKE @NStreet AND Building=@Build

EXEC PWSFind 'Стахановская','40'