Università degli Studi di Urbino



Documenti analoghi
Database 1 biblioteca universitaria. Testo del quesito

Esercizio data base "Biblioteca"

Guida alla registrazione on-line di un DataLogger

Volumi di riferimento

Basi di Dati Relazionali

GESTIONE DI MDB in WEB

Basi di dati. Il Linguaggio SQL. K. Donno - Il Linguaggio SQL

LA GESTIONE DELLE VISITE CLIENTI VIA WEB

GESGOLF SMS ONLINE. Manuale per l utente

RELAZIONE PROGETTO DATABASE GESTIONE BIBLIOTECA PERSONALE

DBMS (Data Base Management System)

Guida all uso di Java Diagrammi ER

1. Analisi dei requisiti

PHP E MYSQL CREAZIONE DI UN NUOVO DATABASE DAL PHPMYADMIN

Abilità Informatiche A.A. 2010/2011 Lezione 9: Query Maschere Report. Facoltà di Lingue e Letterature Straniere

Esercizi di JavaScript

ACTIVE SERVICE PAGES E DATABASE: tecnologia ADO

Università degli Studi di Padova Centro di Calcolo di Ateneo

PSNET UC RUPAR PIEMONTE MANUALE OPERATIVO

Introduzione alla teoria dei database relazionali. Come progettare un database

Azioni. Select e join non consentono di modificare il contenuto del DB. Inserzione di nuovi dati. Azioni desiderate. Aggiornamento di dati

Sistemi di Content Managment.

Corso Drupal «Project management»

OSSIF WEB. Manuale query builder

database: modello entityrelationship

LEGGERE E VISUALIZZARE I DATI DI UNA TABELLA IN UNA PAGINA WEB

Manuale Utente Albo Pretorio GA

Esercitazione 1. Sistemi Informativi T. Versione elettronica: L01.2.DDLDMLbase.pdf

RELAZIONE SCRITTA RELATIVA AL PROGRAMMA DI GESTIONE SITO E-COMMERCE

SCI Sistema di gestione delle Comunicazioni Interne > MANUALE D USO

2.0 Gli archivi. 2.1 Inserire gli archivi. 2.2 Archivio Clienti, Fornitori, Materiali, Noleggi ed Altri Costi. Impresa Edile Guida all uso

Vi ricordiamo che per qualsiasi problema tecnico o informazione potete contattare info@eduitalia.org oppure Francesco al

Informatica Industriale Modello funzionale: Informazione Progettazione concettuale

MANUALE D USO DELLA PIATTAFORMA ITCMS

Banca dati Professioniste in rete per le P.A. Guida all uso per le Professioniste

Registrazione nuovo utente. Per registrare un nuovo utente cliccare sul link Registrazione

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

INSERIMENTO DATI BASILARI

GUIDA ALL UTILIZZO DEL PORTALE DELLA RETE DEI COMUNI OGLIO PO

File, Modifica, Visualizza, Strumenti, Messaggio

Lezione 8. Metadati, Viste e Trigger

Capitolo 13. Interrogare una base di dati

Corso Sistemi Informativi Avanzati. Programma 30 set Installazione Macchina Virtuale. Introduzione alla BI nelle Aziende.

Schede ADI ADP ADEM Prestazioni aggiuntive MMG. - Manuale - Data Solution Provider s.r.l.

SOSEBI PAPERMAP2 MODULO WEB MANUALE DELL UTENTE

GERARCHIE RICORSIVE - SQL SERVER 2008

Il sofware è inoltre completato da una funzione di calendario che consente di impostare in modo semplice ed intuitivo i vari appuntamenti.

Impresa di raccolta e riciclaggio di materiali metallici e di rifiuti.

Corso di Basi di Dati A.A. 2014/2015

CONTENT MANAGEMENT SY STEM

Promemoria delle principali funzioni di Gestione utenti e prestiti in SOL

SIFORM MANUALE VOUCHER FORMATIVI A DOMANDA AZIENDALE

Guida docenti all inserimento delle informazioni sugli insegnamenti (programmi, etc.) da web

19. LA PROGRAMMAZIONE LATO SERVER

Introduzione a MySQL

GUIDA UTENTE PRIMA NOTA SEMPLICE

Modulo 4 Il pannello amministrativo dell'hosting e il database per Wordpress

Si formulino le seguenti interrogazioni tramite il linguaggio SQL:

Manuale operatore per l utilizzo dell utente di dominio

Progettazione concettuale

Procedure memorizzate SQL-2003/PSM. Forma base di PSM. Parametri in PSM

PROGRAMMA GESTIONE TURNI MANUALE UTENTE. Programma Gestione Turni Manuale Utente versione 1.1

Procedura SMS. Manuale Utente

CORSO ACCESS PARTE II. Esistono diversi tipi di aiuto forniti con Access, generalmente accessibili tramite la barra dei menu (?)

ESEMPI DI QUERY SQL. Esempi di Query SQL Michele Batocchi AS 2012/2013 Pagina 1 di 7

Guida all'uso del CMS (Content Management System, Sistema di Gestione dei Contenuti)

Definizione di domini

USARE JOOMLA 1.7/2.5 per gestire il vostro sito.

GUIDA AL SITO DELLE RIPARAZIONI BARWARE SOMMARIO

MySQL Database Management System

MySQL Database Management System

SERVIZIO DI MESSAGGISTICA ALL UTENTE. Manuale per l operatore

Le Basi di Dati. Le Basi di Dati

Prova scritta del corso di Basi di dati attive 17 Dicembre Agenzia

GHPPEditor è un software realizzato per produrre in modo rapido e guidato un part program per controlli numerici Heidenhain.

APPENDICE LINEE GUIDA PER SPERIMENTAZIONE WEB

Questa guida è realizzata per spiegarvi e semplificarvi l utilizzo del nostro nuovo sito E Commerce dedicato ad Alternatori e Motorini di avviamento.

PHP e MySQL. Guida scaricata da

Entrare nel sistema. Clicca su Entra per entrare nel sistema. PAGINA 1

Strutturazione logica dei dati: i file

Settaggio impostazioni tema. Cliccando nuovamente su aspetto e poi su personalizza si avrà modo di configurare la struttura dinamica della template.

INDICI. Prevediamo di effettuare spesso interrogazioni simili alle seguenti:

S.I.N. S.R.L. SISTEMA INFORMATIVO NAZIONALE

Direzione Centrale per le Politiche dell Immigrazione e dell Asilo

Indice generale. Capitolo 3 Introduzione a PHP...43 Sintassi e istruzioni di base Variabili, operatori e commenti Array...

. A primi passi con microsoft a.ccepss SommarIo: i S 1. aprire e chiudere microsoft access Start (o avvio) l i b tutti i pro- grammi

COME ELIMINARE PARTI DEL TEMPLATE IN PAGINE SINGOLE

SQL: concetti base SQL. Definizione dei dati in SQL. SQL: "storia"

A tal fine il presente documento si compone di tre distinte sezioni:

Istruzioni per il pagamento con Carta di Credito

Manuale d uso Event Bureau

Insegnamento di Informatica CdS Scienze Giuridiche A.A. 2006/7. Il trattamento dei dati

Compito DA e BD. Tempo concesso: 90 minuti 12 giugno 03 Nome: Cognome: Matricola: Esercizio 1

InfoWeb - Manuale d utilizzo per utente DIPENDENTE

Obiettivo dell esercitazione

Università degli Studi di L Aquila. Facoltà di Ingegneria. Corso di Laurea in Ingegneria Elettronica Corso di Sistemi Informativi

Guida Compilazione Piani di Studio on-line

INFN Sezione di Perugia Servizio di Calcolo e Reti Fabrizio Gentile Enrico Becchetti

Transazioni - Parte 1

Access. P a r t e p r i m a

Transcript:

Università degli Studi di Urbino Facoltà Di Scienze Matematiche Fisiche e Naturali Informatica Applicata Corso di Basi Dati e Sistemi Informativi PROGETTO BIBLIOTECA UNIVERSITARIA Diego Alicata (Matricola 148925) Denny Bini (Matricola 201794)

