CREATE TABLE Fornitori (
Codice NUMERIC(3) PRIMARY KEY,
Nome VARCHAR(30) NOT NULL,
Citta VARCHAR(20),
Telefono VARCHAR(18) NOT NULL,
Via VARCHAR(40),
NCivico VARCHAR(5),
CAP CHAR(5),
Fax VARCHAR(18),
Email VARCHAR(30),
Tipo CHAR(6) NOT NULL CHECK (Tipo
LIKE 'ProdNC' OR Tipo LIKE 'Rotoli')
)
CREATE TABLE Clienti (
Codice NUMERIC(3) PRIMARY KEY,
Nome VARCHAR(30) NOT NULL,
Citta VARCHAR(20),
Telefono VARCHAR(18) NOT NULL,
Via VARCHAR(40),
NCivico VARCHAR(5),
CAP CHAR(5),
Fax VARCHAR(18),
Email VARCHAR(30)
)
CREATE TABLE Serbatoio (
)
CREATE TABLE CollSerbatoio (
NGruppo NUMERIC(2) UNIQUE,
Serbatoio CHAR(5) UNIQUE
REFERENCES Serbatoio(
PRIMARY KEY (NGruppo, Serbatoio)
)
CREATE TABLE Conf (
NGruppo CHAR(5) REFERENCES
CollSerbatoio(NGruppo),
ProdMac VARCHAR(40),
PRIMARY KEY (NGruppo, ProdMac)
)
CREATE TABLE Util (
NGruppo CHAR(5) REFERENCES
CollSerbatoio(NGruppo),
RotMac VARCHAR(50),
PRIMARY KEY (NGruppo, RotMac)
)
CREATE TABLE Macchine (
Ngruppo NUMERIC(2) NOT NULL
REFERENCES CollSerbatoio(NGruppo),
Stato VARCHAR(10) NOT NULL CHECK
(Stato LIKE 'Produzione' OR
Stato LIKE 'Riserva' OR
Stato LIKE 'Guasta')
)
CREATE TABLE ProdNCM (
TipoProd VARCHAR(40) PRIMARY KEY,
Quantita NUMERIC(6) NOT NULL CHECK
(Quantita >= 0)
)
CREATE TABLE RotoliM (
TipoRot VARCHAR(50) PRIMARY KEY,
Lunghezza NUMERIC(6) NOT NULL
CHECK (Lunghezza >= 0),
ProdCont VARCHAR(40) NOT NULL
REFERENCES ProdNCM(TipoProd)
)
CREATE TABLE ProdNC (
Codice NUMERIC(8) PRIMARY KEY,
TipoProd VARCHAR(40) NOT NULL
REFERENCES ProdNCM(TipoProd),
Quantita NUMERIC(6) NOT NULL CHECK
(Quantita > 0)
)
CREATE TABLE Rotoli (
Codice NUMERIC(8) PRIMARY KEY,
TipoRot VARCHAR(50) NOT NULL
REFERENCES RotoliM(TipoRot),
Lunghezza NUMERIC(6) NOT NULL
CHECK (Lunghezza > 0)
)
CREATE TABLE Ordine (
Codice NUMERIC(8) PRIMARY KEY,
TipoProd VARCHAR(40) NOT NULL,
DataConsegna DATE NOT NULL,
Quantita NUMERIC(6) NOT NULL CHECK
(Quantita > 0),
TipoRot VARCHAR(50) NOT NULL,
Capacita NUMERIC(6) NOT NULL CHECK
(Capacita > 0),
DataRichiesta DATE NOT NULL,
CodiceCliente NUMERIC(3) NOT NULL
REFERENCES Clienti(Codice)
)
CREATE TABLE ProdConf (
Codice NUMERIC(8) PRIMARY KEY
REFERENCES Ordine(Codice),
LungRotolo NUMERIC(6) NOT NULL
CHECK (LungRotolo > 0),
NomeMacchina CHAR(5) NOT NULL
REFERENCES Macchine(
)
CREATE TABLE ConfProd (
Rotoli VARCHAR(50) REFERENCES
RotoliM(TipoRot),
Macchine CHAR(5) REFERENCES
Macchine(
PRIMARY KEY (Rotoli, Macchine)
)
CREATE TABLE Cont (
Serbatoio CHAR(5) REFERENCES
Serbatoio(
ProdSerb VARCHAR(40),
PRIMARY KEY (Serbatoio, ProdSerb)
)
CREATE TABLE FornitRotoli (
Codice NUMERIC(8) REFERENCES
Rotoli(Codice),
Fornitore NUMERIC(3) REFERENCES
Fornitori(Codice),
Spesa NUMERIC(10) NOT NULL CHECK
(Spesa >= 0),
Data DATE NOT NULL,
PRIMARY KEY (Codice, Fornitore)
)
CREATE TABLE FornitProdNC (
Codice NUMERIC(8) REFERENCES
ProdNC(Codice),
Fornitore NUMERIC(3) REFERENCES
Fornitori(Codice),
Spesa NUMERIC(10) NOT NULL CHECK
(Spesa >= 0),
Data DATE NOT NULL,
PRIMARY KEY (Codice, Fornitore)
)
CREATE TABLE Vendita (
Codice NUMERIC(8) REFERENCES
ProdConf(Codice),
Cliente NUMERIC(3) REFERENCES
Clienti(Codice),
Ricavo NUMERIC(10) NOT NULL CHECK
(Ricavo >= 0),
Data DATE NOT NULL,
PRIMARY KEY (Codice, Cliente)
)
Per rispettare il vincolo RV13, per il quale in ogni gruppo di macchine è presente sempre una ed una sola macchina di riserva, creiamo la seguente vista ed asserzione:
CREATE VIEW NumRiserve(NGruppo, Riserve) AS
SELECT Ngruppo, COUNT(ALL Stato)
FROM Macchine
WHERE Stato LIKE 'Riserva'
GROUP BY Ngruppo
CREATE ASSERTION ControlloMacchineDiRiserva
CHECK ((SELECT COUNT(NGruppo)
FROM NumRiserve) =
(SELECT COUNT(ALL Riserve)
FROM NumRiserve
WHERE Riserve = 1))
Operazione 1
Inserire un nuovo fornitore (in media 1 volta all'anno)
INSERT INTO Fornitori(Codice, Nome,
Citta, Telefono, Via, NCivico, CAP, Fax, Email, Tipo)
VALUES (<codice>, <nome>,
<città>, <telefono>, <via>,
<cap>, <fax>, <email>,
<tipo>)
Operazione 2
Inserire un nuovo cliente (in media 1 volta al mese)
INSERT INTO Clienti(Codice, Nome,
Citta, Telefono, Via, NCivico, CAP, Fax, Email)
VALUES (<codice>, <nome>,
<città>, <telefono>, <via>,
<ncivico>, <cap>, <fax>,
<email>)
Operazione 3
Inserire i dati relativi all'acquisto di un
prodotto non confezionato (in media 4 volte al giorno)
INSERT INTO ProdNC(Codice, TipoProd,
Quantita)
VALUES(<codice>, <tipoprodotto>,
<quantità>)
INSERT INTO FornitProdNC(Codice, Fornitore, Spesa, Data)
VALUES(<codice>, <codicefornitore>,
<spesa>, <data>)
UPDATE ProdNCM
SET Quantita = Quantita + <quantità>
WHERE TipoProd = <tipoprodotto>
Operazione 4
Inserire i dati relativi all'acquisto di rotoli di tetrapak (in media 3
volte a settimana)
INSERT INTO Rotoli(Codice, TipoRot,
Lunghezza)
VALUES(<codice>, <tiporotolo>,
<lunghezza>)
INSERT INTO FornitRotoli(Codice, Fornitore, Spesa, Data)
VALUES(<codice>, <codicefornitore>,
<spesa>, <data>)
UPDATE RotoliM
SET Lunghezza = Lunghezza + <lunghezza>
WHERE TipoRot = <tiporotolo>
Operazione 5
Inserire i dati relativi alla produzione e vendita di un prodotto
confezionato (in media 20 volte al giorno)
INSERT INTO ConfProd(Rotoli, Macchine)
VALUES (<tiporotolo>, <macchinautilizzata>)
INSERT INTO ProdConf(Codice, LungRotolo, NomeMacchina)
VALUES (<codiceordine>, <lunghezzarotolo>,
<macchinautilizzata>)
INSERT INTO Vendita(Codice, Cliente, Ricavo, Data)
VALUES (<codiceordine>, <codicecliente>,
<ricavo>, <data>)
UPDATE ProdNCM
SET Quantita = Quantita - <quantità>
WHERE TipoProd = <tipoprodotto>
UPDATE RotoliM
SET Lunghezza = Lunghezza - <lunghezzarotolo>
WHERE TipoRot = <tiporotolo>
Operazione 6
Inserire i dati relativi alla richiesta di produzione di prodotti
confezionati (in media 20 volte al giorno)
INSERT INTO Ordine(Codice, TipoProd,
DataConsegna, Quantita, TipoRot, Capacita, DataRichiesta, CodiceCliente)
VALUES (<codice>, <tipoprodotto>,
<dataconsegna>, <quantità>, <tiporotolo>, <capacità>,
<datarichiesta>,
<codicecliente>)
Operazione 7
Acquisto di una nuova macchina (in media ogni 3 anni)
INSERT INTO Macchine(Nome, Ngruppo,
Stato)
VALUES (<nomemacchina>, <numerogruppo>,
'Produzione')
Se il gruppo è nuovo, prima di
inserire la macchina:
INSERT INTO CollSerbatoio(NGruppo,
Serbatoio)
VALUES (<numerogruppo>,
<nomeserbatoio>)
Per ogni prodotto confezionabile e
rotolo utilizzabile:
INSERT INTO Conf(NGruppo, ProdMac)
VALUES (<numerogruppo>, <tipoprodotto>)
INSERT INTO Util(NGruppo, RotMac)
VALUES (<numerogruppo>, <tiporotolo>)
Operazione 8
Acquisto di un nuovo serbatoio asettico (in media ogni 5 anni)
INSERT INTO Serbatoio(Nome)
VALUES (<nomeserbatoio>)
Per ogni prodotto contenibile:
INSERT INTO Cont(Serbatoio, ProdSerb)
VALUES (<nomeserbatoio>, <tipoprodotto>)
Operazione 9
Eliminazione di una macchina (in media ogni 3 anni)
DELETE FROM Macchine
WHERE
DELETE FROM CollSerbatoio
WHERE NOT EXISTS (SELECT *
FROM Macchine
WHERE CollSerbatoio.NGruppo =
Macchine.Ngruppo)
DELETE FROM Conf
WHERE NOT EXISTS (SELECT *
FROM Macchine
WHERE Conf.NGruppo =
Macchine.Ngruppo)
DELETE FROM Util
WHERE NOT EXISTS (SELECT *
FROM Macchine
WHERE Util.NGruppo =
Macchine.Ngruppo)
Operazione 10
Eliminazione di un serbatoio asettico (in media ogni 5 anni)
DELETE FROM Serbatoio
WHERE
DELETE FROM Cont
WHERE NOT EXISTS (SELECT *
FROM Serbatoio
WHERE Cont.Serbatoio = Serbatoio.Nome)
Operazione 11
Modificare lo stato delle macchine (in media 5 volte al giorno)
DROP ASSERTION
ControlloMacchineDiRiserva
UPDATE Macchine
SET Stato = <nuovostatomacchina>
WHERE Nome = <nomemacchina>
UPDATE Macchine
SET Stato = 'Riserva'
WHERE Nome = <nuovamacchinadiriserva>
CREATE ASSERTION ControlloMacchineDiRiserva
CHECK ((SELECT COUNT(NGruppo)
FROM NumRiserve) =
(SELECT COUNT(ALL Riserve)
FROM NumRiserve
WHERE Riserve = 1))
Operazione 12
Visualizzazione dello stato delle macchine (in media 10 volte al giorno)
SELECT *
FROM Macchine
ORDER BY Ngruppo, Stato
Operazione 13
Visualizzazione dei serbatoi non utilizzati (in media una volta al giorno)
SELECT
FROM Serbatoio
WHERE
FROM CollSerbatoio)
Operazione 14
Riutilizzare una macchina guasta dopo la sua riparazione (in media ogni 6
mesi)
UPDATE Macchine
SET Stato = 'Produzione'
WHERE Nome = <nomemacchina>
Operazione 15
Visualizzazione dei prodotti confezionati da vendere la successiva
settimana (in media una volta al giorno)
SELECT Ordine.Codice, Ordine.TipoProd,
Ordine.TipoRot, Ordine.Quantita,
Ordine.Capacita,
Ordine.DataConsegna, Ordine.DataRichiesta, Clienti.Nome
FROM Ordine, Clienti
WHERE Ordine.CodiceCliente = Clienti.Codice AND
Ordine.DataConsegna >= <dataodierna> AND
Ordine.DataConsegna <= (<dataodierna> + 7) AND
Ordine.Codice <> ALL (SELECT
ProdConf.Codice
FROM ProdConf)
ORDER BY Ordine.DataConsegna, Ordine.DataRichiesta
Per le operazioni che coinvolgono le
spese dell’azienda (le numero 16, 17, 18, 22 e 23) si utilizza la seguente vista:
CREATE VIEW Spese(Spesa, Data) AS
SELECT Spesa, Data
FROM FornitProdNC
UNION ALL
SELECT Spesa, Data
FROM FornitRotoli
Operazione 16
Visualizzazione delle spese settimanali (in media una volta a settimana)
SELECT SUM (ALL Spesa) AS SpeseSettimanali
FROM Spese
WHERE Data <= <dataodierna>
AND Data >= (<dataodierna> -
7)
Operazione 17
Visualizzazione delle spese mensili (in media una volta al mese)
SELECT SUM (ALL Spesa) AS SpeseMensili
FROM Spese
WHERE MONTH(Data) = MONTH(<dataodierna>)
AND
YEAR(Data) = YEAR(<dataodierna>)
Operazione 18
Visualizzazione delle spese annuali (in media una volta all'anno)
SELECT SUM (ALL Spesa) AS SpeseAnnuali
FROM Spese
WHERE YEAR(Data) = YEAR(<dataodierna>)
Operazione 19
Visualizzazione dei ricavi settimanali (in media una volta a settimana)
SELECT SUM (ALL Ricavo) AS
RicaviSettimanali
FROM Vendita
WHERE Data <= <dataodierna>
AND Data >= (<dataodierna> -
7)
Operazione 20
Visualizzazione dei ricavi mensili (in media una volta al mese)
SELECT SUM (ALL Ricavo) AS RicaviMensili
FROM Vendita
WHERE MONTH(Data) = MONTH(<dataodierna>)
AND
YEAR(Data) = YEAR(<dataodierna>)
Operazione 21
Visualizzazione dei ricavi annuali (in media una volta all'anno)
SELECT SUM (ALL Ricavo) AS RicaviAnnuali
FROM Vendita
WHERE YEAR(Data) = YEAR(<dataodierna>)
Operazione 22
Visualizzazione del bilancio mensile (in media una volta al mese)
DROP VIEW SpMens
DROP VIEW RicMens
CREATE VIEW SpMens(SpeseMensili) AS
SELECT SUM (ALL Spesa)
FROM Spese
WHERE MONTH(Data) = MONTH(<dataodierna>) AND
YEAR(Data) = YEAR(<dataodierna>)
CREATE VIEW RicMens(RicaviMensili) AS
SELECT SUM (ALL Ricavo)
FROM Vendita
WHERE MONTH(Data) = MONTH(<dataodierna>) AND
YEAR(Data) = YEAR(<dataodierna>)
SELECT R.RicaviMensili - S.SpeseMensili AS BilancioMensile
FROM RicMens AS R, SpMens AS S
Operazione 23
Visualizzazione del bilancio annuale (in media un volta all'anno)
DROP VIEW SpAnno
DROP VIEW RicAnno
CREATE VIEW SpAnno(SpeseAnnuali) AS
SELECT SUM (ALL Spesa)
FROM Spese
WHERE YEAR(Data) = YEAR(<dataodierna>)
CREATE VIEW RicAnno(RicaviAnnuali) AS
SELECT SUM (ALL Ricavo)
FROM Vendita
WHERE YEAR(Data) = YEAR(<dataodierna>)
SELECT R.RicaviAnnuali - S.SpeseAnnuali AS BilancioAnnuale
FROM RicAnno AS R, SpAnno AS S
Operazione 24
Visualizzazione dei prodotti presenti in magazzino (in media una volta al
giorno)
CREATE VIEW Magazzino(Oggetto,
QuantitaLunghezza, Tipo) AS
SELECT TipoProd, Quantita, 'Prodotto
Non Confezionato'
FROM ProdNCM
UNION
SELECT TipoRot, Lunghezza, 'Rotolo'
FROM RotoliM
[indice] - [Analisi dei requisiti] - [Progettazione concettuale] - [Progettazione logica] - [Testing]