4and5.2
ALTER TABLE Shipment
ADD CONSTRAINT
Ship_Fkey_SID FOREIGN KEY(SID) REFERENCES Supplier(SID) ON UPDATE CASCADE ON
DELETE CASCADE
ALTER TABLE Shipment
ADD CONSTRAINT
Ship_Fkey_JID FOREIGN KEY(JID) REFERENCES Project(JID) ON UPDATE CASCADE ON
DELETE CASCADE
ALTER TABLE Shipment
ADD CONSTRAINT
Ship_Fkey_PID FOREIGN KEY(PID) REFERENCES PART(PID) ON UPDATE CASCADE ON DELETE
CASCADE
4and5.3
CREATE FUNCTION
ColorPartsInProject (@proj nvarchar(25), @color nvarchar(255)) RETURNS int
AS
BEGIN
DECLARE @count int
IF @proj IS NULL OR @color IS NULL
RETURN -1
-- verify that the SHIPMENT table exists to run our query
IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE
TABLE_NAME='Shipment')
RETURN -2
-- verify that the project exists in SHIPMENT table
IF NOT EXISTS(SELECT * FROM Shipment WHERE JID = @proj)
RETURN -3
-- see if there are any parts of that color for that project
in the shipment table
IF (SELECT COUNT(Shipment.PID) FROM SHIPMENT,PART WHERE
Shipment.PID = Part.PID AND Shipment.JID=@proj AND Part.Color=@color) = 0
RETURN 0
RETURN (SELECT SUM(Qty) FROM SHIPMENT WHERE JID=@proj AND PID IN (SELECT PID FROM PART
WHERE Color=@color))
END
4and5.4
CREATE PROCEDURE
Supplier_Shipment_Report @supplier nvarchar(25), @status int OUTPUT
AS
BEGIN
-- check for existence for required tables and
-- set error conditions
IF NOT EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'Supplier')
SET @status = -5
ELSE IF NOT EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'Shipment')
SET @status = -4
ELSE IF NOT EXISTS(SELECT TABLE_NAME FROM
INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Part')
SET @status = -3
ELSE IF NOT EXISTS(SELECT TABLE_NAME FROM
INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Project')
SET @status = -2
ELSE IF NOT EXISTS(SELECT * FROM Supplier WHERE SID=@supplier)
SET @status = -1
ELSE
-- the default error condition
SET @status = -6
-- if anything other than default error return
IF @status <> -6
RETURN
CREATE TABLE temp
(
SupplierName nvarchar(25),
ProjectName nvarchar(25),
PartColor nvarchar(25),
SPJPColorQty int,
PJPColorQty int,
JQty int,
SPJPctQty float(2),
SJPctQty float(2)
)
-- all declarations
-- temporaries to hold each value
DECLARE @SupplierName nvarchar(255)
DECLARE @part nvarchar(25), @project nvarchar(25)
DECLARE @ProjectName nvarchar(255)
DECLARE @PartColor nvarchar(255)
DECLARE @SPJPColorQty int, @PJPColorQty int
DECLARE
@JQty int, @SPJPctQty float(2), @SJPctQty float(2)
DECLARE PartsCursor CURSOR FOR
SELECT PID, Color FROM Part
OPEN PartsCursor
-- first get supplier’s name
SELECT @SupplierName = Name FROM Supplier WHERE SID=@supplier
-- outer loop parts table
FETCH NEXT FROM PartsCursor
INTO
@part, @PartColor
WHILE
@@FETCH_STATUS = 0
BEGIN
-- declare a cursor to go through projects
DECLARE ProjectsCursor CURSOR FOR
SELECT JID,Name FROM Project
OPEN ProjectsCursor
-- inner loop projects table
FETCH NEXT FROM ProjectsCursor
INTO @project, @ProjectName
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT
@SPJPColorQty = SUM(Qty) FROM Shipment, Part WHERE Shipment.PID = Part.PID AND Part.Color
= @PartColor AND Shipment.SID = @supplier AND Shipment.JID = @project
SELECT
@PJPColorQty = SUM(Qty) FROM Shipment, Part WHERE Shipment.PID = Part.PID AND
Part.Color = @PartColor AND Shipment.JID = @project
SELECT
@JQty = SUM(Qty) FROM Shipment WHERE Shipment.JID = @project
--
to prevent division by 0
--
convert to NULL
SELECT
@SPJPctQty = CAST(@SPJPColorQty as float)/NULLIF(@PJPColorQty,0.0) * 100.0
SELECT
@SJPctQty = CAST(@SPJPColorQty as float)/NULLIF(@JQty,0.0) * 100.0
--
ok now we have everything
--
insert into table
INSERT
INTO temp VALUES(@SupplierName, @ProjectName, @PartColor, @SPJPColorQty,
@PJPColorQty, @JQty, @SPJPctQty, @SJPctQty)
FETCH
NEXT FROM ProjectsCursor
INTO
@project, @ProjectName
END
-- close projects
CLOSE ProjectsCursor
DEALLOCATE ProjectsCursor
FETCH NEXT FROM PartsCursor
INTO @part, @PartColor
END
--
print the report sorted by ProjectName
--
and PartColor
SELECT
* FROM temp ORDER BY ProjectName, PartColor ASC
--
now drop the temporary table
DROP
TABLE temp
--
deallocate cursors
CLOSE
PartsCursor
DEALLOCATE
PartsCursor
--
set success
SET
@status = 0
END
4and5.5
CREATE
TABLE SHIPPEDPCOLORQTY
(Color
nvarchar(25) PRIMARY KEY,
Qty
int
)
CREATE
TRIGGER Trig_PartsByColor
ON
SHIPMENT
AFTER
INSERT, UPDATE, DELETE
AS
BEGIN
-- we need to have shipment,part to exist
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'Part')
BEGIN
DELETE SHIPPEDPCOLORQTY
INSERT INTO SHIPPEDPCOLORQTY
SELECT Part.Color, Sum(Qty)
FROM Shipment,Part
WHERE Shipment.PID = Part.PID
GROUP BY Shipment.PID
END
END