1. ANALISI DEI REQUISITI 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. L università di Urbino ha deciso di realizzare un sistema informativo centralizzato per la consultazione di dati relativi ad i libri di tutte le biblioteche dell università. Ogni facoltà ha una biblioteca, in ogni biblioteca vi sono centinaia di libri. I libri sono riconosciuti tramite il codice ISBN, il titolo, l Editore, la lingua, l anno di pubblicazione e gli autori. Ogni biblioteca può avere più copie dello stesso libro. Della Casa Editrice registrata nel nostro archivio, vogliamo conoscere la denominazione e la città di appartenenza. Di ciascun autore vogliamo conservare i principali dati anagrafici (nome, cognome, data di nascita, luogo di nascita, Biografia). Per ogni libro è inoltre registrata la facoltà di appartenenza. Ogni studente, professore e bibliotecario può chiedere uno o più libri in prestito. Il sistema avverte a richiesta gli addetti alla biblioteca i quali sono gli studenti o professori che abbiamo ancora libri e che non li abbiano ancora restituiti. Gli studenti e i professori possono consultare i libri direttamente dal sito effettuando un login, avranno immediatamente accesso alla sezione di visione dei prestiti effettuati, mentre i biliotecari hanno accesso a tutte le altre sezioni: registrazioni, modifiche, effettuazione prestiti. Termini ambigui nei requisiti e correzioni possibili: Vediamo quali modifiche apportare al testo: v Alla riga 4 troviamo il termine Editore, per poi leggere alla riga cinque Casa Editrice. Questo sinonimo dato che fa riferimento allo stesso nome può essere sostituito con Editore. (omonimo in linea 5) v Alla riga 10 non si interpreta bene, la seguente frase: gli addetti alla biblioteca i quali sono gli studenti o professori che abbiamo ancora libri e che non li abbiano ancora restituiti.. Da questo breve testo non capiamo bene, chi effettua il prestito, certamente conoscendo il funzionamento di una biblioteca lo si potrebbe intuire, ma preferiamo trasformare questa frase, con Il sistema avverte (a richiesta) i bibliotecari su i prestiti scaduti (perché sono decorsi più di 60 giorni dal prestito) segnalando all utente che è decorso il termine di consegna di restituzione del libro. (più chiaro e preciso) v Alla riga 13 abbiamo che gli studenti e professori hanno un login, ma leggendo dal testo non abbiamo ben chiaro se i bibliotecari ne hanno anch essi uno. Il testo verrà ristrutturato come segue: gli utenti (professori, studenti, bibliotecari) hanno una password con la quale a seconda della tipologia d utente possono effettuare operazioni diverse. Gli studenti e i professori possono controllare i propri prestiti, mentre i bibliotecari hanno accesso a tutte le altre sezioni: registrazioni, modifiche, effettuazioni prestiti. (più chiaro e preciso).

Glossario con relativi collegamenti: TERMINE COLLEGAMENTI Autore Libro Editore Libro Facoltà Biblioteca Archivio Copia Libro - Archivio Prestito Archivio Utente Utente Prestito Password Utente Biblioteca - Ristrutturazione dopo il filtraggio delle ambiguità: Si vuole realizzare un sistema informativo centralizzato per la consultazione di dati relativi ad i libri di tutte le biblioteche dell università. Ogni facoltà ha una biblioteca, in ogni biblioteca vi sono centinaia di libri. Per i libri, identificati dal codisbn, rappresentiamo il titolo, l editore, la lingua, l anno di pubblicazione, gli autori, e le facoltà di appartenenza. Ogni biblioteca può avere più copie dello stesso libro. Per gli editori rappresentiamo la denominazione e la città di appartenenza. Per gli autori rappresentiamo il nome, cognome, data e luogo di nascita e una breve biografia. Per l archivio rappresentiamo il codice scaffale. Il sistema avverte (a richiesta) i bibliotecari su i prestiti scaduti (perché sono decorsi più di 60 giorni dal prestito) segnalando l utente che ha decorso il termine di consegna di restituzione del libro. Per gli utenti (professori, studenti, bibliotecari) vogliamo avere una password con la quale a seconda della tipologia d utente possono effettuare operazioni diverse. Gli studenti e i professori possono controllare i propri prestiti, mentre i bibliotecari hanno accesso a tutte le altre sezioni: registrazioni, modifiche, effettuazione prestiti.

2. PROGETTAZIONE CONCETTUALE Per la progettazione concettuale abbiamo scelto una strategia di tipo Top Down. Questa scelta ci ha permesso di descrivere inizialmente le specifiche dei dati trascurandone i dettagli per poi entrare nel merito un concetto alla volta. Il modello effettua una serie di trasformazioni che via via arricchiscono lo schema scheletro con associazioni e generalizzazioni fino al completamento finale che avviene tramite l inserimento di attributi semplici e composti. Di seguito l evoluzione a partire dallo schema scheletro: Schema scheletro: Lo schema scheletro è stato realizzato partendo dal glossario, ogni termine rilevante è rappresentato come entità, e ogni relazione esistente tra esse è stata opportunamente inserita. Lo schema è quindi il seguente:

Schema parziale 1: Abbiamo scomposto l entità Libro in associazioni, e poi abbiamo aggiunto ad essa attributi composti e semplici. Analizziamo il tipo di relazione che lega le varie associazioni. Ogni biblioteca è di una sola facoltà (1,1) e una facoltà ha una sola biblioteca (1,1) Una facoltà ha più archivi (1,n), ma ad un archivio corrisponde una sola facoltà (1,1). Un libro può avere più copie in diverse facoltà (1, n), ma un Archivio corrisponde un determinato numero di copie (1,1) Un autore può avere scritto più libri (1,n), e un libro può essere scritto da più autori (1,n) Nel soprastante schema avremmo potuto inserire l attributo NCopiePrestate (Archivio) per tenere traccia delle copie disponibili. Abbiamo però preferito non inserirlo in quanto la ricerca può essere effettuata anche senza il dato ridondante e come vedremo meglio nelle analisi delle ridondanze tale inserimento non sarebbe stato così vantaggioso. Il numero delle facoltà anche se piuttosto fisso non è stato espresso come generalizzazione in quanto all aumentare del tempo di utilizzo della Basi di Dati possono nascere nuove facoltà (così come possono diminuirne). Un buon sistema informativo deve essere in grado, per quanto possibile, di fronteggiare anche le esigenze future.

Schema parziale 2: Come mostrato in figura l utente è una generalizzazione di studente, bibliotecario e professore

Integrazioni di schemi: Integrando gli schemi otteniamo il seguente schema:

3. RISTRUTTURAZIONE DELLO SCHEMA CONCETTUALE ANALISI DEGLI INDICI PRESTAZIONALI Descrizione delle operazioni principali. OPERAZIONE Registrazione libro Ricerca disponibilità libro Registrazione di un prestito Registrazione restituzione libro Consultazione prestiti Visualizzazione a richiesta da parte di un bibliotecario dei prestiti scaduti RISERVATA A Bibliotecario Bibliotecario Studente Professore Bibliotecario Bibliotecario Bibliotecario Bibliotecario Volume dei dati previsto Analisi dei dati 16.000 studenti 200 professori 11 facoltà 10.000 titoli per ogni biblioteca (le copie presenti per ogni libro sono di un massimo di 5) = 10.000 * 5 = 50.000 * 11 (facoltà) = 550.000. 100 autori per ogni biblioteca 100 * 11 = 2.200 50 editori per ogni biblioteca 50 * 11 = 550 5 bibliotecari per ogni facoltà 5 * 11 = 55

