Realizzazione di una base di dati per la gestione delle valutazioni di progetti di ricerca
1. UNIVERSITÀ DEGLI STUDI DI TRIESTE
DIPARTIMENTO DI INGEGNERIA ED ARCHITETTURA
CORSO DI LAUREA TRIENNALE IN INGEGNERIA DELL'INFORMAZIONE
CURRICULUM INFORMATICA
REALIZZAZIONE DI UNA BASE DI DATI PER LA GESTIONE
DELLE VALUTAZIONI DI PROGETTI DI RICERCA
Laureando: Relatore:
EFREM VENTURUZZO CHIAR.MO PROF. MAURIZIO FERMEGLIA
ANNO ACCADEMICO 2011/2012
2. INDICE DEI CONTENUTI
CAPITOLO 1 INTRODUZIONE 4
CAPITOLO 2 ANALISI 6
2.1 Intervista al committente 6
2.2 Analisi del sistema 6
2.3 Analisi dettagliata del caso d’uso del tesista 10
2.4 Analisi del caso d’uso Upload Valutazione 11
CAPITOLO 3 PROGETTAZIONE 12
3.1 Progettazione del Database 12
3.2 Progettazione della Web Application 15
3.2.1 Progettazione inserimento progetti 15
3.2.2 Progettazione upload valutazioni 17
3.2.3 Struttura finale 18
CAPITOLO 4 REALIZZAZIONE 19
4.1 Realizzazione Database 19
4.2 Realizzazione Web Application 22
4.2.1 Data Binding 22
2
3. 4.2.2 Login 22
4.2.3 Nuovo Progetto 24
4.2.4 Keywords 27
4.2.5 Upload main document 29
4.2.6 Upload supplementary document 32
4.2.7 Riepilogo Dati 36
4.2.8 Upload valutazioni 39
CAPITOLO 5 CONCLUSIONI 43
BIBLIOGRAFIA 44
3
4. CAPITOLO 1
Introduzione
Lo scopo di questa tesi è la creazione di una base di dati e di un’applicazione web per la gestione
dei progetti di ricerca e delle relative valutazioni.
In particolare si vuole fornire al tesista la capacità di inserire i dati relativi al proprio progetto e di
effettuare l’upload dei relativi documenti e ai revisori la possibilità di gestire l’upload delle
valutazioni dei progetti che hanno accettato di revisionare.
Il sistema è stato progettato per un utilizzo da parte dell’ambiente universitario.
Nei capitoli successivi si mostrerà in dettaglio come è stato implementato il sistema:
Nel capitolo dedicato all’analisi si tratteranno gli argomenti relativi all’analisi dei requisiti,
della situazione iniziale e di definire le basi di un sistema informativo che sarà, una volta
completato, più ampio e completo di quello realizzato;
In progettazione si esamineranno:
o gli schemi relativi al database e la documentazione associata;
o la struttura dell’applicazione web;
Infine nel capitolo realizzazione si vedrà il codice dell’applicazione web in dettaglio.
In questa tesi si userà il termine generico “progetto” per indicare svariate tipologie di progetto
come tesi, tesi di dottorato, progetti di ricerca.
La creazione di questo sistema è stata motivata dalla necessità di amministrare in maniera più
semplice e completa le diverse fasi che portano alla valutazione dei progetti dal punto di vista dei
tesisti, dei revisori e da quello dell’editore.
I vincoli progettuali sono rappresentati dall’utilizzo delle tecnologie .NET, del linguaggio di
programmazione C# e del linguaggio di markup HTML5.
4
5. Per la realizzazione del database è stato richiesto di usare SQL Server 2008 per garantire la
massima compatibilità, in quanto questo è già usato all’interno dell’ambiente come data base
management system.
Tutti i moduli software di questo documento sono stati sviluppati dall’autore.
Gli obiettivi della realizzazione sono:
Analizzare i requisiti da parte del committente;
Analizzare la struttura del sistema informativo;
Analizzare e progettare la base dati;
Studiare le tecnologie .NET, ASP.NET, C#, e HTML5;
Studiare le iterazioni fra base dati ed applicazione;
Realizzare il database;
Implementare i casi d’uso del tesista;
Implementare il caso d’uso “Upload valutazione” del revisore.
5
6. CAPITOLO 2
Analisi
2.1 Intervista al committente
La prima fondamentale informazione che deriva dall’intervista è la mancanza di un sistema
preesistente da implementare. Perciò si dovrà creare il sistema dall’origine.
Le richieste del committente sono:
Realizzazione di una base dati
Realizzazione di un’applicazione web che permetta ai tesisti di inserire i dati relativi ai
propri progetti nella base dati e l’upload dei documenti;
Realizzazione di un’applicazione web che permetta ai revisori di compiere operazioni quali
decidere se accettare o rifiutare un progetto, effettuare il download dei documenti da
revisionare e gestire l’upload delle valutazioni.
Il committente svolgerà il ruolo di editore-amministratore ed accederà ai dati direttamente
con l’ausilio di software come Microsoft Access.
Tutti i dati relativi ai tesisti ed agli editori vengono precedentemente caricati dall’editore
stesso.
2.2 Analisi del sistema
Gli attori fondamentali del sistema sono tre:
Tesista;
Editore;
Revisore.
6
7. Sistema
Tesista Web Application Database
Revisore
Editore
Il tesista accederà al sistema esclusivamente per inserire i dati del proprio progetto ed i relativi
documenti.
Inserisci Progetto
Tesista
Il revisore compie invece diverse azioni:
1. Accetta o rifiuta una revisione: a seguito della sua assegnazione da parte dell’editore ad
un progetto da revisionare può decidere se accettare il compito o rifiutare;
2. Download documenti: per ogni progetto accettato deve poter effettuare il download
dei relativi documenti in un qualsiasi momento;
3. Upload della valutazione.
accetta/rifiuta
revisione
download documenti
da revisionare
Revisore Upload valutazione
I casi d’uso dell’editore sono vari, in particolar modo si mettono in risalto i principali come:
7
8. 1. Visualizzare i dati per evento: ogni progetto ha una data di consegna, di scadenza di
revisione e di scadenza finale. Tali date variano in base all’evento/tipologia di progetto
specifico;
2. Assegnare revisore al progetto;
3. Elaborare valutazioni: accedere ai documenti delle valutazioni per esprimere il giudizio
finale.
Visualizza
Progetti per Evento
assegna revisore a
progetto
Editore Elabora Valutazioni
Si ricorda che l’editore funge anche da amministratore e ha accesso diretto ai dati. Ciò comporta,
in prima analisi, una non necessità d’implementazione dei relativi casi d’uso attraverso
applicazioni dedicate. In un secondo momento si potrà passare alla realizzazione di strumenti atti
a supportare le attività dell’editore.
Il diagramma delle attività del sistema è il seguente:
FASE 1: è la fase dedicata al Tesista, il quale, dopo aver inserito i dati del nuovo progetto, non
compie altre azioni.
FASE 2: l’editore visualizza i progetti in scadenza, richiede una lista dei revisori, anche in base a
certi specifici parametri, ed assegna ai revisori i progetti.
FASE 3: Il revisore valuta se accettare o rifiutare un progetto ed eventualmente effettua l’upload
della valutazione.
8
9. TESISTA AMMINISTRATORE REVISORE DATABASE
FASE 1
CARICAMENTO DATI PROGETTO
INSERISCI PROGETTO
FASE 2
RICHIESTA PROGETTI IN SCADENZA
TORNA LISTA PROGETTI IN SCADENZA
VISUALIZZA PROGETTI
RICHIESTA REVISORI
TORNA LISTA REVISORI
VISUALIZZA REVISORI
ASSEGNA REVISORE A PROGETTO
CAMBIA STATO REVISORE
FASE 3
ACCETTA PROGETTO?
SI NO
CAMBIA STATO REVISORE
CAMBIA STATO REVISORE
RICHIESTA PROGETTO
RESTITUISCI PROGETTO
COMPILAZIONE VALUTAZIONE
INSERISCI VALUTAZIONE
9
10. 2.3 Analisi dettagliata del caso d’uso del tesista
Il principale caso d’uso è quello che porta all’inserimento di un nuovo progetto da parte del
tesista.
Il diagramma di sequenza mette in risalto le quattro attività principali:
1. Effettuare il login;
2. Inserire i dati caratteristici di un progetto;
3. Eseguire l’upload dei documenti;
4. Realizzare il controllo finale su tutti i dati e confermare gli stessi.
Tesista Sistema
Login-Nome Utente e password
Visualizza pagina inserimento dati progetto
Dati progetto
Visualizza pagina upload documenti
Upload documenti
Visualizza pagina riepilogo
Conferma dati
Visualizza HomePage
10
11. 2.4 Analisi del caso d’uso Upload Valutazione
Uno dei casi d’uso del revisore è quello relativo all’upload delle valutazioni.
Il revisore deve accedere al sistema con le proprie credenziali, specificare un progetto di
riferimento ed effettuare l’upload della corrispettiva valutazione.
Revisore Sistema
Login-Nome Utente e password
Visualizza pagina inserimento valutazione
Upload Valutazione
Conferma avvenuta operazione
Come parte di questa tesi si è realizzato il caso d’uso del tesista e quello relativo all’upload della
valutazione da parte del revisore.
11
12. CAPITOLO 3
Progettazione
3.1 Progettazione del Database
In seguito alle informazioni ricavate con l’intervista al committente ed all’analisi delle stesse, è
stato redatto lo schema concettuale.
I vincoli non esprimibili sono:
Entità “Tipo evento”: “data fine” deve essere maggiore o uguale a “data inizio”;
Entità “Tipo evento”: “scadenza revisione” deve essere maggiore o uguale a “data fine”;
Entità “Tipo evento”: “scadenza “deve essere maggiore o uguale a “scadenza revisione”;
Si mette in evidenza l’analisi dei principali elementi appartenenti allo schema concettuale
PROGETTO
Id Progetto Identificatore univoco numerico del progetto
Titolo Titolo del progetto
Supervisore Supervisore del progetto
Sommario Essenziale sommario dei capitoli
TIPO EVENTO
Id Evento Identificatore univoco numerico dell'evento
Nome Nome dell'evento
Data Inizio Data iniziale di possibile consegna dei progetti
Data Fine Data ultima di consegna dei progetti
Scadenza Revisione Data ultima di consegna valutazioni da parte dei revisori
Scadenza Data ultima di completamento iter di valutazione del progetto
12
13. DOCUMENTO
Id Documento Identificatore univoco numerico del documento
Documento Titolo del documento con estensione
Tipo del documento: main document(obbligatorio e unico) o supplementary(facoltativo e
Tipo Documento
può essere più di uno)
REVISORE
Id Revisore Identificatore univoco numerico del revisore
Nome Nome revisore
Cognome Cognome revisore
Telefono Recapito telefonico del revisore
Email Indirizzo email del revisore
Credenziali Credenziali d'accesso del revisore composte da nome utente e password
TESISTA
Id Tesista Identificatore univoco numerico del tesista
Nome Nome tesista
Cognome Cognome tesista
Credenziali Credenziali d'accesso del revisore composte da nome utente e password
VALUTAZIONE
è il collegamento tra l'entità progetto con l'entità revisore
MOLTI A MOLTI: un progetto ha tipicamente più valutazioni fornite da diversi
CARDINALITÀ
revisori; i revisori valutano più progetti
STATO Stato dell'associazione fra progetto e revisore
VALUTAZIONE Titolo del documento con estensione
13
15. I dati di carico evidenziano una quantità stimata di 300 progetti all’anno, per ognuno dei quali ci si
aspetta all’incirca 3 valutazioni, per un totale di 900 valutazioni. Considerando una media
sovrastimata di 3 documenti per progetto ci si aspetta 900 documenti annui. Ad ogni progetto si
associano 5 keyword, scelte da una lista di 50 elementi, per un totale di 1500 coppie progetto-
parola. Ci si aspetta un centinaio di revisori, mentre le entità che completano le caratteristiche del
progetto si attestano attorno a qualche decina di elementi.
Il totale dei volumi è quindi molto modesto per un DBMS come sql server 2008, progettato per
gestire centinai di migliaia di record; non è quindi necessaria alcuna modifica dello schema a fini
prestazionali.
3.2 Progettazione della Web Application
3.2.1 Progettazione inserimento progetti
Con riferimento all’analisi del caso d’uso del tesista (capitolo 2.3), è stata progettata una struttura
a cinque livelli:
LOGIN
INSERIMENTO
DATI
UPLOAD MAIN
DOCUMENT
INSERIMENTO
KEYWORDS
UPLOAD
SUPPLEMENTARY
UPLOAD DOCUMENT
DOCUMENTI
RIEPILOGO
Il livello “upload documenti” è suddiviso in due parti in modo da facilitare la distinzione fra i due
tipi di documento previsti in fase di analisi.
15
16. Per quanto riguarda i singoli elementi si è preso spunto da un software in uso al committente,
ScholarOne Manuscripts v4.10.0. La struttura è sostanzialmente la medesima ed i campi richiesti
dal software sono essenzialmente gli stessi richiesti dall’applicazione web in progetto.
Inserimento dati
Tutti gli attributi del progetto verranno inseriti da un unico form: titolo, supervisore, sommario,
tipo progetto, evento, ERC, area. Non sono d’interesse per l’applicazione i campi Special Issue e
Copyright.
Inserimento keywords
16
17. La seconda videata sarà simile a quella del software in esame.
Upload documenti
L’upload del main document, documento obbligatorio ed unico, viene diviso da quelli di possibili
altri documenti al fine di ridurre il rischio di errori in upload da parte dell’utente.
3.2.2 Progettazione upload valutazioni
Anche il revisore dovrà accedere attraverso una pagina di login prima di poter gestire le
valutazioni.
17
18. LOGIN
UPLOAD
VALUTAZIONE
Il revisore dovrà solamente definire di quale progetto ha effettuato la revisione e selezionare il file
di cui fare l’upload.
3.2.3 Struttura finale
LOGIN
INSERIMENTO UPLOAD
DATI VALUTAZIONE
INSERIMENTO
KEYWORDS
UPLOAD MAIN
DOCUMENT
UPLOAD
SUPPLEMENTARY
DOCUMENT
RIEPILOGO
18
19. CAPITOLO 4
Realizzazione
4.1 Realizzazione Database
Il database che è stato realizzato è composto da diciassette tabelle, quattro viste e cinque stored
procedure.
Le viste che sono state implementate sono:
ViewParola: visualizza il codice identificativo dei progetti e le parole associate ordinate per
Id di progetto crescente. La vista è implementata sulle tabelle TblParola e TblKeyword;
ViewProgettoDati: mostra tutti i dati di tutti i progetti presenti nella TblProgetto,
sostituendo le chiavi esterne numeriche con i rispettivi valori riferiti, ed il loro stato. Oltre
alla già citata TblProgetto, riporta dati delle TblArea, TblERC, TblTipoEvento, TblTipo,
TblStato e TblStatoProgetto;
ViewRevisoreTOT: visualizza i dati dei revisori, escluso le loro credenziali. Si riferisce alla
TblRevisore ed è utile per accedere facilmente ai recapiti dei revisori;
ViewStatoProgetto: mostra Id progetto, titolo del progetto ed il rispettivo stato progetto.
Rappresenta informazioni appartenenti a TblProgetto,TblStatoProgetto e TblStato.
Le stored procedure:
Sp_NuovoProgetto: permette l’inserimento di una nuova riga nella TblProgetto attraverso
il passaggio di alcuni parametri;
Exec Sp_NuovoProgetto @titolo='progettazione di una base dati per una palestra',
@supervisore='marco fetto', @area=1, @erc=1, @tipoprogetto=2, @evento=6,
@sommario='1)introduzione 2)progettazione 3)realizzazione'
StatoAccettaProgettoDaValutare e StatoRifiutaProgettoDaValutare settano lo stato della
valutazione rispettivamente a 2 ed a 3, pari ad accettato ed a rifiutato, prendendo come
input gli identificatori del progetto e del revisore a cui si riferiscono;
Exec StatoAccettaProgettoDaValutare @Progetto=34, @Revisore=5
19
20. TitoloDaIdProgetto: visualizza tutti i dati presenti nella TblProgetto per il progetto avente
come Id quello inserito come input;
Exec TitoloDaIdProgetto 4
Sp_Evento: mostra tutti i progetti che fanno parte di uno specifico evento passato come
parametro d’input.
USE [GestioneProgetti]
GO
create Procedure [dbo].[Sp_Evento]
@evento int
AS
Select * FROM [dbo].[TblProgetto]
WHERE Evento=@evento
GO
EXEC SP_Evento X
É stato implementato il cascade delete per l’entità tesista, revisore e progetto al fine di
semplificare la gestione ed il mantenimento dei dati.
Il diagramma descrive la struttura della base dati, le chiavi primarie e le chiavi esterne.
20
22. 4.2 Realizzazione Web Application
4.2.1 Data Binding
Lo scambio di dati fra l’applicazione e il database avviene con l’utilizzo di una connessione definita
dalla stringa:
<add name="GestioneProgettiConnectionString" connectionString="Data Source=name_server
;Initial Catalog=GestioneProgetti;Integrated Security=True; MultipleActiveResultSets=True;
Application Name=EntityFramework" providerName="System.Data.SqlClient" />
Quando il sistema verrà installato nell’ambiente in cui dovrà operare sarà necessario modificare
questa stringa con i parametri adeguati.
4.2.2 Login
22
23. Si è realizzata un’unica pagina di login divisa in due parti, la parte superiore dedica ai tesisti e
quella inferiore ai revisori.
Nel caso in cui le credenziali siano errate una stringa di testo notificherà l’errore.
In entrambi i casi l’interfaccia e l’implementazione sono le medesime. Vi sono due textbox per
l’inserimento dei propri dati, una label per stampare a video l’eventuale stringa d’errore ed un
bottone per far eseguire le operazioni.
protected void Button1_Click(object sender, EventArgs e)
Si definisce e si esegue una select sulla tabella contenente le credenziali dell’attore di riferimento.
SqlCommand CheckTes = new SqlCommand("select IdTesista from TblTesista where
NomeUtente=@user AND Password=@Pass",connection1);
CheckTes.Parameters.AddWithValue("user", TextBox1.Text);
CheckTes.Parameters.AddWithValue("pass", TextBox2.Text);
connection1.Open();
SqlDataReader rd = CheckTes.ExecuteReader();
Il risultato viene memorizzato in un data reader; se questo è vuoto vuol dire che non vi è alcuna
corrispondenza per le credenziali inserite, altrimenti viene letto il valore contenuto che
corrisponde proprio all’id dell’utente. In quest’ultimo caso si effettua la redirect alla pagina
successiva e si passa il numero identificativo.
if(rd.HasRows)
{
rd.Read();
rd.Close();
String IdTes = (String)CheckTes.ExecuteScalar();
Response.Redirect("NewProgetto.aspx?IDT="+IdTes);
}
else
{
Label1.Text="Username e/o Password errate";
}
connection1.Close();
Il passaggio dell’identificatore dell’utente avviene mediante l’espressione url?variabile=valore
23
24. 4.2.3 Nuovo Progetto
Il tesista può ora compilare questa web page composta da tre textbox, un bottone e quattro
dropdowlist. Una volta inseriti i dati sarà sufficiente cliccare su “CONTINUA” per proseguire.
La prima operazione compiuta è il popolamento delle dropdownlist.
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
DDL1();
DDL2();
DDL3();
DDL4();
}
}
Il popolamento di ognuno di questi quattro elementi avviene nel medesimo modo: si effettua una
select nella tabella di riferimento ed il risultato viene assegnato ad un data reader; il data reader
diventa la sorgente dati della dropdownlist.
24
25. Si noti come DropDownList1NP.DataTextField indichi l’elemento che verrà visualizzato
nell’interfaccia, mentre DropDownList1NP.DataValueField esprime il valore associato alla stringa
mostrata.
protected void DDL1()
{
SqlConnection connection1 = new SqlConnection();
connection1.ConnectionString = "Data Source=EMXOR;Initial
Catalog=GestioneProgetti;Integrated Security=True;MultipleActiveResultSets=True;Application
Name=EntityFramework" + "providerName=System.Data.SqlClient";
SqlCommand cmdArea = new SqlCommand("SELECT * FROM [TblArea]",connection1);
connection1.Open();
SqlDataReader dr;
dr = cmdArea.ExecuteReader();
DropDownList1NP.DataSource = dr;
DropDownList1NP.DataValueField = "IdArea";
DropDownList1NP.DataTextField = "Area";
DropDownList1NP.DataBind();
DropDownList1NP.Items.Insert(0, new ListItem("seleziona area", "-1"));
connection1.Close();
cmdArea.Dispose();
}
Cliccando il bottone viene eseguita una operazione d’insert nella TblProgetto utilizzando come
parametri i dati inseriti nei vari campi e, successivamente, esegue la funzione IDP.
protected void Button1NP_Click(object sender, EventArgs e)
{
SqlConnection connection5 = new SqlConnection();
connection5.ConnectionString = "Data Source=EMXOR;Initial
Catalog=GestioneProgetti;Integrated Security=True;MultipleActiveResultSets=True;Application
Name=EntityFramework" + "providerName=System.Data.SqlClient";
SqlCommand NewProgetto = new SqlCommand("Insert into TblProgetto (Titolo,
Supervisore, Area, ERC, TipoProgetto,Evento,Sommario) VALUES (@t ,@sup, @area,
@ERC,@TP,@Ev,@Som)", connection5);
NewProgetto.Parameters.AddWithValue("area", DropDownList1NP.Text);
NewProgetto.Parameters.AddWithValue("t", TextBox1NP.Text);
NewProgetto.Parameters.AddWithValue("sup", TextBox2NP.Text);
NewProgetto.Parameters.AddWithValue("Som", TextBox3NP.Text);
NewProgetto.Parameters.AddWithValue("ERC", DropDownList2NP.Text);
NewProgetto.Parameters.AddWithValue("TP", DropDownList3NP.Text);
NewProgetto.Parameters.AddWithValue("Ev", DropDownList4NP.Text);
connection5.Open();
NewProgetto.ExecuteNonQuery();
connection5.Close();
IDP();
}
25
26. In seguito all’operazione d’insert, viene creata una nuova riga di cui non si conosce il valore della
chiave primaria.
Per individuare questo valore è stata sviluppata la funzione IDP:
protected void IDP()
{
SqlConnection connection6 = new SqlConnection();
connection6.ConnectionString = "Data Source=EMXOR;Initial
Catalog=GestioneProgetti;Integrated Security=True;MultipleActiveResultSets=True;Application
Name=EntityFramework" + "providerName=System.Data.SqlClient";
SqlCommand IdProg = new SqlCommand("Select IdProgetto from TblProgetto where
(titolo like @t AND Area=@area AND Supervisore like @sup AND Sommario like @Som AND ERC=@ERC
AND TipoProgetto=@TP AND Evento=@Ev) ORDER BY IdProgetto DESC", connection6);
IdProg.Parameters.AddWithValue("t", TextBox1NP.Text);
IdProg.Parameters.AddWithValue("area", DropDownList1NP.Text);
IdProg.Parameters.AddWithValue("sup", TextBox2NP.Text);
IdProg.Parameters.AddWithValue("Som", TextBox3NP.Text);
IdProg.Parameters.AddWithValue("ERC", DropDownList2NP.Text);
IdProg.Parameters.AddWithValue("TP", DropDownList3NP.Text);
IdProg.Parameters.AddWithValue("Ev", DropDownList4NP.Text);
connection6.Open();
Int32 Id = (Int32)IdProg.ExecuteScalar();
connection6.Close();
String IDT = Request.QueryString["IDT"];
Response.Redirect("KeywordPage.aspx?IDT=" + IDT + "&IDP=" + Id);
}
La funzione select sfrutta i parametri ancora presenti negli elementi dell’interfaccia per
identificare la riga corrispondente a quella appena inserita.
È importante notare come la risposta non sia per forza un unico elemento, potrebbe contenere
anche più di un codice identificativo. Ciò può accadere a seguito di un tentativo fallito in
precedenza dell’utente di inserire il medesimo progetto, se infatti un guasto non dovesse
permettere all’utente di concludere tutte le operazioni necessarie per definire un progetto, come
ad esempio l’inserimento dei documenti, dovrà ricompilare il form provocando un doppione nella
base dati. Per ovviare a questo problema si ordinano gli elementi della select in maniera
decrescente e si considera solo il primo elemento, così da restituire sempre l’ultimo Id.
Infine viene eseguita una redirect avente come parametri i codici identificativi relativi al tesista e al
progetto.
26
27. 4.2.4 Keywords
L’interfaccia contiene due etichette che mettono in evidenza i codici del tesista e del progetto.
L’utente selezionerà le parole chiave d’interesse e poi proseguirà con un click su “inserisci”.
protected void Page_Load(object sender, EventArgs e)
{
if(!Page.IsPostBack)
{ DDL1K();
DDL2K();
DDL3K();
DDL4K();
DDL5K();
}
String IDT = Request.QueryString["IDT"];
String IDP = Request.QueryString["IDP"];
Label1.Text = IDT;
Label2.Text = IDP;
}
Il popolamento delle dropdownlist avviene come in precedenza ed è uguale per tutte e cinque.
protected void DDL1K()
{
SqlConnection connection11 = new SqlConnection();
27
28. connection11.ConnectionString = "Data Source=EMXOR;Initial
Catalog=GestioneProgetti;Integrated Security=True;MultipleActiveResultSets=True;Application
Name=EntityFramework" + "providerName=System.Data.SqlClient";
SqlCommand cmdKW = new SqlCommand("SELECT * FROM [TblKeyword]", connection11);
connection11.Open();
SqlDataReader dr;
dr = cmdKW.ExecuteReader();
DropDownList1K.DataSource = dr;
DropDownList1K.DataValueField = "IdWord";
DropDownList1K.DataTextField = "Parola";
DropDownList1K.DataBind();
DropDownList1K.Items.Insert(0,new ListItem("scegli una parola","-1"));
connection11.Close();
cmdKW.Dispose();
}
Allo scopo di ridurre la possibilità di errori è stato deciso di implementare l’inserimento dei dati
con un’insert per ogni dropdownlist. A fini prestazionali questa decisione non è significativamente
dannosa, infatti gli accessi avvengono in ogni caso in numero modesto, solo cinque, e su una
quantità di campi estremamente limitata, appena due. Vi è inoltre un’istruzione if per assicurarsi
che siano state selezionate cinque parole diverse.
protected void Button1_Click(object sender, EventArgs e)
{
if(DropDownList1K.Text!=DropDownList2K.Text &&
DropDownList1K.Text!=DropDownList3K.Text && DropDownList1K.Text!=DropDownList4K.Text
&& DropDownList1K.Text!=DropDownList5K.Text &&
DropDownList2K.Text!=DropDownList3K.Text && DropDownList2K.Text!=DropDownList4K.Text
&& DropDownList2K.Text!=DropDownList5K.Text &&
DropDownList3K.Text!=DropDownList4K.Text && DropDownList3K.Text!=DropDownList5K.Text
&& DropDownList4K.Text!=DropDownList5K.Text)
{
SqlConnection connection1 = new SqlConnection();
connection1.ConnectionString = "Data Source=EMXOR;Initial
Catalog=GestioneProgetti;Integrated Security=True;MultipleActiveResultSets=True;Application
Name=EntityFramework" + "providerName=System.Data.SqlClient";
SqlCommand CmdParola = new SqlCommand("INSERT INTO TblParola(Progetto, KeyWord)
VALUES (@IDP,@KW)", connection1);
CmdParola.Parameters.AddWithValue("IDP", Label2.Text);
CmdParola.Parameters.AddWithValue("KW", DropDownList1K.Text);
connection1.Open();
CmdParola.ExecuteNonQuery();
connection1.Close();
.
.
.
28
29. Response.Redirect("UploadDoc.aspx?IDT=" + Label1.Text + "&IDP=" + Label2.Text);
}
Si può ora accedere alla sezione di upload documenti.
4.2.5 Upload main document
Le operazioni che devono essere compiute al momento dell’upload documenti sono due:
L’inserimento dell’associazione progetto-documento sulla base dati;
L’upload effettivo del documento sul server.
L’interfaccia è composta da due label per gli identificatori, un’etichetta per un messaggio d’errore,
nel caso in cui si tentasse di effettuare un upload senza indicare alcun file, un bottone di upload ed
un elemento di input file.
Il relativo codice HTML è contenuto nel file UploadDoc.aspx ed è qui riportato.
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="UploadDoc.aspx.cs"
Inherits="WebGestioneProgetti.UploadDoc" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>GESTIONEPROGETTI-UPLOADDOC</title>
<style type="text/css">
#File1 {
width: 328px;
}
.auto-style1 {
color: #FF0000;
}
</style>
</head>
<body style="height: 618px">
<form id="Form2" method="post" enctype="multipart/form-data" runat="server">
<h1 class="auto-style1">DOCUMENTI</h1>
<div style="height: 524px">
IDTesista:
29
30. <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
IDProgetto:
<asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
<br />
<br />
<br />
MAIN DOCUMENT: <input type="file" id="File1" name="File1" runat="server"
/>
<input type="submit" id="Submit1" value="UPLOAD" runat="server" name="Submit1"/><br />
<br />
<br />
<asp:Label ID="Label3" runat="server"></asp:Label>
</div>
</form>
</body>
</html>
Una volta selezionato il file è possibile premere il bottone “UPLOAD”. Si eseguirà così il seguente
codice C#:
public partial class UploadDoc : System.Web.UI.Page
{
protected System.Web.UI.HtmlControls.HtmlInputFile File1;
protected System.Web.UI.HtmlControls.HtmlInputButton Submit1;
protected void Page_Load(object sender, EventArgs e)
{
String IDT = Request.QueryString["IDT"];
String IDP = Request.QueryString["IDP"];
Label1.Text = IDT;
Label2.Text = IDP;
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
30
32. }
La prima parte si occupa di definire il contenuto delle due label e di inizializzare gli elementi che
serviranno per eseguire le operazioni richieste.
La parte centrale, private void Submit1_ServerClick(object sender, System.EventArgs e), dopo il
controllo sull’esistenza o meno di un file selezionato, si occupa dell’effettivo upload del file nel
web server dell’applicazione, più precisamente in una cartella denominata “MAINDOC”.
È importante evidenziare che il nome del file viene modificato.
Il nuovo nome sarà costituito dall’id del progetto, seguito dalla sigla MD (Main Document) ed
infine dal nome originale del file. Tale accorgimento serve per evitare la possibile sovrascrittura di
documenti e per rendere più facile l’associazione degli stessi ai relativi progetti.
Dopo aver inserito il file nel server viene chiamata la funzione UPDB che aggiornerà la base dati.
La parte finale esegue un’insert nella tabella TblDocumento: inserisce il nome del file nella colonna
“doc” e setta il tipo al valore corrispondente a main document della TblTipoDoc.
4.2.6 Upload supplementary document
I supplementary document sono documenti non obbligatori che completano il documento
principale del progetto e possono essere tipicamente anche più d’uno.
Con i documenti supplementari si conclude la fase di inserimento dati da parte dell’utente, si
definisce il legame di autore fra tesista e progetto e si assegna lo stato progetto.
32
33. La struttura dell’interfaccia è molto simile a quella dedicata al documento principale, ma si
differenzia per la presenza di due diversi bottoni.
“UPLOAD” effettua l’aggiornamento della TblDocumento ed il caricamento dei file nel server.
Non contiene alcuna redirect in quanto è necessario permettere l’upload di un numero di file
superiore ad uno.
Infatti dopo l’upload del primo file si notifica il successo dell’operazione e si offre la possibilità di
ripetere l’operazione.
33
34. Anche in quest’occasione i file cambiano nome con l’aggiunta alla denominazione originale del
numero identificativo di progetto e del suffisso SD (Supplementary Document). Questo tipo di file
saranno salvati nel folder “SUPPLEMENTARYDOC”.
public partial class UploadSupDoc : System.Web.UI.Page
{
protected System.Web.UI.HtmlControls.HtmlInputFile File1;
protected System.Web.UI.HtmlControls.HtmlInputButton Submit1;
protected void Page_Load(object sender, EventArgs e)
{
String IDT = Request.QueryString["IDT"];
String IDP = Request.QueryString["IDP"];
Label1.Text = IDT;
Label2.Text = IDP;
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
this.Submit1.ServerClick += new System.EventHandler(this.Submit1_ServerClick);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void Submit1_ServerClick(object sender, System.EventArgs e)
{
if ((File1.PostedFile != null) && (File1.PostedFile.ContentLength > 0))
{
string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);
fn = Label2.Text + "SD" + fn;
string SaveLocation = Server.MapPath("SUPPLEMENTARYDOC") + "" + fn;
try
{
34
35. File1.PostedFile.SaveAs(SaveLocation);
//aggiorna il DB
UPDB();
Label3.Text = "Documento inserito";
}
catch (Exception ex)
{
Label3.Text = "Error: " + ex.Message;
}
}
else
{
Label3.Text = "Seleziona un file";
}
}
protected void FINE(object sender, EventArgs e)
{
//Assegna progetto-Tesista a TblAutore; stato progetto diventa "inserito non
assegnato" in TblStato; Redirect
SqlConnection connection1 = new SqlConnection();
connection1.ConnectionString = "Data Source=EMXOR;Initial
Catalog=GestioneProgetti;Integrated Security=True;MultipleActiveResultSets=True;Application
Name=EntityFramework" + "providerName=System.Data.SqlClient";
SqlCommand Aut = new SqlCommand("Insert into TblAutore(progetto,tesista) Values
(@pr ,@Tes)", connection1);
Aut.Parameters.AddWithValue("pr", Label2.Text);
Aut.Parameters.AddWithValue("Tes", Label1.Text);
SqlCommand StPr = new SqlCommand("Insert into TblStato (progetto,avanzamento)
Values (@prog ,1)", connection1);
StPr.Parameters.AddWithValue("prog", Label2.Text);
try
{
connection1.Open();
Aut.ExecuteNonQuery();
StPr.ExecuteNonQuery();
connection1.Close();
}
catch (Exception ex)
{
Label3.Text = "Error: " + ex.Message;
}
Response.Redirect("DatiProg.aspx?IDT=" + Label1.Text + "&IDP=" + Label2.Text);
}
protected void UPDB()
{
SqlConnection connection1 = new SqlConnection();
connection1.ConnectionString = "Data Source=EMXOR;Initial
Catalog=GestioneProgetti;Integrated Security=True;MultipleActiveResultSets=True;Application
Name=EntityFramework" + "providerName=System.Data.SqlClient";
string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);
string NameSupp = Label2.Text + "SD" + fn;
SqlCommand InS1Doc = new SqlCommand("Insert into TblDocumento(progetto,tipo,doc)
Values (@pr ,2 , @doc)", connection1);
InS1Doc.Parameters.AddWithValue("pr", Label2.Text);
InS1Doc.Parameters.AddWithValue("doc", NameSupp);
35
36. try
{
connection1.Open();
InS1Doc.ExecuteNonQuery();
connection1.Close();
}
catch (Exception ex)
{
Label3.Text = "Error: " + ex.Message;
}
}
}
Con il tasto “FINE” si dà avvio a due insert, nella TblAutore e nella TblStato, per poi passare
all’ultima schermata dedicata al tesista.
4.2.7 Riepilogo Dati
Questa pagina web ha lo scopo di riepilogare all’utente tutti i dati che ha inserito, in modo da
verificarli ed eventualmente eliminare il progetto e ripetere tutte le operazioni.
I dati vengono rappresentati con l’ausilio di tre gridview. Il tasto “HOME” riporta l’utente alla
pagina di login, mentre “ELIMINA”, oltre a cancellare tutto ciò che riguarda il progetto, ridireziona
il tesista alla pagina “Nuovo Progetto”.
36
37. Le gridview vengono popolate da delle select su due viste e su una tabella.
protected void Page_Load(object sender, EventArgs e)
{
String IDT = Request.QueryString["IDT"];
String IDP = Request.QueryString["IDP"];
Label1.Text = IDT;
Label2.Text = IDP;
SqlConnection connection1 = new SqlConnection();
connection1.ConnectionString = "Data Source=EMXOR;Initial
Catalog=GestioneProgetti;Integrated Security=True;MultipleActiveResultSets=True;Application
Name=EntityFramework" + "providerName=System.Data.SqlClient";
SqlCommand DatiPro = new SqlCommand("select * from ViewProgettoDati where
IdProgetto=@IDP", connection1);
DatiPro.Parameters.AddWithValue("IDP", Label2.Text);
SqlCommand Parole = new SqlCommand("select Parola from ViewParola where
Progetto=@IDP", connection1);
Parole.Parameters.AddWithValue("IDP", Label2.Text);
SqlCommand DocIns = new SqlCommand("select DOC from TblDocumento where
Progetto=@IDP", connection1);
DocIns.Parameters.AddWithValue("IDP", Label2.Text);
connection1.Open();
//carica dati su GridView1
SqlDataReader rd = DatiPro.ExecuteReader();
GridView1.DataSource = rd;
GridView1.DataBind();
rd.Dispose();
//carica dati su GridView2
SqlDataReader rp = Parole.ExecuteReader();
GridView2.DataSource = rp;
GridView2.DataBind();
rp.Dispose();
//carica dati su GridView3
SqlDataReader rdoc = DocIns.ExecuteReader();
GridView3.DataSource = rdoc;
GridView3.DataBind();
rdoc.Dispose();
connection1.Close();
}
Il tasto “HOME”
protected void Button1_Click(object sender, EventArgs e)
{
Response.Redirect("Login.aspx");
}
L’elemento “ELIMINA” deve cancellare i file memorizzati ed eliminare tutti i dati relativi al
progetto dalla base dati.
Si utilizza una select sulla TblDocumento per estrarre i nomi dei documenti relativi ad un progetto.
I documenti sono in folder diversi, uno in MAINDOC ed uno, più d’uno o nessuno in
SUPPLEMENTARYDOC.
37
38. In ogni caso il primo documento estratto dalla select sarà un maindoc, i successivi saranno di
eventuali file aggiuntivi.
Sulla base dati agirà una semplice operazione di delete.
protected void Button2_Click(object sender, EventArgs e)
{
SqlConnection connection = new SqlConnection();
connection.ConnectionString = "Data Source=EMXOR;Initial
Catalog=GestioneProgetti;Integrated Security=True;MultipleActiveResultSets=True;Application
Name=EntityFramework" + "providerName=System.Data.SqlClient";
//elimina documento sul server
SqlCommand DocIns = new SqlCommand("select DOC from TblDocumento where
Progetto=@IDP", connection);
DocIns.Parameters.AddWithValue("IDP", Label2.Text);
connection.Open();
SqlDataReader rdoc = DocIns.ExecuteReader();
rdoc.Read();
string name = rdoc.GetString(0);
string Fpath = Server.MapPath("MAINDOC") + "" + name;
File.Delete(Fpath);
while (rdoc.Read())
{
name= rdoc.GetString(0);
Fpath = Server.MapPath("SUPPLEMENTARYDOC") + "" + name;
File.Delete(Fpath);
}
connection.Close();
//elimina progetto dal database
SqlCommand DeletePr = new SqlCommand("DELETE FROM TblProgetto where
IdProgetto=@IDP", connection);
DeletePr.Parameters.AddWithValue("IDP", Label2.Text);
connection.Open();
DeletePr.ExecuteNonQuery();
connection.Close();
Response.Redirect("NewProgetto.aspx?IDT="+Label1.Text);
}
38
39. 4.2.8 Upload valutazioni
Il revisore, dopo aver effettuato il login, accede alla schermata di upload delle valutazioni.
Il codice identificativo del revisore è inserito automaticamente a seguito dell’operazione di login.
protected void Button2_Click(object sender, EventArgs e)
{
SqlConnection connection2 = new SqlConnection();
connection2.ConnectionString = "Data Source=EMXOR;Initial
Catalog=GestioneProgetti;Integrated Security=True;MultipleActiveResultSets=True;Application
Name=EntityFramework" + "providerName=System.Data.SqlClient";
SqlCommand CheckRVS = new SqlCommand("select Revisore from TblCredenzialiRVS
where NomeUtente=@user AND Password=@Pass",connection2);
CheckRVS.Parameters.AddWithValue("user", TextBox3.Text);
CheckRVS.Parameters.AddWithValue("pass", TextBox4.Text);
connection2.Open();
SqlDataReader RV= CheckRVS.ExecuteReader();
if(RV.HasRows)
{
RV.Read();
RV.Close();
Int32 IdRVS = (Int32) CheckRVS.ExecuteScalar();
Response.Redirect("UploadValutazione.aspx?IDR="+IdRVS);
}
else
{
Label2.Text="Username e/o Password errate";
}
connection2.Close();
}
39
40. Il revisore deve indicare l’id del progetto di cui inserirà la valutazione e selezionare il file,
dopodiché sarà sufficiente cliccare “UPLOAD”.
Il documento, caricato sul server, cambierà nome nella forma:
IdRevisore+”P”+IdProgetto+”VAL”+nome_file.
40
41. Vi sarà una notifica dell’operazione avvenuta e sarà possibile effettuare un altro upload o tornare
alla home page.
A livello implementativo il funzionamento è il medesimo di quello che è stato attuato per i
documenti dei progetti, ad esclusione della parte riguardante la base dati. Infatti nella
TblValutazione vi è già l’associazione progetto-revisore, ma il suo stato è
”accettato non valutato” ed il campo “valutazione” è settato a NULL.
È stata definita un’operazione di update che porta al cambiamento di stato ed all’inserimento del
nome della valutazione.
private void Submit1_ServerClick(object sender, System.EventArgs e)
{
if ((File1.PostedFile != null) && (File1.PostedFile.ContentLength > 0))
{
string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);
//IdRevisore+P+IdProgetto+VAL+nomefile
fn = Label1.Text +"P"+TextBox1V.Text+"VAL" + fn;
string SaveLocation = Server.MapPath("VALUTAZIONI") + "" + fn;
try
{
File1.PostedFile.SaveAs(SaveLocation);
//aggiorna il DB
UPDB();
Label2.Text = "Valutazione inserita";
}
catch (Exception ex)
{
Label2.Text = "Error: " + ex.Message;
}
41
43. CAPITOLO 5
Conclusioni
Gli obiettivi prefissati sono stati raggiunti con l’implementazione dei seguenti elementi:
Database del sistema
Tesista: Inserimento progetti
Revisore: Upload valutazioni
Inoltre è stata sviluppata un’analisi del sistema e delle funzionalità della base dati tali da facilitare
il futuro completamento e sviluppo del sistema stesso.
Sono state acquisite nuove conoscenze ed approfondite altre, riguardanti in particolare:
L’utilizzo di SQL SERVER 2008 e del linguaggio SQL
Sviluppo di applicazioni ASP.NET
Uso di strumenti quali Visual Studio 2012
C# e HTML
I possibili sviluppi del sistema sono:
miglioramento del front end;
estensione delle funzionalità del revisore;
permettere al tesista di visionare lo stato del proprio progetto;
creare applicazioni di supporto all’attività del revisore.
Allo stato attuale il sistema deve essere testato nell’ambiente in cui dovrà operare.
L’autore ha prodotto un database con 17 tabelle, 4 viste e 5 stored procedure e scritto
250 righe di html e 800 righe di codice C#.
43
44. BIBLIOGRAFIA
http://msdn.microsoft.com/it-it/library/ee532866.aspx
http://msdn.microsoft.com/it-it/library/aa139615.aspx
Mike Hotek , SQL Server 2008 passo per passo, Mondadori
http://msdn.microsoft.com/it-it/library/ms130214(v=sql.100).aspx
http://msdn.microsoft.com/it-it/library/bb510741.aspx
http://msdn.microsoft.com/library/dd831853.aspx
44