• Non ci sono risultati.

UNIVERSITA DEGLI STUDI DI NAPOLI. - Corso di Laurea in Informatica -

N/A
N/A
Protected

Academic year: 2022

Condividi "UNIVERSITA DEGLI STUDI DI NAPOLI. - Corso di Laurea in Informatica -"

Copied!
30
0
0

Testo completo

(1)

UNIVERSITA’ DEGLI STUDI DI NAPOLI

ctÜà{xÇÉÑx

- Corso di Laurea in Informatica -

Basi di Dati e Laboratorio di Basi di Dati - A.A. 2007/2008 Prof. Alfredo Cuzzocrea

Relazione d’esame

Studente: Antonio Zuccaro

Matricola: 0108000937

(2)

INDICE

1. Introduzione

- Descrizione del caso aziendale: pag. 3 - Descrizione del progetto: pag. 3

2. Livello dati

- Descrizione: pag. 3

- Analisi dei requisiti: pag. 3

- Progettazione concettuale (schema E/R): pag. 4 - Schema dati UML: pag. 5

- Progettazione logica: pag. 6 - SQL-DDL: pag. 7

- Sequences e triggers: pag. 10 3. Livello applicazione

- Descrizione: pag. 11

- Funzionalità di base - Login: pag. 11 - Main: pag. 13

- Visualizzazione, Inserimento, Modifica/Cancellazione record: pag. 15 - Acquisto di un veicolo: pag. 19

- Funzionalità avanzate - Stampa fattura: pag. 22

- Ordinare gli impiegati per codice o ruolo: pag. 23

- Visualizzare l’impiegato con lo stipendio più alto: pag. 24

- Cercare un impiegato tramite ricerca per nome e cognome: pag. 24

- Cercare un veicolo per range di prezzo o per marca e modello: pag. 26

- Modificare una fattura: inserire o modificare una rateizzazione: pag. 27

- Elenco degli impiegati della concessionaria: pag. 29

(3)

1. INTRODUZIONE

1.1 – Descrizione del caso aziendale

Realizzazione di un Sistema Informativo per una concessionaria di automobili (“Concessionaria De Curtis”). La concessionaria acquista i veicoli dalle case produttrici e le vengono consegnati tramite corriere espresso. Gli impiegati della concessionaria che ricoprono il ruolo di “magazzinieri” hanno il compito di registrare i dati relativi alle bolle di consegna. Ogni macchina può disporre o meno di accessori (autoradio, copri sedili di varia fattura ecc.). Quando un veicolo viene venduto ad un nuovo cliente, vengono memorizzati i suoi dati anagrafici (a meno che l’acquirente non abbia già acquistato veicoli in passato) e può decidere se pagare in contanti o, eventualmente, tramite

pagamento rateale; sarà cura di una delle società finanziare che collaborano con la concessionaria di adempiere a questo compito. La concessionaria realizza degli spot pubblicitari per la sua

promozione, spot che verranno trasmessi da una o più emittenti televisive. Infine, la concessionaria offre un servizio di assistenza clienti grazie a delle officine convenzionate, che riparano eventuali guasti ai veicoli venduti.

1.2 – Descrizione del progetto

L’applicazione è caratterizzata dalla creazione delle tabelle nell’RDBMS Oracle (versione 10g), collegate, tramite connessione ODBC, al software Access 2003 della Microsoft, che consente di creare un’interfaccia utente alquanto intuitiva e diretta. A sua volta, Access si basa su istruzioni scritte in linguaggio VBA (Visual Basic for Applications), che, nel caso specifico, consente di realizzare feature più avanzate rispetto a quelle “tradizionali”, messe a disposizione dall’editor grafico base del programma.

2. LIVELLO DATI

2.1 – Descrizione

Le tabelle di Oracle sono costituite dai dati necessari per il corretto funzionamento

dell’applicazione. In linea di massima, i tipi di dati utilizzati sono stringhe (VARCHAR), variabili numeriche (NUMBER) e date (DATE). Dal momento che la connessione ODBC non consente di creare variabili di tipo contatore sotto Access, è stato necessario creare le suddette sotto Oracle mediante combinazioni di sequenze e trigger. Le variabili di auto incremento, se utilizzate come chiavi primarie (PK) sono un ottimo modo per garantire l’esistenza di record univoci.

2.2 – Analisi dei requisiti

• La concessionaria ha N impiegati (Codice, Nome, Cognome, Ruolo, Stipendio, Password).

• Una concessionaria acquista i veicoli direttamente dalle case produttrici (Codice, Nome, Sede, Indirizzo) e registra i dati delle bolle di consegna (Codice, Importo, Data, Corriere).

• Ogni veicolo è identificato da: (Telaio, Marca, Modello, Cilindrata, Prezzo).

• Ogni veicolo ha nessuno o N accessori (Codice, Nome, Descrizione).

• Un veicolo è acquistato da un cliente (Codice, Nome, Cognome, Indirizzo, Telefono).

(4)

• Subito dopo la vendita di un veicolo, la concessionaria registra i dati relativi alla fattura (Codice, Importo, Data).

• Una concessionaria mette a disposizione il pagamento rateale (Codice, Importo totale, N°

rate) dei veicoli tramite delle società finanziarie convenzionate (Codice, Nome, Sede, Indirizzo).

• Una concessionaria può offrire un servizio di assistenza clienti tramite un'officina convenzionata.

• Un’officina avrà (Codice, Nome, Indirizzo, Telefono, Nome titolare, Cognome titolare).

• Ogni officina avrà uno o N meccanici (Codice, Nome, Cognome, Stipendio).

• Un’officina può effettuare, in una certa data, uno o più interventi di riparazione, per conto della concessionaria, individuati da (Codice, Data, Costo) per la riparazione di un

determinato guasto (Codice, Descrizione).

Una concessionaria organizza una o più campagne pubblicitarie (Codice, Titolo, Agenzia pubblicitaria) trasmesse su una o più emittenti televisive (Codice, Nome, Frequenza).

2.3 – Progettazione Concettuale : Schema E/R

Vedi pagina seguente (realizzato usando il software SmartDraw. Una copia ad alta risoluzione del diagramma è disponibile sul CD).

(5)

Diagramma Entità/Relazione

2.4 – Schema dati UML

Vedi pagina seguente (realizzato utilizzando il software Enterprise Architect. Una copia ad alta risoluzione del diagramma è disponibile sul CD).

(6)

Schema dati UML

2.5 – Progettazione logica

Dopo la ristrutturazione dello schema E/R, si passa alla traduzione verso il modello logico.

• Accessorio (Codice, Nome, Descrizione, Id veicolo)

• Bolla (Codice, Importo, Data, Corriere)

• Campagna pubblicitaria (Codice, Titolo, Agenzia pubblicitaria)

• Casa produttrice (Codice, Nome, Sede, Indirizzo)

• Cliente (Codice, Nome, Cognome, Indirizzo, Telefono)

• Emittente TV (Codice, Nome, Frequenza, Id campagna)

• Fattura (Codice, Importo, Data, Id cliente, Rateizzazione, Id Rateizzazione, Id Veicolo)

• Guasto (Codice, Descrizione)

(7)

• Impiegato (Codice, Nome, Cognome, Stipendio, Ruolo, Password)

• Intervento (Codice, Data, Costo, Id officina, Id veicolo, Id guasto)

• Meccanico (Codice, Nome, Cognome, Stipendio, Id officina)

• Officina (Codice, Nome, Indirizzo, Telefono, Nome titolare, Cognome titolare)

• Rateizzazione (Codice, Importo totale, N° rate, Id cliente, Id soc finanziaria)

• Servizio clienti (Codice, Descrizione, Id officina)

• Società finanziaria (Codice, Nome, Sede, Indirizzo)

• Useronline (Codice)

• Veicolo (Telaio, Marca, Modello, Cilindrata, Prezzo, Id casa produttrice, Id cliente, Id bolla)

Vincoli di integrità referenziale (FK)

• In Accessorio: Id veicolo -> Veicolo (Telaio)

• In Emittente TV: Id campagna -> Campagna pubblicitaria (Codice)

• In Fattura: Id cliente -> Cliente (Codice), Id rateizzazione -> Rateizzazione (Codice), Id veicolo -> Veicolo (Telaio)

• In Intervento: Id officina -> Officina (Codice), Id veicolo -> Veicolo (Telaio), Id guasto -> Guasto (Codice)

• In Meccanico: Id officina -> Officina (Codice)

• In Rateizzazione: Id cliente -> Cliente (Codice), Id soc finanziaria -> Società finanziaria (Codice)

• In Servizio clienti: Id officina -> Officina (Codice)

• In Useronline: Codice -> Impiegato (Codice)

• In Veicolo: Id casa produttrice -> Casa produttrice (Codice), Id cliente -> Cliente (Codice), Id bolla -> Bolla (Codice)

2.6 – SQL-DDL (Data Definition Language)

Ecco il codice SQL – DDL per la creazione delle tabelle nel DBMS Oracle:

CREATE TABLE "ACCESSORIO"

( "NOME" VARCHAR2(30) NOT NULL ENABLE,

"DESCRIZIONE" VARCHAR2(30),

"ID_VEICOLO" NUMBER NOT NULL ENABLE,

"CODICE" NUMBER NOT NULL ENABLE,

CONSTRAINT "ACCESSORIO_PK" PRIMARY KEY ("CODICE") ENABLE, CONSTRAINT "ACCESSORIO_FK1" FOREIGN KEY ("ID_VEICOLO") REFERENCES "VEICOLO" ("TELAIO") ENABLE

)

CREATE TABLE "BOLLA"

( "IMPORTO" NUMBER NOT NULL ENABLE,

"DATA" DATE,

"CORRIERE" VARCHAR2(15),

"CODICE" NUMBER NOT NULL ENABLE,

CONSTRAINT "BOLLA_PK" PRIMARY KEY ("CODICE") ENABLE )

CREATE TABLE "CAMPAGNA_PUBBLICITARIA"

(8)

( "TITOLO" VARCHAR2(15) NOT NULL ENABLE,

"AGENZIA_PUBBLICITARIA" VARCHAR2(30),

"CODICE" NUMBER NOT NULL ENABLE,

CONSTRAINT "CAMPAGNA_PUBBLICITARIA_PK" PRIMARY KEY ("CODICE") ENABLE )

CREATE TABLE "CASA_PRODUTTRICE"

( "NOME" VARCHAR2(15) NOT NULL ENABLE,

"SEDE" VARCHAR2(30),

"INDIRIZZO" VARCHAR2(50),

"CODICE" NUMBER NOT NULL ENABLE,

CONSTRAINT "CASA_PRODUTTRICE_PK" PRIMARY KEY ("CODICE") ENABLE )

CREATE TABLE "CLIENTE"

( "NOME" VARCHAR2(15) NOT NULL ENABLE,

"COGNOME" VARCHAR2(15) NOT NULL ENABLE,

"CODICE" NUMBER NOT NULL ENABLE,

"INDIRIZZO" VARCHAR2(30) NOT NULL ENABLE,

"TELEFONO" NUMBER,

CONSTRAINT "CLIENTE_PK" PRIMARY KEY ("CODICE") ENABLE )

CREATE TABLE "EMITTENTE_TV"

( "NOME" VARCHAR2(15) NOT NULL ENABLE,

"FREQUENZA" VARCHAR2(8),

"ID_CAMPAGNA" NUMBER NOT NULL ENABLE,

"CODICE" NUMBER NOT NULL ENABLE,

CONSTRAINT "EMITTENTE_TV_PK" PRIMARY KEY ("CODICE") ENABLE, CONSTRAINT "EMITTENTE_TV_FK1" FOREIGN KEY ("ID_CAMPAGNA") REFERENCES "CAMPAGNA_PUBBLICITARIA" ("CODICE") ENABLE )

CREATE TABLE "FATTURA"

( "CODICE" NUMBER NOT NULL ENABLE,

"IMPORTO" NUMBER NOT NULL ENABLE,

"DATA" DATE,

"ID_CLIENTE" NUMBER NOT NULL ENABLE,

"RATEIZZAZIONE" NUMBER NOT NULL ENABLE,

"ID_RATEIZZAZIONE" NUMBER,

"ID_VEICOLO" NUMBER NOT NULL ENABLE,

CONSTRAINT "FATTURA_PK" PRIMARY KEY ("CODICE") ENABLE, CONSTRAINT "FATTURA_FK1" FOREIGN KEY ("ID_CLIENTE") REFERENCES "CLIENTE" ("CODICE") ENABLE,

CONSTRAINT "FATTURA_FK2" FOREIGN KEY ("ID_RATEIZZAZIONE") REFERENCES "RATEIZZAZIONE" ("CODICE") ENABLE,

CONSTRAINT "FATTURA_FK3" FOREIGN KEY ("ID_VEICOLO") REFERENCES "VEICOLO" ("TELAIO") ENABLE

)

CREATE TABLE "GUASTO"

( "CODICE" NUMBER NOT NULL ENABLE,

"DESCRIZIONE" VARCHAR2(30),

CONSTRAINT "GUASTO_PK" PRIMARY KEY ("CODICE") ENABLE )

CREATE TABLE "IMPIEGATO"

(9)

( "CODICE" NUMBER NOT NULL ENABLE,

"NOME" VARCHAR2(15) NOT NULL ENABLE,

"COGNOME" VARCHAR2(15) NOT NULL ENABLE,

"STIPENDIO" NUMBER NOT NULL ENABLE,

"RUOLO" VARCHAR2(15) NOT NULL ENABLE,

"PASSWORD" VARCHAR2(15) NOT NULL ENABLE,

CONSTRAINT "IMPIEGATO_PK" PRIMARY KEY ("CODICE") ENABLE )

CREATE TABLE "INTERVENTO"

( "DATA" DATE NOT NULL ENABLE,

"COSTO" NUMBER NOT NULL ENABLE,

"CODICE" NUMBER NOT NULL ENABLE,

"ID_OFFICINA" NUMBER NOT NULL ENABLE,

"ID_VEICOLO" NUMBER NOT NULL ENABLE,

"ID_GUASTO" NUMBER NOT NULL ENABLE,

CONSTRAINT "INTERVENTO_PK" PRIMARY KEY ("CODICE") ENABLE, CONSTRAINT "INTERVENTO_FK1" FOREIGN KEY ("ID_OFFICINA") REFERENCES "OFFICINA" ("CODICE") ENABLE,

CONSTRAINT "INTERVENTO_FK2" FOREIGN KEY ("ID_VEICOLO") REFERENCES "VEICOLO" ("TELAIO") ENABLE,

CONSTRAINT "INTERVENTO_FK3" FOREIGN KEY ("ID_GUASTO") REFERENCES "GUASTO" ("CODICE") ENABLE

)

CREATE TABLE "MECCANICO"

( "NOME" VARCHAR2(15) NOT NULL ENABLE,

"COGNOME" VARCHAR2(15) NOT NULL ENABLE,

"CODICE" NUMBER NOT NULL ENABLE,

"STIPENDIO" NUMBER NOT NULL ENABLE,

"ID_OFFICINA" NUMBER NOT NULL ENABLE,

CONSTRAINT "MECCANICO_PK" PRIMARY KEY ("CODICE") ENABLE, CONSTRAINT "MECCANICO_FK1" FOREIGN KEY ("ID_OFFICINA") REFERENCES "OFFICINA" ("CODICE") ENABLE

)

CREATE TABLE "OFFICINA"

( "NOME" VARCHAR2(15) NOT NULL ENABLE,

"INDIRIZZO" VARCHAR2(50),

"TELEFONO" NUMBER,

"NOME_TITOLARE" VARCHAR2(15) NOT NULL ENABLE,

"COGNOME_TITOLARE" VARCHAR2(15) NOT NULL ENABLE,

"CODICE" NUMBER NOT NULL ENABLE,

CONSTRAINT "OFFICINA_PK" PRIMARY KEY ("CODICE") ENABLE )

CREATE TABLE "RATEIZZAZIONE"

( "CODICE" NUMBER NOT NULL ENABLE,

"IMPORTO_TOTALE" NUMBER NOT NULL ENABLE,

"N°_RATE" NUMBER NOT NULL ENABLE,

"ID_CLIENTE" NUMBER NOT NULL ENABLE,

"ID_SOC_FINANZIARIA" NUMBER NOT NULL ENABLE,

CONSTRAINT "RATEIZZAZIONE_PK" PRIMARY KEY ("CODICE") ENABLE, CONSTRAINT "RATEIZZAZIONE_FK1" FOREIGN KEY ("ID_SOC_FINANZIARIA") REFERENCES "SOCIETÀ_FINANZIARIA" ("CODICE") ENABLE,

CONSTRAINT "RATEIZZAZIONE_FK2" FOREIGN KEY ("ID_CLIENTE") REFERENCES "CLIENTE" ("CODICE") ENABLE

(10)

)

CREATE TABLE "SERVIZIO_CLIENTI"

( "CODICE" NUMBER NOT NULL ENABLE,

"DESCRIZIONE" VARCHAR2(30),

"ID_OFFICINA" NUMBER NOT NULL ENABLE,

CONSTRAINT "SERVIZIO_CLIENTI_PK" PRIMARY KEY ("CODICE") ENABLE, CONSTRAINT "SERVIZIO_CLIENTI_FK" FOREIGN KEY ("ID_OFFICINA") REFERENCES "OFFICINA" ("CODICE") ENABLE

)

CREATE TABLE "SOCIETÀ_FINANZIARIA"

( "NOME" VARCHAR2(15) NOT NULL ENABLE,

"SEDE" VARCHAR2(15),

"INDIRIZZO" VARCHAR2(50),

"CODICE" NUMBER NOT NULL ENABLE,

CONSTRAINT "SOCIETÀ_FINANZIARIA_PK" PRIMARY KEY ("CODICE") ENABLE

)

CREATE TABLE "VEICOLO"

( "MARCA" VARCHAR2(15) NOT NULL ENABLE,

"MODELLO" VARCHAR2(15) NOT NULL ENABLE,

"CILINDRATA" VARCHAR2(15),

"PREZZO" NUMBER NOT NULL ENABLE,

"TELAIO" NUMBER NOT NULL ENABLE,

"ID_CASA_PRODUTTRICE" NUMBER NOT NULL ENABLE,

"ID_CLIENTE" NUMBER,

"ID_BOLLA" NUMBER NOT NULL ENABLE,

CONSTRAINT "VEICOLO_PK" PRIMARY KEY ("TELAIO") ENABLE, CONSTRAINT "VEICOLO_FK1" FOREIGN KEY ("ID_CASA_PRODUTTRICE") REFERENCES "CASA_PRODUTTRICE" ("CODICE") ENABLE,

CONSTRAINT "VEICOLO_FK2" FOREIGN KEY ("ID_CLIENTE") REFERENCES "CLIENTE" ("CODICE") ENABLE,

CONSTRAINT "VEICOLO_FK3" FOREIGN KEY ("ID_BOLLA") REFERENCES "BOLLA" ("CODICE") ENABLE

)

2.7 – Sequences e triggers

Come già detto in precedenza, si è scelto di utilizzare combinazioni di sequenze e trigger per creare variabili numeriche di auto incremento da usare come chiavi primarie nelle tabelle

dell’applicazione. Una sequenza tipo ha il seguente codice:

CREATE SEQUENCE "CODICEACCESSORIO" MINVALUE 1 MAXVALUE

999999999999999999999999999 INCREMENT BY 1 START WITH 1 NOCACHE NOORDER NOCYCLE

Un trigger tipo ha il seguente codice:

CREATE OR REPLACE TRIGGER "ACCESSORIO_T1"

BEFORE

insert on "ACCESSORIO"

(11)

for each row begin

select codiceaccessorio.nextval into :new.codice from dual;

end;

/

ALTER TRIGGER "ACCESSORIO_T1" ENABLE /

In pratica, all’atto di un’operazione di inserimento di un nuovo record (BEFORE INSERT), il trigger usa il valore numerico immediatamente successivo all’ultimo inserito, dopo averne controllato il valore dalla sequenza corrispondente.

3. LIVELLO APPLICAZIONE

3.1 – Descrizione

Il programma si basa sull’interazione tra l’utente e delle “maschere” (o forms), vere e proprie interfacce grafiche di utilizzo semplice ed intuitivo. Le maschere presenti sono 66, tre per ciascuna tabella Oracle; ognuna delle 3 maschere è adibita ad un diverso compito: visualizzazione,

inserimento e modifica/cancellazione record. Oltre alle forms per la gestione delle tabelle, ci sono una serie di maschere “extra”, che svolgono funzioni particolari (login utente, main, sottomaschere ecc.)

3.2 – Funzionalità di base

Le funzionalità di base dell’applicazione sono:

• Login (Autenticazione utente)

• Schermata di Main (Schermata principale dell’applicazione)

• Visualizzazione, Inserimento, Modifica/Cancellazione record per ogni tabella

• Acquisto di un veicolo

3.2.1 – Login

Appena viene aperta l’applicazione, l’utente si troverà di fronte alla schermata di login.

(12)

Schermata di login

Sarà necessario inserire il proprio cognome e la propria password per effettuare l’autenticazione. Il controllo per la validità dei dati viene effettuato mediante una query di selezione, che confronta il cognome utente e la password immessi con i dati della tabella IMPIEGATO. Se i dati sono

sbagliati, verrà visualizzato un messaggio d’errore. Se, invece, i dati sono giusti, verrà visualizzato un messaggio di benvenuto (riportante nome, cognome e ruolo dell’utente), la form di login verrà automaticamente chiusa e si giungerà alla schermata principale. Subito dopo l’autenticazione, il codice impiegato verrà salvato in una tabella apposita, USERONLINE, e verrà lì mantenuto fin quando non verrà chiusa l’applicazione.

In particolare, ai fini di evitare che un utente possa accedere nascostamente al database si è pensato di escogitare questo stratagemma: quando una maschera qualsiasi viene aperta, viene effettuato un controllo sulla tabella USERONLINE; più nello specifico, viene controllato se la tabella contiene un codice impiegato oppure no. In caso negativo (tabella vuota), verrà immediatamente visualizzato un messaggio di errore e la maschera verrà chiusa.

(13)

Tentativo di accedere ad una maschera saltando la fase di login

Un nuovo utente, quindi, sarà necessariamente costretto a passare per la form di Login per poter accedere al resto del programma. Per completezza, alla fine della relazione è riportata la tabella relativa agli impiegati della concessionaria con i relativi dati (paragrafo 3.4 - Elenco degli impiegati della concessionaria, pag. 29).

3.2.2 – Main

Subito dopo aver effettuato il login, l’utente verrà condotto alla schermata principale della nostra applicazione, il main. Da qui, è possibile accedere a tutte le maschere del programma, in base ai permessi di ogni utente. Nel SI in esame ci sono in tutto 3 ruoli diversi: Amministratore, Impiegato e Magazziniere.

• L’amministratore ha accesso a tutte le form in tutte le modalità (visualizzazione,

inserimento, modifica/cancellazione). E’ l’unico utente a poter cancellare/modificare i dati di un impiegato e a poter vedere il loro stipendio e password.

• Un impiegato ha accesso a tutte le form in tutte le modalità (visualizzazione, inserimento, modifica/cancellazione) ma con delle eccezioni: non può vedere la password o lo stipendio dei suoi colleghi, né modificarne il ruolo. Ha accesso alle bolle di consegna in sola modalità

“visualizzazione”.

• Un magazziniere ha accesso esclusivamente alle tabelle relative alle bolle di consegna in tutte le modalità previste (visualizzazione, inserimento, modifica/cancellazione).

(14)

Login effettuato come Amministratore

Login effettuato come Magazziniere

(15)

3.2.3 – Visualizzazione, Inserimento, Modifica/Cancellazione record

Le suddette funzioni valgono per ognuna delle tabelle Oracle. Vediamo una sequenza di visualizzazione, inserimento e modifica/cancellazione record per la maschera sugli accessori.

- Visualizzazione accessori

Come da titolo, qui è possibile vedere tutti gli accessori presenti in magazzino, una loro descrizione ed il veicolo per cui essi sono previsti.

Visualizzazione accessori

Tramite la combo box in alto a destra, è possibile spostarsi direttamente ad un particolare accessorio, indicato da un proprio codice identificativo univoco.

- Visualizzazione bis

In alcuni casi, si è ritenuto opportuno creare delle subform per visualizzare informazioni di interesse alle quali bisogna accedere spesso. Un tipico esempio è quello di visualizzare, per ogni cliente presente nel database, quanti e quali veicoli ha acquistato e l’importo totale dei suoi acquisti.

(16)

Visualizzazione clienti – Uso di subform

- Inserimento

In questa form è possibile inserire un nuovo accessorio. Non è necessario immettere un codice identificativo, dal momento che verrà generato automaticamente dal trigger Oracle, come è stato detto nei paragrafi precedenti. Ai fini di limitare il più possibile errori di digitazione da parte dell’utente, è possibile scegliere il veicolo per cui un accessorio è previsto dalla combo box

“Veicolo…”. Dopo la pressione del tasto “Salva record”, il nuovo accessorio sarà automaticamente aggiunto nella tabella “Accessorio”.

(17)

Inserimento accessorio

Scelta di un veicolo dalla combo box

(18)

- Modifica/Cancellazione record

Alle volte, può essere necessario modificare un record immesso (errore di digitazione, errore di associazione ad un dato veicolo ecc.) o, in casi estremi, cancellarlo. La maschera “modifica accessori” svolge esattamente questi due compiti.

Modifica accessori

Dal momento che Microsoft Access salva le modifiche apportate ai record senza visualizzare nessun messaggio di conferma dell’operazione, si è pensato di prestare particolare attenzione a questa eventualità con una subroutine scritta appositamente, riportata qui di seguito:

Private Sub Form_BeforeUpdate(Cancel As Integer) Dim var1 As Integer

var1 = MsgBox("Salvare i cambiamenti effettuati?", vbYesNo + vbQuestion) If var1 = vbNo Then

Cancel = True Me.Undo

End If End Sub

(19)

Prima dell’aggiornamento della form, viene visualizzata una message box, riportante il messaggio

“Salvare i cambiamenti effettuati?”, più due pulsanti di controllo, “Si” e “No”. Se l’utente clicca su no, vengono annullate tutte le modifiche apportate al record in quel momento. Un ragionamento analogo è stato fatto per l’inserimento di un valore in una combo box. Nel caso specifico, se l’utente volesse cambiare il veicolo di destinazione per un dato accessorio, potrà scegliere il nuovo veicolo dalla combo box omonima. Una volta selezionata la macchina desiderata, verrà visualizzato una richiesta di conferma; il codice che implementa questa funzione è il seguente:

Private Sub CasellaCombinata264_Dirty(Cancel As Integer) Dim var1 As Byte

var1 = MsgBox("Sei sicuro di voler cambiare i valori attuali?", vbQuestion + vbYesNo)

If var1 = vbNo Then Cancel = True Me.Undo

Exit Sub End If

End Sub

Infine, per quanto riguarda la cancellazione di un record, Microsoft Access visualizza

automaticamente un messaggio di avvertimento, quindi non è stato necessario implementare nulla in merito.

3.2.4 – Acquisto di un veicolo

L’acquisto di un veicolo è una delle principali feature della nostra applicazione. Nella pagina seguente è riportato un diagramma di flusso (flow chart) che illustra schematicamente il susseguirsi delle operazioni (realizzato usando il software SmartDraw. Una copia ad alta risoluzione del

diagramma è disponibile sul CD).

(20)

Flow chart per l’acquisto di un veicolo

(21)

Come al solito, non sarà necessario inserire un codice identificativo per la fattura, visto che sarà generato automaticamente dal trigger Oracle corrispondente. Per limitare il più possibile errori di battitura da parte dell’utente, la data della fattura viene inserita automaticamente, presa

dall’orologio di sistema (nel caso, sarà possibile cambiarla dalla maschera per la modifica delle fatture). La scelta del cliente e del veicolo avvengono mediante due combo box apposite, come è possibile vedere dall’immagine seguente. Ovviamente, sarà possibile scegliere i veicoli ancora presenti in magazzino. Questo controllo viene effettuato in modo molto semplice: la tabella VEICOLO presenta l’attributo ID_CLIENTE; se quest’ultimo è settato a NULL, vuol dire che il veicolo in questione non è ancora stato venduto e, quindi, può comparire nella combo box. La query che regola l’origine dati della casella combinata è del tipo

SELECT Veicolo.Marca, Veicolo.Modello, Veicolo.Cilindrata FROM Veicolo V

WHERE V.IdCliente IS NULL;

Una volta scelto un veicolo, il suo importo apparirà automaticamente nel campo “Importo” della maschera, sempre per automatizzare il più possibile le operazioni.

Inserimento fattura

E’ anche possibile decidere se un cliente ha intenzione di pagare a rate un veicolo spuntando la casellina “Attiva” sotto la voce “Rateizzazione”. A questo punto, basterà inserire il numero di rate desiderate e scegliere la società di finanziamento dalla combo box omonima

(22)

Inserimento fattura – Scelta della società di finanziamento

Infine, dopo aver cliccato sul pulsante “salva record”, la nuova fattura verrà automaticamente inserita nel nostro database. Nel caso in cui il cliente abbia deciso di pagare a rate, partirà una subroutine specifica che si preoccuperà di creare automaticamente il record relativo alla nuova rateizzazione nella tabella “Rateizzazione”, secondo le seguenti modalità:

• Salva i dati relativi alla fattura corrente

• Attiva il trigger RATEIZZAZIONE_T1 per generare il nuovo codice identificativo per la rateizzazione

• Esegui una query di inserimento per creare la nuova rateizzazione nella tabella omonima

• Esegui una query di aggiornamento sulla tabella FATTURA per settare l’attributo ID_RATEIZZAZIONE al codice della rateizzazione corrispondente

3.3 – Funzionalità avanzate

Vengono qui riportate le funzionalità più avanzate dell’applicazione, tra le quali, quelle che hanno richiesto la stesura di particolari subroutine o query per funzionare:

• Possibilità di stampare la fattura per la vendita di un veicolo.

• Possibilità di ordinare gli impiegati per codice o per ruolo.

• Possibilità (esclusiva per l’amministratore) di visualizzare l’impiegato con lo stipendio più elevato.

• Possibilità di cercare nel database un determinato impiegato per nome e cognome.

• Possibilità di cercare nel database un determinato veicolo per range di prezzo o per marca e modello.

• Possibilità di modificare la fattura di un cliente e di eliminare o inserire un pagamento rateale.

3.3.1 – Stampa della fattura

E’ prevista la possibilità di stampare la fattura relativa alla vendita di un dato veicolo. Eccone un’anteprima.

(23)

Anteprima di stampa della fattura relativa alla vendita di un veicolo

3.3.2 – Ordinare gli impiegati per codice o ruolo

E’ possibile, in base alle esigenze, ordinare gli impiegati della concessionaria in base al codice o al ruolo.

Ordinare gli impiegati in base al codice o al ruolo. A lato, lo stipendio e la password sono visibili perché si era loggati al sistema come Amministratore

Per fare ciò, è stato necessario creare due macro che, a loro volta, facessero partire una query specifica (con la clausola ORDER BY Impiegato.Codice oppure ORDER BY Impiegato.Ruolo, in base ai casi) su pressione del pulsante di comando. Il codice adoperato è:

(24)

Private Sub Comando308_Click() Dim stDocName As String

stDocName = "Impiegati - Codice"

DoCmd.RunMacro stDocName Exit_Comando308_Click:

Exit Sub End Sub

3.3.3 – Visualizzare l’impiegato con lo stipendio più elevato

Per fare ciò, prima di tutto, bisogna essere loggati al sistema come Amministratore, dopodiché basterà cliccare sul pulsante “Max Stipendio” per far partire una semplice query di selezione e, automaticamente, il risultato verrà visualizzato in una finestra “foglio dati” (vedi Microsoft Excel)

Risultato della query per la visualizzazione dell’impiegato col massimo stipendio

3.3.4 – Cercare un impiegato tramite inserimento di nome e cognome

La ricerca di un impiegato avviene nel modo seguente: dopo l’apertura della form per la ricerca, basterà immettere nome, cognome e cliccare il pulsante “Cerca”. Se uno o più campi sono vuoti, verrà visualizzato un messaggio di errore. Stesso discorso valga se nessun impiegato soddisfa i dati immessi per la ricerca. Una volta premuto il pulsante “Cerca”, partirà una query di selezione che confronterà i dati della tabella IMPIEGATO con quelli immessi nelle caselle di testo “Nome” e

“Cognome”.

(25)

Ricerca di un impiegato

Ricerca di un impiegato: esito negativo

(26)

Ricerca di un impiegato: esito positivo

3.3.5 – Cercare un veicolo per range di prezzo o per marca e modello

Discorso esattamente analogo al precedente è fatto per la ricerca di un veicolo. Dopo l’apertura della form per la ricerca, basterà immettere marca, modello e cliccare il pulsante “Cerca”. Se uno o più campi sono vuoti, verrà visualizzato un messaggio di errore. Stesso discorso valga se nessun veicolo soddisfa i dati immessi per la ricerca. Una volta premuto il pulsante “Cerca”, partirà una query di selezione che confronterà i dati della tabella VEICOLO con quelli immessi nelle caselle di testo “Marca” e “Modello”.

Ricerca di un veicolo per marca e modello: esito positivo

(27)

Infine, la ricerca di un veicolo secondo un range di prezzo avviene praticamente allo stesso modo, solo che la query selezionerà tutti i veicoli il cui prezzo sarà compreso tra il valore della casella di testo “Prezzo minimo” e il valore della casella di testo “Prezzo masimo”.

Ricerca di un veicolo per range di prezzo

3.3.6 – Modificare una fattura: inserire o eliminare una rateizzazione

La gestione di questa maschera è piuttosto elaborata, dovendo regolare eventuali modifiche, cancellazioni o annullamenti record su più tabelle. Iniziamo con ordine: oltre alle operazioni di modifica/cancellazione dei dati relativi alla sola tabella FATTURA (che, ricordiamo, sono

completamente automatizzate grazie a Microsoft Access), è stato necessario implementare una serie di subroutine che gestissero eventuali modifiche/cancellazioni alle varie tabelle collegate a

FATTURA. Volendo riassumere il tutto, si può stilare una casistica come segue:

• Caso 1 – Cancellazione di una fattura

• Caso 2 – Modifica di una fattura: cancellazione di una rateizzazione esistente

• Caso 3 – Modifica di una fattura: inserimento di una nuova rateizzazione su una fattura già esistente

• Caso 4 – Annullamento della cancellazione di una rateizzazione

(28)

Maschera per la modifica delle fatture

Caso 1 - Cancellazione di una fattura Il codice VBA esegue questi comandi:

• Visualizzazione di un messaggio per la conferma di cancellazione

• In caso negativo, esci dalla subroutine

• In caso affermativo, aggiorna la tabella VEICOLO, settando a NULL l’attributo ID_CLIENTE del veicolo la cui fattura è stata appena cancellata

• Aggiorna la tabella FATTURA, settando a NULL l’attributo ID_RATEIZZAZIONE (necessario poiché è un vincolo di integrità)

• Se la casella “Rateizzazione” è attiva, cancellare dalla tabella RATEIZZAZIONE la rateizzazione corrispondente

• Cancellare la fattura dalla tabella FATTURA

• Refresh della maschera attuale

Caso 2 – Modifica di una fattura: cancellazione di una rateizzazione esistente Il codice VBA esegue i seguenti comandi:

(29)

• Aggiorna la tabella FATTURA, settando a NULL l’attributo ID_RATEIZZAZIONE (necessario poiché è un vincolo di integrità)

• Cancellare la rateizzazione dalla tabella RATEIZZAZIONE

• Refresh della maschera attuale

Caso 3 – Modifica di una fattura: inserimento di una nuova rateizzazione su una fattura già esistente

Il codice VBA esegue i seguenti comandi:

• Salva i dati relativi alla fattura corrente

• Attiva il trigger RATEIZZAZIONE_T1 per generare il nuovo codice identificativo per la rateizzazione

• Esegui una query di inserimento per creare la nuova rateizzazione nella tabella omonima

• Esegui una query di aggiornamento sulla tabella FATTURA per settare l’attributo ID_RATEIZZAZIONE al codice della rateizzazione corrispondente

Caso 4 – Annullamento della cancellazione di una rateizzazione

Ogni qual volta ci si sposti su un record per il quale è attiva una rateizzazione, viene effettuata una copia esatta della stessa nella tabella RATEIZZAZIONE TEMP. Ciò è necessario al fine di

effettuare un recupero di emergenza dei dati qualora si debba annullare la cancellazione di una rateizzazione per una certa fattura. Il codice VBA esegue i seguenti comandi:

• Per ottenere l’esatto codice identificativo della rateizzazione appena cancellata, viene attivato il trigger RATEIZZAZIONE_T1 e il suo valore, decrementato di 1, viene salvato in una variabile temporanea

• Nella tabella RATEIZZAZIONE viene inserito il contenuto della tabella

RATEIZZAZIONE_TEMP (il trigger “scatta” in avanti di uno. Dovrà essere settato al giusto valore, in un secondo momento)

• Viene aggiornata la rateizzazione appena inserita, usando il codice rateizzazione presente nella variabile temporanea

• Esegui una query di aggiornamento sulla tabella FATTURA per settare l’attributo ID_RATEIZZAZIONE al codice della rateizzazione corrispondente

• E’ ora necessario settare il trigger RATEIZZAZIONE_T1 al giusto valore numerico: viene cancellata la sequenza di riferimento usando il comando DROP SEQUENCE

• Usando il comando CREATE SEQUENCE, viene immediatamente ricreata una nuova sequenza, con lo stesso identico nome, settando l’ultimo valore immesso al contenuto della variabile temporanea.

3.4 – Elenco degli impiegati della concessionaria

Di seguito è riportato l’elenco di tutti gli impiegati della concessionaria, con relative informazioni riguardanti: codice, nome, cognome, stipendio, ruolo e password.

(30)

Tabella relativa agli impiegati della concessionaria

Riferimenti

Documenti correlati

Il processo di “binding” delle variabili può avvenire in entrambe le strutture di unificazione e compare anche nella invocazione delle funzioni dei linguaggi di

Jolly

 interroga il Data Management Service per ottenere l’elenco degli Storage Element che contengono i file richiesti.  interroga l’Information Service per ottenere l’elenco delle

Parte della dottrina 51 ha rilevato come le norme regolamentari si scontrino con i principi accolti nella Costituzione (1948) e nel nuovo Accordo di Villa Madama (1984)

Jolly

644 schermi cosi ripartiti: Roma termini (145);Milano Centrale (88);Torino Portanuova (66);. Napoli Centrale (57); Bologna Centrale (56);

Vari formati: boxbanner 300x250 ,manchette 160x90, instant focus, brand content, speciale informativo, inserto su libro dei fatti 2015. 2 mesi

Saldo spese postali mese di aprile 2014 - Conto