Occupazione di memoria -1c sta per il carattere di terminazione = 1 Byte - c è un carattere = 1 Byte - I è un integer = 4 Bytes - D è la data = 10 Bytes CONCETTO TIPO VOLUME Occupazione Spazio occupato (massimo) Biblioteca E 11 20c + 1c (Località) 21*11= 231 Bytes Situata R 11 - Facoltà E 11 40c + 1c (Nome) Appartiene R 55.000 - Archivio E 55.000 10c + 1c (CodScaffale) + 1I (Ncopie) Copia R 55.000 - Libro E 11.000 13c (CodISBN) + 50c + 1c (Titolo) + 1I(Anno) + 20c + 1c (Lingua) Stampa R 11.000-41*11= 451 Bytes 15*55.000= 806 Kb 89*11000= 956 Kb Editore E 550 40c + 1c (Denominazione) + 20c + 1c (Città) Scritto R 2.200 - Autore E 2.200 30c + 1c (Nome) + 30c + 1c (Cognome) + 1D (DataNascita) + 20c + 1c (LuogoNascita) + 100c + 1c (Biografia) Riguarda R 6000 1D (Restituito) Prestito E 6000 1I (Codice) + 1D (Data) Effettua R 6000 - Studente E 16.000 6c (Matricola) Professore E 200 16c (CF) Bibliotecario E 55 16c (CF) Utente G 16.255 30c + 1c (Nome) + 30c + 1c (Cognome) + 20c + 1c (Telefono) + 50c + 1c(Via) + 30c + 1c(Città) + 10c + 1c(Cap) + 30c + 1c(Stato) + 9c + 1c (Password) 62*550= 34 Kb 194*2200= 417 Kb 10*6000= 58 Bytes 11*6000= 65 Bytes 6*16000= 94 Kb 16*200= 3200 Bytes 16*55= 880 Bytes 217*16255= 3445 Kb

Tavola delle operazioni I = interattivo; B = Batch Operazioni Tipo Frequenza mensile Op. 1 Registrazione di un nuovo libro I 60 * 4 = 240 Op. 2 Ricerca disponibilità libro I 200 * 30 = 6000 Op. 3 Registrazione di un prestito I (1) 1089 * 30 = 32670 Op. 4 Restituzione di un libro I (1) 1089 * 30 = 32670 Op. 5 Consultazione prestiti I 100 * 30 = 3000 Op. 6 Visualizzazione dei prestiti scaduti. I 50 * 30 = 1500 (1) Analizzando un caso concreto di biblioteca abbiamo riscontrato che in 7 ore di attività (dalle 9.00 alle 11.00 e dalle 15.00 alle 16.00 [fascia di accesso bassa]) il numero di utenti in 30 minuti non supera mediamente le 5 persone. Per un totale di 3 ore abbiamo un totale di 30 persone. Mentre per la fascia di accesso alta (dalle ore 11.00 alle ore 15.00) abbiamo un totale di 168 persone, in quanto abbiamo 7 utenti ogni 10 minuti. 30 + 168 = 198 sono gli accessi giornalieri a una singola biblioteca. Moltiplicando il valore che ci siamo ricavati per il numero di biblioteche del nostro sistema abbiamo un totale di 2178 (198 * 11) accessi al giorno al sistema bibliotecario. Dato che in una biblioteca vengono effettuati prestiti e restituzioni, assumiamo che di 2178 accessi la metà siano prestiti e l altra metà restante Restituzioni (2178 / 2 = 1089) Calcolo accessi e costo operazioni S = scrittura [COSTO 2] L = lettura [COSTO 1] S/L = lettura e scrittura [COSTO 3] E = Entità R = Relazione Concetto Descrizione Costrutto Accessi Tipo Costo (mensile) OP.1 Registrazione di un nuovo libro Caso pessimo: L Autore e L Editore sono da catalogare Libro Registro nell entità libro i dati relativi a E 1 S Copia un nuovo libro. R 1 S Archivio Scrivo nella relazione Copia, scrivo E 1 S Appartiene nell entità Archivio, infine inserisco a R 1 S quale facoltà appartiene, registrando Scritti R Appartiene, senza passare per la lettura 1 S Autore di Facoltà ( in quanto la biblioteca che E 1 S/L Stampa da in prestito un libro gia conosce il R 1 S Editore codice, quindi non si rende necessario saperne il nome) E 1 S/L 2 + 2 + 2 + 2 + 2 + 3 + 2 + 3 = 18 18 * 240 = 4.320 Nel Caso pessimo registro l Editore e l Autore. OP.2 Ricerca disponibilità Libro (Questo tipo di ricerca avviene al di fuori della registrazione di un prestito)

Archivio Vediamo se il libro è disponibile, ma in E 1 L Appartiene quale facoltà è registrato? R 1 L Facoltà E 1 L Per sapere quante copie ci sono Copia R 1 L disponibili leggo Libro, Copia, Libro Archivio, Riguarda, e prestiti. E 1 L Riguarda Ciò si rende necessario in quanto le R 1 L Prestito Copie disponibili sono ottenute E 1 L sottraendo alle copie registrate in Archivio le copie ancora in prestito. 1 + 1 + 1 + 1 + 1 + 1 + 1 = 7 7 * 6000 = 42.000 OP. 3 Registrazione di un prestito Caso pessimo: L utente non è ancora stato catalogato Prestito Analizziamo il caso in cui l utente E 1 S Riguarda prende in prestito un libro gia R 1 S Effettua conoscendone il codscaffale, in quanto R 1 S Utente la ricerca del libro era avvenuta nella G 1 L/S precedente operazione (op. 2) Verranno coinvolte nella registrazione le relazioni Riguarda ed Effettua, e le entità Prestito e Utente (in quanto abbiamo considerato un caso pessimo) 2+2+2 + 3 = 9 (9 + 7 [op.2]) * 42460 = 679.360 OP. 4 Restituzione di un libro Archivio Per restituire un libro preso in prestito E 1 L Riguarda dobbiamo trovare il prestito effettuato R 1 S Prestito dall utente e con il relativo codscaffale. E 1 L Effettua Per poi memorizzare l attributo R 1 L Utente E 1 L OP. 5 Consultazione prestiti Utente Per consultare i prestiti relativi a un G 1 L Effettua utente, abbiano necessità di conoscere R 1 L Prestito tutti i prestiti che l utente ha effettuato. E 1 L Riguarda E visualizzare le copie prese in prestito. R 1 L Archivio E 1 L Copia R 1 L Libro E 1 L OP. 6 Visualizzazione dei prestiti scaduti Riguarda Se è decorso il tempo di restituzione del R 1 L Prestito libro il sistema effettua le seguenti E 1 L Effettua operazioni, legge i prestiti scaduti, cerca R 10 L Utente i relativi utenti ancora in possesso del G 1 L libro e ne visualizza i libri. Archivio E 1 L Copia R 1 L Libro E 1 L 1 + 2 + 1 = 4 4 * 42460 = 169.840 1 + 1 + 1 + 1 + 1 + 1 + 3 = 9 9 * 3000 = 27.000 1 + 1 + 10 + 1 + 1 + 1 + 1 = 7 7 * 1500 = 24.000

RISTRUTTURAZIONE Analisi delle ridondanze Era nato il problema di mettere un attributo ridondante per snellire la Ricerca della disponibilità di un libro, in questa sede possiamo analizzare la convenienza nell inserirlo. Disponibilità libro Archivio L 1 + 1 + 1 + 1 + 1 = 5 Appartiene L 5 * 6000 = 30.000 Facoltà L Copia L Libro L Registrazione di un prestito (caso pessimo: effettuo la registrazione dell utente) Archivio S 2 + 2 + 2 + 2 + 2 = 10 Riguarda S (10 + 7[op.2])* 42460 = Prestito S 721.820 Effettua S Utente S Restituzione di un libro Archivio S 2 + 2 + 1 +1+1= 7 Riguarda S 7 *42460 = 297.220 Prestito L Effettua L Utente L Attributo Ridondante NcopiePrestate Operazione Costo con ridondanza Costo senza ridondanza op.2. Ricerca disponibilità Libro 30.000 42.000 op.3. Registrazione di un prestito 721.820 679.360 op.4. Restituzione di un libro 297.220 169.840 1049.040 891.200 Non inseriamo l attributo ridondante Volume della Ridondanza: 1I = 4 Byte * 55.000 = 220.000 Byte = 215 KB.

Eliminazione delle generalizzazioni Per eliminare la generalizzazione possiamo scegliere uno dei seguenti metodi: Accorpamento delle figlie della generalizzazione nel padre: ciò comporta dei valori nulli, ma in compenso abbiamo meno relazioni, e quindi un tempo di accesso minore. Accorpamento del padre della generalizzazione nelle figlie: non abbiamo valori nulli, ma aumenta il numero di accessi al sistema Sostituzione delle generalizzazione con associazioni: quando una delle figlie non ha molto in comune si creano associazioni per ogni figlia. L Accorpamento delle figlie è stata la scelta più idonea per il nostro sistema, in quanto ci assicura un numero minore di accessi. La seguente immagine mostra la nuova entità Utente, a cui abbiamo aggiunto un nuovo attributo: tipo che ci permette di distinguere i diversi utenti del nostro sistema. Tipo è stato espresso come attributo semplice in quanto il numero di utenti rimane fisso nel tempo. Partizionamento / Accorpamento La relazione Biblioteca e Facoltà hanno entrambe un solo attributo quindi possono essere accorpate in una sola entità.

Eliminazione attributi composti Analizziamo le varie operazioni del nostro sistema, domandandoci in quali operazioni il campo indirizzo viene visto e ricercato. Op 1. nessuna ricerca e visita dell attributo indirizzo Op 2. nessuna ricerca e visita dell attributo indirizzo Op 3. l attributo indirizzo viene solo memorizzato nel caso in cui l utente entra per la prima volta nel sistema, ma non ci sono visite e ricerche. Op 4. nessuna ricerca e visita dell attributo indirizzo. Op 5. nessuna ricerca e visita dell attributo indirizzo. Op 6. L attributo viene visitato, ma non ricercato. Scelta delle chiavi In conclusione alla nostra analisi l attributo composto Indirizzo verrà memorizzato in una stringa, in quanto nessuna operazione del nostro sistema, effettua ricerche per indirizzo. Facoltà Abbiamo deciso di assegnare un nuovo attributo a Facoltà in quanto un codice è molto più leggero di un nome, infatti attraverso due char possiamo identificare le facoltà della nostra Basi di dati. Utente L utente non può avere come identificativo un codice non univoco quindi si è ritenuto neccessario aggiungere all entità un attributo Codice, in quanto l attributo matricola e CF in alcuni casi hanno valore nullo. Prestito Prestito verrà identificato tramite un codice progressivo. Archivio Archivio verrà identificato tramite un attributo chiave Codice. Libro Ogni libro verrà identificato univocamente dal proprio Codice (ISBN) Editore

Abbiamo aggiunto un attributo codice come chiave identificativa per 2 motivi: in quanto potrebbero esservi editori con il medesimo nome ed in quanto con la chiave identificativa Codice si risparmia in termini di occupazione di memoria nel database. Autore Nome e cognome dell Autore non possono essere la chiave dell entità in quanto ci possono essere autori con il medesimo nome quindi anche in questo caso si rende necessario inserire un codice.

4. TRADUZIONE VERSO IL MODELLO LOGICO Traduzione di entità e associazioni in relazioni Tab 1 Archivio (Codice, CodLibro, CodFacoltà, CodScaffale, Ncopie) Tab 2 Autore (Codice, Nome, DataNascita, LuogoNascita, Biografia) Tab 3 Editore (Codice, Citta) Tab 4- Facolta (Codice, Nome, Località) Tab 5 Libro (Codice, CodEditore, Titolo, Anno, Lingua) Tab 6 Prestito (Codice, CodUtente, CodArchivio, Data, Restituito) Tab 7 Scritti (Codice, CodLibro, CodAutore) Tab 8 Utente (Codice, Nome, Cognome, Indirizzo, Matricola, CF, Tipo, Password) Rappresentazione grafica Il seguente schema ci permette di rappresentare sia le relazioni con i relativi attributi, sia i vincoli di integrità referenziale esistenti tra le varie relazioni. Le chiavi sono rappresentate in grassetto, le frecce indicano vincoli di integrità referenziale e gli asterisci sugli attributi, possibili valori nulli. Normalizzazione 1nf 2nf 3nf bcnf 1 Si Si Si Si 2 Si[1] Si Si Si 3 Si Si Si Si 4 Si Si Si Si 5 Si Si Si Si 6 Si Si Si Si 7 Si si Si Si 8 Si[2] Si Si Si [1] Consideriamo l attributo nome, il in forma normale, in quanto non avvengoo ricerche, come per l attributo indirizzo per nome o cognome. [2] Consideriamo l attributo indirizzo in forma normale, in quanto non effettuando ricerche per via, città o cap, non si rende neccessario scomporlo ulteriormente.

Query di inserimento delle tabelle in MySql Di seguito le query di inserimento di tutte le tabelle nel database MySql: SET AUTOCOMMIT=0; START TRANSACTION; CREATE TABLE Archivio ( Codice INTEGER NOT NULL AUTO_INCREMENT, CodFacolta INTEGER NOT NULL, CodLibro CHARACTER (13) NOT NULL, Scaffale CHARACTER VARYING (10), NCopie NUMERIC (5) NOT NULL, PRIMARY KEY(Codice), FOREIGN KEY(CodFacolta) REFERENCES Facolta(Codice) ON UPDATE CASCADE ON DELETE SET NULL, FOREIGN KEY(CodLibro) REFERENCES Libro(Codice) ON UPDATE CASCADE ON DELETE SET NULL ) TYPE = InnoDB; CREATE TABLE Autore ( Codice INTEGER NOT NULL AUTO_INCREMENT, Nome CHARACTER VARYING (30), DataNascita DATE, LuogoNascita CHARACTER VARYING (30), Biografia LONGTEXT, PRIMARY KEY(Codice) ) TYPE = InnoDB; CREATE TABLE Editore ( Codice INTEGER NOT NULL AUTO_INCREMENT, Nome CHARACTER VARYING (30), PRIMARY KEY(Codice) ) TYPE = InnoDB; CREATE TABLE Facolta ( Codice INTEGER NOT NULL AUTO_INCREMENT, Nome CHARACTER VARYING (40) NOT NULL, PRIMARY KEY(Codice) ) TYPE = InnoDB; CREATE TABLE Libro ( Codice CHARACTER (13) NOT NULL, Titolo CHARACTER VARYING (50) NOT NULL, CodEditore INTEGER NOT NULL, Lingua CHARACTER VARYING (20) NOT NULL, Anno NUMERIC (4) NOT NULL, PRIMARY KEY(Codice), FOREIGN KEY(CodEditore) REFERENCES Editore(Codice) ON UPDATE CASCADE

ON DELETE SET NULL ) TYPE = InnoDB; CREATE TABLE Prestito ( Codice INTEGER NOT NULL AUTO_INCREMENT, CodUtente CHARACTER VARYING (20) NOT NULL, CodArchivio INTEGER NOT NULL, Data DATE NOT NULL, Restituito DATE, PRIMARY KEY(Codice), FOREIGN KEY(CodUtente) REFERENCES Utente(Codice) ON UPDATE CASCADE ON DELETE SET NULL, FOREIGN KEY(CodArchivio) REFERENCES Archivio(Codice) ON UPDATE CASCADE ON DELETE SET NULL ) TYPE = InnoDB; CREATE TABLE Scritti ( Codice INTEGER NOT NULL AUTO_INCREMENT, CodLibro CHARACTER (13) NOT NULL, CodAutore INTEGER NOT NULL, PRIMARY KEY(Codice), FOREIGN KEY(CodLibro) REFERENCES Libro(Codice) ON UPDATE CASCADE ON DELETE SET NULL, FOREIGN KEY(CodAutore) REFERENCES Autore(Codice) ON UPDATE CASCADE ON DELETE SET NULL ) TYPE = InnoDB; CREATE TABLE Utente ( Codice CHARACTER VARYING (20) NOT NULL, Password CHARACTER VARYING (20) NOT NULL, Tipo CHARACTER (1) NOT NULL, Nome CHARACTER VARYING (20) NOT NULL, Cognome CHARACTER VARYING (20) NOT NULL, Domicilio CHARACTER VARYING (40) NOT NULL, Matricola CHARACTER VARYING (20) NOT NULL, CF CHARACTER VARYING (20) NOT NULL, PRIMARY KEY(Codice) ) TYPE = InnoDB; COMMIT;

Query relative alle operazioni principali OPERAZIONE Registrazione libro Registrazione autore Registrazione autori di un libro Registrazione del libro nell archivio Ricerca disponibilità di un libro Registrazione nuovo prestito Registrazione restituzione libro Consultazione di tutti i prestiti da parte del bibliotecario Consultazione dei propri prestiti da parte di uno studente o professore QUERY MYSQL INSERT INTO Libro (Codice, NomeEditore, Titolo, Lingua, Anno) VALUES ('<isbn>', '<titolo>', '<lingua>', '<anno>'); INSERT INTO Autore (Codice, Nome, DataNascita, LuogoNascita, Biografia) VALUES (<codice>, '<nome>', <data_nascita>, '<luogo_nascita>', '<biografi>') INSERT INTO Scritti(CodLibro, CodAutore) VALUES ('<isbn>', '<codice_autore>'); INSERT INTO Archivio (Codice, CodFacolta, CodLibro, Scaffale, ncopie) VALUES ('<codice>', '<facolta>', '<isbn>', '<scaffale>', '<copie>'; SELECT Titolo, Archivio.Codice AS CodArch, Libro.Codice AS CodISBN, Editore.Nome AS Editore, Anno, Lingua, Facolta.Nome AS Facolta, Archivio.nCopie - Count(Prestito.Data) + Count(Prestito.Restituito) AS Disponibilita FROM Libro, Archivio, Facolta, Editore LEFT JOIN Prestito ON Prestito.CodArchivio = Archivio.Codice WHERE Archivio.CodLibro = Libro.Codice AND Archivio.CodFacolta = Facolta.Codice AND Editore.Codice = Libro.CodEditore AND " & query &" GROUP BY CodArch; INSERT INTO Prestito (Codice, CodUtente, CodArchivio, Data, Restituito) VALUES ('', '<nome_utente>', '<codice_archivio>', CURRENT_DATE, NULL); UPDATE Prestito SET Restituito = CURRENT_DATE WHERE CodArchivio = '<codice_archivio>' AND Restituito IS NULL AND CodUtente = '<codice_utente>'; SELECT Archivio.Codice AS CodArchivio, Utente.Codice, Utente.Nome, Utente.Cognome, Titolo, Libro.Codice AS CodISBN, NomeEditore AS Editore, Anno, Data, Restituito FROM Utente, Prestito, Libro, Archivio WHERE Utente.Codice = Prestito.CodUtente AND Archivio.CodLibro = Libro.Codice AND Prestito.CodArchivio = Archivio.Codice AND <query_di_ricerca> ORDER BY Restituito; SELECT Titolo, CodISBN, NomeEditore AS Editore, Anno, Data, Restituito FROM Utente, Prestito, Libro, Archivio WHERE Utente.Codice = Prestito.CodUtente AND Archivio.CodLibro = Libro.CodISBN AND Prestito.CodArchivio = Archivio.Codice AND Utente.Codice = '<nome_utente>'; Queste sono solo alcune delle query utilizzate. Per una comprensione completa di tutte le query e del loro funzionamento si rimanda all implementazione.

5. PROGETTAZIONE FISICA Consideriamo l op. 2 La ricerca di un libro che è la più onerosa delle altre. Tabella delle pagine 4 KB 1) La tabella Libri sarà letta sequenzialmente quindi con un costo NP LIBRO RecordSize = 89 Bytes NT = 11000 NP = 240 2) Avendo un b + -tree con un occupazione delle foglie pari all 80% e con g = 2. Libro - Archivio fattore di filtraggio di 1/2 Prestiti - Archivio fattore di filtraggio 1/10 quindi il fattore di filtro complessivo è 1/20 delle tuple restituite. PRESTITO RecordSize = 49 Bytes NT = 6000 NP = 73 NL = (6000*240)/(4096*0,80) = 439 h = 1 + [log 5 439] = 5 CA Prestito = 5 + 439/20 + f(6000/20, 73) = 5 + 21,95 + 72 = 97.95

6. IMPLEMENTAZIONE Per l implementazione abbiamo usato come linguaggio di programmazione il linguaggio ASP. Come database abbiamo utilizzato MySql di Aruba.it Anche se tale database non è configurato per tabelle InnoDB, il codice è progettato per tali tabelle. In particolare si fa uso intensivo di transazioni e lock per le quali sarebbe ottimale InnoDB. Non ci siamo limitati ad una semplice implementazione del sistema informativo, lo abbiamo realizzato in tutti gli aspetti per simulare efficacemente la biblioteca universitaria da noi progettata. E possibile accedere al database presso: http://mysql.aruba.it Nome Utente: Sql70822 Password: nel file loggati.asp Il progetto funzionante è disponibile presso: http://www.urbinoweb.net Si consiglia la visualizzazione con Internet Explorer, Mozilla Firefox o Mozilla. Per accedere come studente utilizzare i seguenti login: nome utente: ute1 password: arcobaleno nome utente: ute2 password: arcobaleno Per accedere come bibliotecario utilizzare il seguente login: nome utente: biblo password: infinito Se si desidera invece eseguire il debug del sito (ottenendo la visualizzazione delle query nella pagina, ed evitando il messaggio di errore standard in caso di errori) utilizzare il seguente login: nome utente: debug password: debug Nota: ha gli stessi privilegi di un bibliotecario, ma non è un utente registrato nel database. Di seguito discutiamo brevemente l implementazione, in particolare esaminando gli aspetti più interessanti. Per una comprensione più approfondita rimandiamo ad i listati (che sono commentati e acclusi alla presente relazione) e disponibili anche nel loro formato originale nel cd-rom consegnato. La base dati è stata popolata con i seguenti libri: GDI+ Programming in C# and VB.NET, editore APress, autore Nick Symmonds, 2002, Inglese Design Patterns, editore Addison-Wesley, autori Gamma, Helm, Johnson, Vlissides, 2002, Italiano Essere Digitali, editore Sperling Paperback, autore Nicholas Negroponte, 1999, Italiano Reti di Calcolatori, editore Prentice Hall, autore Andrei S. Tanenbaum, 2003, Italiano Guida a SQL, editore McGraw-Hill, autori Daniela Dorbolò, Andrea Guidi, 1999, Italiano

Navigazione dell interfaccia Una volta giunti alla home page, per procedere oltre è necessario effettuare il login. Come già visto bibliotecari, da un lato, e studenti o professori, dall altro, hanno diversi privilegi. Per effettuare il login basta ciccare su login o in alternativa scegliere una qualsiasi sezione. Se non si è loggiati verrà infatti chiesto automaticamente di fare il login. Una volta loggiato il bibliotecario può - Inserire un nuovo libro - Modificare un libro esistente - Controllare la disponibilità di un libro - Controllare i prestiti effettuati e restituiti

Inserimento di un nuovo libro Basta cliccare su N.Libro e compilare i dati relativi al libro. Il libro verrà automaticamente inserito e con esso verranno registrati anche gli Autori, l Editore, la lingua e l anno di edizione. Verrà poi chiesto quante copie si vogliono registrare, in quale facoltà e in quale scaffale verranno inserite.

Modificare un libro esistente Ciccando su Modif. Libro si accede ad una pagina nella quale viene chiesto il codice ISBN del libro da modificare. Nella pagina successiva è possibile modificare tutti i dati relativi al libro. Controllare la disponibilità di un libro Ciccando su Disponibilità è possibile ricercare la disponibilità di uno o più libri. E possibile ricercare per editore, titolo e codice ISBN. La ricerca è esatta se si specifica il codice ISBN e non esatta se si specifica editore e/o titolo. Per esempio è possibile ricercare reti ed ottenere il libro Reti di Calcolatori. Per ogni libro trovato viene inoltre visualizzata la disponibilità. Per prendere in prestito un libro è sufficiente ciccare sul collegamento ipertestuale posto nel codice ISBN di ogni libro e poi specificare chi prende il libro in prestito.

Se il nome utente di colui che prende il prestito non esiste, verrà visualizzato un messaggio di errore. Controllare i prestiti effettuati e restituiti Ciccando su Prestiti è possibile ricercare i prestiti effettuati e/o restituiti. Per ogni prestito è indicato chi ha effettuato il prestito, quando e quando ha restituito il libro. Basta cliccare sul collegamento ipertestuale relativo per registrare la restituzione di un prestito. A differenza di un bibliotecario, uno studente o un professore non può registrare o modificare libri, inoltre può gestire solo i propri prestiti.

Listato: controllo_area_riservata.inc <% If Session("Nome") <> "debug" Then On Error Resume Next Response.Expires = -1500 'Fa in modo che la pagina non sia ricaricabile dalla cache del browser (per questioni di coerenza) Const TIPO_STUDENTE = 1 Const TIPO_PROFESSORE = 2 Const TIPO_BIBLIOTECARIO = 3 If Session("Loggato") <> "Loggato" Then Response.Redirect("login.asp") If CInt(Session("Tipo")) <> TIPO_BIBLIOTECARIO Then Response.Redirect("area_riservata.asp") Sub EsaminaErroriMySql() If Session("Nome") <> "debug" Then If Err.Number <> 0 Then Err.Clear: Response.Redirect("errore.asp") End Sub Sub FaiQueryMySql(sql, conn, rs) If Session("Nome") = "debug" Then Response.Write sql & "<br><br>" 'Mostra le query in caso di Debug rs.open sql, conn, 3, 3 EsaminaErroriMySql End Sub %> Listato: controllo_login.inc <% If Session("Nome") <> "debug" Then On Error Resume Next Const TIPO_STUDENTE = 1 Const TIPO_PROFESSORE = 2 Const TIPO_BIBLIOTECARIO = 3 If Session("Loggato") <> "Loggato" Then Response.Redirect("login.asp") Sub EsaminaErroriMySql() If Session("Nome") <> "debug" Then If Err.Number <> 0 Then Err.Clear: Response.Redirect("errore.asp") End Sub Sub FaiQueryMySql(sql, conn, rs) If Session("Nome") = "debug" Then Response.Write sql & "<br><br>" 'Mostra le query in caso di Debug rs.open sql, conn, 3, 3 EsaminaErroriMySql End Sub %>

Listato: su.inc <center> <p><img src="../images/logo.jpg" width="759" height="136" border="0" align="center" usemap="#map"> <map name="map"> <area shape="rect" coords="36,60,80,75" href="index.asp"> <area shape="rect" coords="111,59,158,77" href="login.asp"> <area shape="rect" coords="479,85,568,100" href="disponibilita.asp"> <area shape="rect" coords="573,86,625,101" href="prestiti.asp"> <area shape="rect" coords="630,86,676,100" href="libri.asp"> <area shape="rect" coords="678,87,752,99" href="modifica.asp"> </map> </p> </center> Listato: giu.inc <center> <img src="../images/sotto.jpg" width="751" height="18" border="0"> </center>

Listato: index.asp <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>urbinoweb.net - Home</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <link href="css/general.css" rel="stylesheet" type="text/css"> </head> <body leftmargin="0" topmargin="0"> <table width="761" border="0" align="center" cellpadding="0" cellspacing="0"> <td><!-- #include File= "inc/su.inc" --></td> <td><table width="751" height="0" border="0" align="center" cellpadding="0" cellspacing="0" bordercolor="#000000"> <td width="761" bordercolor="#ffffff" bgcolor="#d5d5ec"> <p align="center"> </p> <h1 align="center">benvenuto nella Home Page della Libreria Centralizzata dell'università di Urbino</h1> <p align="center"><img src="images/urbino.jpg" width="550" height="413" border="1"></p> <h2 align="center">per accedere alle sezioni effettua prima il login</h2> </td> <td><!-- #include File= "inc/giu.inc" --></td> </td> </body> </html>

Listato: login.asp <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>urbinoweb.net - Login</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <link href="css/general.css" rel="stylesheet" type="text/css"> </head> <body leftmargin="0" topmargin="0"> <table width="761" border="0" align="center" cellpadding="0" cellspacing="0"> <td><!-- #include File= "inc/su.inc" --></td> <td><table width="751" height="0" border="0" align="center" cellpadding="0" cellspacing="0" bordercolor="#000000"> <td width="761" bordercolor="#ffffff" bgcolor="#d5d5ec"> <p align="center"> <script language="javascript" type="text/javascript"> var visto; function Vedi(quale) { uscita = "a"; if (quale == "" quale=="http://") { uscita = "e"; } return uscita; } function Vedi2(quale) { uscita = "a"; if (quale == "No" quale=="") { uscita = "i"; } return uscita; } function Send(a1, a2) { visto="a"; if (Vedi(a1)=="e") { visto="e" } if (Vedi(a2)=="e") { visto="e" } if (visto=="e") { alert("attenzione: devi specificare un nome utente ed una password."); } if (visto=="a") { document.formulario.submit(); } } </script> </p> <p align="center"><img src="images/lucchetto.gif" width="80" height="80"> </p> <h1 align="center">inserisci username e password per fare il login:</h1> <form name="formulario" method="post" action="loggati.asp"> <table width="300" border="0" align="center"> <td align="right" valign="middle"> <font size="2" face="tahoma, Verdana">Username:</font></td> <td valign="middle"> <input name="user" type="text" id="user"></td>

<td align="right" valign="middle"> <font size="2" face="tahoma, Verdana">Password:</font></td> <td valign="middle"> <input name="pass" type="password" id="pass"></td> <p align="center"> <input name="login" onclick="javascript:send(user.value, pass.value);" type="button" id="login" value="login"> </p> </form> <h3 align="center"> </h3> </td> <td><!-- #include File= "inc/giu.inc" --></td> </td> </body> </html>

Listato: loggati.asp <% Dim conn, rs, sql 'Variabili per la connessione a MySql Dim User, Pass Dim ServerIP, ServerPort, ServerID, ServerData, ServerPass, Stringa Dim UserTrovato, TipoTrovato 'La funzione EsaminaErroriMySql è riscritta in quanto in questa pagina non vi è nessun include che la richiamasse Sub EsaminaErroriMySql 'If Err.Number <> 0 Then Err.Clear: Response.Redirect("errore.asp") End Sub User = Request.Form("user") Pass = Request.Form("pass") 'Dati di connessione al database ServerIP = "62.149.150.37" ServerPort = "3306" ServerID = "Sql70822" ServerData = "_1" ServerPass = "fc78813e" Stringa = "server=" & ServerIP & ";port=" & ServerPort & ";uid=" & ServerID &";pwd="& ServerPass &";database=" & ServerID & ServerData &";OPTION=16387" If User = "" or Pass = "" Then Response.Redirect("login.asp") Set conn = Server.CreateObject("ADODB.Connection") conn.open "driver={mysql};" & Stringa Set rs = Server.CreateObject("ADODB.Recordset") 'Verifica se l'utente esiste sql = "SELECT Codice, Tipo FROM Utente WHERE Codice = '" & User & "' AND Password = '" & Pass & "';" rs.open sql, conn, 3, 3 EsaminaErroriMySql If rs.eof = false Then rs.movefirst UserTrovato = rs.fields("codice") TipoTrovato = rs.fields("tipo") End If rs.close conn.close If LCase(User) = "debug" And LCase(Pass) = "debug" Then UserTrovato = "debug" 'Se nome utente e password sono corretti fa il login e registra le variabili di sessione if UserTrovato <> "" Then Session("StringaConnessione") = Stringa Session("Loggato") = "Loggato" Session("Nome") = UserTrovato 'Registra il nome utente in una variabile di sessione Session("Tipo") = TipoTrovato 'Registra il tipo utente in una variabile di sessione If UserTrovato = "debug" Then Session("Tipo") = 3 'Privilegi come fosse un bibliotecario End If %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>urbinoweb.net - Login</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <link href="css/general.css" rel="stylesheet" type="text/css"> </head> <body leftmargin="0" topmargin="0">

<table width="761" border="0" align="center" cellpadding="0" cellspacing="0"> <td><!-- #include File= "inc/su.inc" --></td> <td><table width="751" height="0" border="0" align="center" cellpadding="0" cellspacing="0" bordercolor="#000000"> <td width="761" bordercolor="#ffffff" bgcolor="#d5d5ec"> <p align="center"> </p> <p align="center"><img src="images/esclamativo.gif" width="70" height="70"></p> <h1 align="center">login effettuato con successo!</h1> <h2 align="center">seleziona ora la sezione a cui voi accedere dal menù in alto</h2> </td> <td><!-- #include File= "inc/giu.inc" --></td> </td> </body> </html> <% Else %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>urbinoweb.net - Login</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <link href="css/general.css" rel="stylesheet" type="text/css"> </head> <body leftmargin="0" topmargin="0"> <table width="761" border="0" align="center" cellpadding="0" cellspacing="0"> <td><!-- #include File= "inc/su.inc" --></td> <td><table width="751" height="0" border="0" align="center" cellpadding="0" cellspacing="0" bordercolor="#000000"> <td width="761" bordercolor="#ffffff" bgcolor="#d5d5ec"> <p align="center"> </p> <h1 align="center"> </h1> <h1 align="center"><img src="images/errore.gif" width="70" height="70"></h1> <h1 align="center">attenzione: Nome utente o password errati</h1> <h3 align="center"><a href="login.asp">clicca qui per ritornare al login</a></h3> <h1 align="center"> </h1> </td> <td><!-- #include File= "inc/giu.inc" --></td> </td> </body> </html> <% End If %> Listato: libri.asp

<!-- #include File= "inc/controllo_area_riservata.inc" --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>urbinoweb.net - Libri</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <link href="css/general.css" rel="stylesheet" type="text/css"> </head> <script language="javascript" type="text/javascript"> // Funzione Javascript per il controllo dei dati function Send() { if (formulario.titolo.value == "" formulario.isbn.value == "" formulario.editore.value == "" formulario.autori.value == "" formulario.autori.lingua == "" formulario.anno.value == "") alert("attenzione: Devi compilare tutti i campi."); else document.formulario.submit(); } </script> <body leftmargin="0" topmargin="0"> <table width="761" border="0" align="center" cellpadding="0" cellspacing="0"> <td><!-- #include File= "inc/su.inc" --></td> <td><table width="751" height="0" border="0" align="center" cellpadding="0" cellspacing="0" bordercolor="#000000"> <td width="761" bordercolor="#ffffff" bgcolor="#d5d5ec"> <p align="center"> </p> <h1 align="center">inserimento NUOVO LIBRO</h1> <h2 align="center">da questa pagina puoi inserire un nuovo libro</h2> <form name="formulario" method="post" action="libri2.asp"> <table width="300" border="0" align="center"> <td align="right" valign="middle"> <font size="2" face="tahoma, Verdana">Titolo:</font></td> <td valign="middle"> <input name="titolo" type="text" id="titolo"></td> <td align="right" valign="middle"><font size="2" face="tahoma, Verdana">Codice ISBN:</font></td> <td valign="middle"><input name="isbn" type="text" id="isbn"></td> <td align="right" valign="middle"><font size="2" face="tahoma, Verdana">Editore:</font></td> <td valign="middle"><input name="editore" type="text" id="editore"></td> <td align="right" valign="middle"><font size="2" face="tahoma, Verdana">Autori:</font></td> <td valign="middle"> <input name="autori" type="text" id="autori"><font size="2" face="tahoma, Verdana"> <strong>*</strong></font></td> <td align="right" valign="middle"><font size="2" face="tahoma, Verdana">Lingua:</font></td> <td valign="middle"><input name="lingua" type="text" id="lingua"></td>

<td align="right" valign="middle"><font size="2" face="tahoma, Verdana">Anno:</font></td> <td valign="middle"><input name="anno" type="text" id="anno"></td> <td align="right" valign="middle"> </td> <td valign="middle"> </td> <p align="center"> <input name="inserisci" onclick="javascript:send();" type="button" id="inserisci" value="inserisci"> </p> </form> <h2 align="center"><strong>*</strong> Separa i nomi e cognomi degli autori con una virgola. Es.: Daniela Dorbolò, Andrea Guidi</h2> </td> <td><!-- #include File= "inc/giu.inc" --></td> </td> </body> </html> Listato: libri2.asp <!-- #include File= "inc/controllo_area_riservata.inc" -->

<% Dim Autore() Dim Facolta(50) Dim NumAutori Dim NumFacolta Dim CodiceAutore Dim conn, rs, sql 'Variabili per la connessione a MySql Dim ciclo 'Variabile per il ciclo Dim inizio 'Divide l'unica stringa Autori in più stringhe, ognuna contenente un autore. Es. "Gino Rossi, Marco Rossi" -> "Gino Rossi" e "Marco Rossi" NumAutori = 1 Autori = Request.Form("Autori") For ciclo = 1 To Len(Autori) If Mid(Autori, ciclo, 1) = "," Then NumAutori = NumAutori + 1 Next ReDim Autore(NumAutori) NumAutori = -1 inizio = 1 For ciclo = 1 To Len(Autori) If Mid(Autori, ciclo, 1) = "," Then NumAutori = NumAutori + 1 Autore(NumAutori) = Trim(Mid(Autori, inizio, ciclo - inizio)) inizio = ciclo + 1 End If Next NumAutori = NumAutori + 1 Autore(NumAutori) = Trim(Mid(Autori, Inizio, Len(Autori) - Inizio + 1)) '---------------------------------------------------------------------- Set conn = Server.CreateObject("ADODB.Connection") conn.open "driver={mysql};" & Session("StringaConnessione") Set rs = Server.CreateObject("ADODB.Recordset") FaiQueryMySql "START TRANSACTION;", conn, rs FaiQueryMySql "SELECT Codice AS CodISBN FROM Libro WHERE Codice = '" & Request.Form("ISBN") & "';", conn, rs If rs.eof = false Then 'Se il libro è già registrato non fa nulla rs.close Else 'Altrimenti lo registra rs.close FaiQueryMySql "SELECT Codice FROM Editore WHERE Nome = '" & Request.Form("Editore") & "';", conn, rs If rs.eof = false Then rs.movefirst CodiceEditore = rs.fields("codice") End if rs.close If CodiceEditore = "" Then FaiQueryMySql "INSERT INTO Editore (Codice, Nome) VALUES ('', '" & Request.Form("Editore") & "');", conn, rs FaiQueryMySql "SELECT Codice FROM Editore WHERE Nome = '" & Request.Form("Editore") & "';", conn, rs rs.movefirst CodiceEditore = rs.fields("codice") rs.close End If FaiQueryMySql "INSERT INTO Libro (Codice, CodEditore, Titolo, Lingua, Anno) VALUES ('" & Request.Form("ISBN") & "', " & CodiceEditore & ", '" & Request.Form("Titolo") & "', '" & Request.Form("Lingua") & "', '" & Request.Form("Anno") & "');", conn, rs

For ciclo = 0 to NumAutori 'Registrando anche gli autori relativi FaiQueryMySql "SELECT Codice FROM Autore WHERE Nome = '" & Autore(ciclo) & "';", conn, rs If rs.eof = false Then rs.movefirst CodiceAutore = rs.fields("codice") rs.close Else rs.close FaiQueryMySql "INSERT INTO Autore (Codice, Nome, DataNascita, LuogoNascita, Biografia) VALUES ('', '" & Autore(ciclo) & "', NULL, NULL, NULL)", conn, rs FaiQueryMySql "SELECT Codice FROM Autore WHERE Nome = '" & Autore(ciclo) & "';", conn, rs rs.movefirst CodiceAutore=rs.Fields("Codice") rs.close End If FaiQueryMySql "INSERT INTO Scritti(CodLibro, CodAutore) VALUES ('" & Request.Form("ISBN") & "', " & CodiceAutore & ");", conn, rs Next End If FaiQueryMySql "COMMIT;", conn, rs 'La seguente è una transazione scorrelata dalla prima che serve a reperire i nomi di tutte le facoltà FaiQueryMySql "SELECT Nome FROM Facolta", conn, rs NumFacolta = 0 If rs.eof = false Then rs.movefirst Do Until rs.eof = true NumFacolta = NumFacolta + 1 Facolta(NumFacolta) = rs.fields("nome") rs.movenext Loop rs.close End If conn.close Set rs = Nothing Set conn = Nothing %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>urbinoweb.net - Libri</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <link href="css/general.css" rel="stylesheet" type="text/css"> </head> <body leftmargin="0" topmargin="0"> <table width="761" border="0" align="center" cellpadding="0" cellspacing="0"> <td><!-- #include File= "inc/su.inc" --></td> <td><table width="751" height="0" border="0" align="center" cellpadding="0" cellspacing="0" bordercolor="#000000"> <td width="761" bordercolor="#ffffff" bgcolor="#d5d5ec"> <p align="center"> </p> <h1 align="center">libro CORRETTAMENTE REGISTRATO</h1> <h2 align="center">compila i seguenti campi, per registrare il numero di nuove copie per la facoltà</h2> <form name="formulario" method="post" action="libri3.asp"> <input type="hidden" name="isbn" value="<%=request.form("isbn")%>">

<table width="478" border="0" align="center"> <td align="right" valign="middle"><font size="2" face="tahoma, Verdana">Titolo Libro (codice ISBN):</font></td> <td valign="middle"><font size="2" face="arial, Helvetica, sansserif"><strong> <%=Request.Form("Titolo")%> (<%=Request.Form("ISBN")%>)</strong></font></td> <td width="216" align="right" valign="middle"> <font size="2" face="tahoma, Verdana">Facoltà:</font></td> <td width="252" valign="middle"> <select name="facolta"> <% for ciclo = 0 to NumFacolta %> <option value = "<%=ciclo%>"><%=facolta(ciclo)%></option> <% next %> </select></td> <td align="right" valign="middle"> <font size="2" face="tahoma, Verdana">Scaffale:</font></td> <td valign="middle"> <input name="scaffale" type="text" id="scaffale" size="40"></td> <td align="right" valign="middle"><font size="2" face="tahoma, Verdana">Numero Copie:</font></td> <td valign="middle"><input name="copie" type="text" id="copie" size="40"></td> <p align="center"> <input name="registra" type="submit" id="registra" value="registra"> </p> </form> </td> <td><!-- #include File= "inc/giu.inc" --></td> </td> </body> </html>

Listato: libri3.asp <!-- #include File= "inc/controllo_area_riservata.inc" --> <% Dim conn, rs, sql 'Variabili per la connessione a MySql Set conn = Server.CreateObject("ADODB.Connection") conn.open "driver={mysql};" & Session("StringaConnessione") Set rs = Server.CreateObject("ADODB.Recordset") FaiQueryMySql "INSERT INTO Archivio (Codice, CodFacolta, CodLibro, Scaffale, ncopie) VALUES ('', " & Request.Form("Facolta") & ", '" & Request.Form("ISBN") & "', '" & Request.Form("Scaffale") & "', " & Request.Form("Copie") & ");", conn, rs conn.close Set rs = Nothing Set conn = Nothing %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>urbinoweb.net - Libri</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <link href="css/general.css" rel="stylesheet" type="text/css"> </head> <body leftmargin="0" topmargin="0"> <table width="761" border="0" align="center" cellpadding="0" cellspacing="0"> <td><!-- #include File= "inc/su.inc" --></td> <td><table width="751" height="0" border="0" align="center" cellpadding="0" cellspacing="0" bordercolor="#000000"> <td width="761" bordercolor="#ffffff" bgcolor="#d5d5ec"> <p align="center"> </p> <p align="center"><img src="images/esclamativo.gif" width="70" height="70"></p> <h1 align="center">registrazione ESEGUITA CON SUCCESSO</h1> <h2 align="center"> </h2> </td> <td><!-- #include File= "inc/giu.inc" --></td> </td> </body> </html>

Listato: modifica.asp <!-- #include File= "inc/controllo_area_riservata.inc" --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>urbinoweb.net - Modifica</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <link href="css/general.css" rel="stylesheet" type="text/css"> </head> <script language="javascript" type="text/javascript"> // Funzione Javascript per il controllo dei dati function Send() { if (formulario.isbn.value == "") alert("attenzione: Devi compilare il campo."); else document.formulario.submit(); } </script> <body leftmargin="0" topmargin="0"> <table width="761" border="0" align="center" cellpadding="0" cellspacing="0"> <td><!-- #include File= "inc/su.inc" --></td> <td><table width="751" height="0" border="0" align="center" cellpadding="0" cellspacing="0" bordercolor="#000000"> <td width="761" bordercolor="#ffffff" bgcolor="#d5d5ec"> <p align="center"> </p> <h1 align="center">modifica LIBRO</h1> <h2 align="center">da questa pagina puoi modificare un libro. Come prima cosa specifica il codice ISBN:</h2> <form name="formulario" method="post" action="modifica2.asp"> <table width="300" border="0" align="center"> <td align="right" valign="middle"><font size="2" face="tahoma, Verdana">Codice ISBN:</font></td> <td valign="middle"><input name="isbn" type="text" id="isbn"></td> <td align="right" valign="middle"> </td> <td valign="middle"> </td> <p align="center"> <input name="modifica" onclick="javascript:send();" type="button" id="modifica" value="modifica"> </p> </form> </td> <td><!-- #include File= "inc/giu.inc" --></td> </td> </body> </html>

Listato: modifica2.asp <!-- #include File= "inc/controllo_area_riservata.inc" --> <% Dim conn, rs, sql 'Variabili per la connessione a MySql Dim Titolo, Editore, Autori, Anno, Lingua Set conn = Server.CreateObject("ADODB.Connection") conn.open "driver={mysql};" & Session("StringaConnessione") Set rs = Server.CreateObject("ADODB.Recordset") FaiQueryMySql "LOCK TABLES Libro READ, Scritti READ, Autore READ, Editore READ;", conn, rs FaiQueryMySql "SELECT Titolo, Editore.Nome AS Editore, Anno, Lingua FROM Libro, Editore WHERE Libro.CodEditore = Editore.Codice AND Libro.Codice = '" & Request.Form("ISBN") & "';", conn, rs If rs.eof = false Then rs.movefirst Titolo = rs.fields("titolo") Editore = rs.fields("editore") Anno = rs.fields("anno") Lingua = rs.fields("lingua") End If rs.close FaiQueryMySql "SELECT Autore.Nome AS Autore FROM Scritti, Autore WHERE Scritti.CodLibro = '" & Request.Form("ISBN") & "' AND Scritti.CodAutore = Autore.Codice", conn, rs If rs.eof = false Then rs.movefirst Do Until rs.eof = true If Autori = "" Then Autori = rs.fields("autore") Else Autori = Autori & ", " & rs.fields("autore") Loop End If rs.close End If rs.movenext FaiQueryMySql "UNLOCK TABLES;", conn, rs conn.close set rs = Nothing set conn = Nothing %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>urbinoweb.net - Modifica</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <link href="css/general.css" rel="stylesheet" type="text/css"> </head> <script language="javascript" type="text/javascript"> // Funzione Javascript per il controllo dei dati function Send() { if (formulario.titolo.value == "" formulario.editore.value == "" formulario.autori.value == "" formulario.autori.lingua == "" formulario.anno.value == "") alert("attenzione: Devi compilare tutti i campi."); else document.formulario.submit(); } </script>