|

RAGGRUPPARE I DATI: NUOVA VERSIONE DEL SONDAGGIO

ERRORE.HTM
Abbiamo visto che, nel caso in cui l'utente abbia
già votato, viene caricata una pagina di errore.
Questa non è altro una pagina in cui si spiega
all'utente che non può votare più di una
volta. Nient'altro.
REPORT.ASP
La pagina report.asp invece è la
pagina che si occupa di visualizzare a schermo i risultati
del sondaggio.
Nella prima versione del sondaggio
si effettuavano cinque interrogazioni del database contando
i risultati per ogni opzione.
Il fatto di effettuare cinque interrogazioni sul database
è forse il modo più semplice per ottenere
il risultato cercato; però questo modo di procedere
è sicuramente poco ottimizzante.
Ecco alloro che introduciamo un nuovo concetto: il raggruppamento
dei risultati.
A noi interessa sapere quante volte ricorre la parola
primo, quante volte la parola secondo...
e così via (ovvero quanti utenti hanno scelto
la prima opzione del sondaggio, quanti la seconda...).
Per far questo il metodo migliore è quello di
raggruppare i record del database in cinque gruppi (ovvero
tanti quanti sono le opzioni del sondaggio) e quindi
contare gli elementi di ogni gruppo.
Se nel gruppo terzo sono presenti dieci elementi,
significa che la parola terzo appare dieci volte
nel database, quindi dieci utenti hanno scelto la terza
opzione del sondaggio.
La
query di interrogazione diventa pertanto
select
sondaggio.vota, COUNT(*) from sondaggio GROUP BY vota
In
questo modo chiediamo di selezionare il campo vota
della tabella sondaggio (select sondaggio.vota),
quindi chiediamo di contare il numero di record (count
* ) raggruppandoli in base ai valori prelevati dallo
stesso campo vota (group by vota).
Con il metodo group by possiamo raggruppare tutti
i record che hanno il campo vota uguale (quindi
nel primo insieme raggruppiamo i record il cui campo
vota corrisponde a primo, nel secondo
riuniamo quelli il campo vota corrisponde a secondo...
e così via)
Naturalmente
il raggruppamento deve avvenire su tutti i record, quindi
la condizione deve essere while not rs.eof
(A questo proposito ricordiamo che do while not
rs.eof ... loop è uguale a while not rs.eof
... wend: sono due modi diversi di fare la
stessa cosa!).
Man mano che vengono analizzati i record, questi vengono
raggruppati e il loro numero viene aggiornato.
In questo modo tutti i record appartengono ad un gruppo
(magari composto da un solo record...) del quale noi
possiamo sapere il numero di elementi grazie a count
*
Pertanto se il record contiene la parola primo (if
rs(0) = "primo") nella variabile prima
memorizziamo il numero di record che contengono
questa parola (prima=rs(1)). E così per
tutte le opzioni del sondaggio (secondo, terzo...)
Nel
caso di una seleziona multipla ( select sondaggio
vota e count *) come quella che abbiamo
appena effettuato, ricordiamo che con rs(0) otteniamo
il risultato della prima selezione (ovvero il select
sondaggio.vota) mentre con rs(1)
otteniamo quello della seconda (COUNT(*) from...)
Pertanto
il codice da utilizzare sarà
WHILE
NOT rs.EOF
IF rs(0)="primo" THEN prima=rs(1)
IF rs(0)="secondo" THEN seconda=rs(1)
IF rs(0)="terzo" THEN terza=rs(1)
IF rs(0)="quarto" THEN quarta=rs(1)
IF rs(0)="quinto" THEN quinta=rs(1)
rs.MoveNext
WEND
Così
facendo abbiamo la variabile prima con memorizzati
il numero di record che contengono la parola 'primo'
(ovvero il numero di clic che ha ricevuto la prima opzione
del sondaggio); la variabile seconda con il numero
di record che contengono la parola 'secondo' e così
via...
Può
succedere però che alcune opzioni non abbiano
ricevuto alcun voto: in questo caso le relative variabili
sono vuote.
Pertanto se le variabili sono vuote il loro valore dovrà
essere pari a zero: in questo caso, anziché lasciarle
vuote, conviene assegnar loro il valore zero.
if
prima="" then prima="0"
if seconda="" then seconda="0"
if terza="" then terza ="0"
if quarta="" then quarta ="0"
if quinta = "" then quinta ="0"
A
questo punto abbiamo ottenuto il numero di voti per
ogni selezione.
In
definitiva il codice da inserire diventa:
|
<html>
<head>
<title>Risultati sondaggio</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1">
</head>
<body
bgcolor="#FFFFFF">
<%
Dim Conn
Set Conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver
(*.mdb)};dbq=" & server.mappath("database/sondaggio.mdb")
Dim rs
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "select sondaggio.vota, COUNT(*)
from sondaggio GROUP BY vota", conn
Dim prima
Dim seconda
Dim terza
Dim quarta
Dim quinta
WHILE
NOT rs.EOF
IF rs(0)="primo" THEN prima=rs(1)
IF rs(0)="secondo" THEN seconda=rs(1)
IF rs(0)="terzo" THEN terza=rs(1)
IF rs(0)="quarto" THEN quarta=rs(1)
IF rs(0)="quinto" THEN quinta=rs(1)
rs.MoveNext
WEND
if prima="" then prima="0"
if seconda="" then seconda="0"
if terza="" then terza ="0"
if quarta="" then quarta ="0"
if quinta = "" then quinta ="0"
RS.Close
Set RS=Nothing
conn.Close
Set conn=Nothing
|
A
questo punto calcoliamo il numero di voti totali:
|
totale=
(prima + seconda + terza + quarta + quinta)
|
Ora
dobbiamo calcolare il numero di voti in termini di percentuale
(per es. ottimo = 20%, buono 12,5%...)
Per far questo utilizziamo la funzione FormatPercent(valore,
X) dove valore è il numero da trasformare
in percentuale e X è il numero di decimali
da visualizzare. Nel nostro caso valore è
il risultato della divisione tra il numero di voti e
il totale dei voti stessi. I risultati così ottenuti
sono memorizzati nelle variabili prima2, seconda2...
Inoltre dobbiamo verificare che il totale dei voti sia
diverso da zero: infatti se provassimo a dividere un
numero per zero otterremo un messaggio di errore.
Quindi il codice da inserire diventa:
|
IF
totale<>0 THEN
prima2= FormatPercent((prima / totale), 1)
seconda2= FormatPercent((seconda / totale), 1)
terza2= FormatPercent((terza / totale), 1)
quarta2= FormatPercent((quarta / totale), 1)
quinta2= FormatPercent((quinta / totale), 1)
|
Nel
caso in cui nessuno abbia ancora utilizzato il nostro
sondaggio, tutte le variabili hanno valore zero.
|
ELSE
prima2 = 0
seconda2 = 0
terza2 = 0
quarta2 = 0
quinta2 = 0
|
A
questo punto dobbiamo fare in modo di visualizzare delle
barre colorate di dimensione proporzionale al numero
di voti ricevuti: quindi prendiamo le percentuali di
voti per ogni opzione, eliminiamo eventuali numeri decimali
e memorizziamo il tutto nella variabili prima3,
seconda3... che utilizzeremo come dimensione
delle barre stesse.
Dato che le immagini così ottenute sono troppo
piccole (infatti avremmo immagini di 20 o 30 pixel...)
conviene raddoppiare tale valore, in modo che sia più
agevole distinguere le differenze fra le varie barre
colorate.
Quindi a noi servono le prime due cifre che compongono
la percentuale. In questo caso utilizziamo la funzione
Mid(valore, cifra iniziale, numero cifre) dove
valore è rappresentato dalla variabile
che contiene la percentuale di voto, numero di cifre
è due (in quanto a noi servono le due cifre senza
decimali) mentre uno è la posizione da cui contare
i caratteri/numeri che ci servono (dato che a noi servono
le prime due a sinistra evidentemente la posizione di
partenza sarà uno). Gli ultimi due caratteri
(* 2) servono a raddoppiare il risultato ottenuto.
Quindi scriveremo:
|
prima3
= (Mid( prima2, 1, 2))*2
seconda3 = (Mid( seconda2, 1, 2))*2
terza3 = (Mid( terza2, 1, 2))*2
quarta3 = (Mid( quarta2, 1, 2))*2
quinta3 = (Mid( quinta2, 1, 2))*2
%>
|
Una
volta giunti a questo punto possiamo creare la pagina
che visualizzi a schermo quanto abbiamo trovato: avremo
pertanto nella prima colonna le varie opzioni che compongono
il sondaggio, nella seconda le percentuali di voto,
nella terza il numero di voti per ogni opzione e nella
quarta le barre colorate con dimensioni proporizonali
alla percentuale di voto: per far questo il campo width=
dell'immagine colorate dovrà contenere qualcosa
del tipo <%= quinta3%>
|
<p><font
size="2" face="Verdana" color="#CC0000"><b>Come
giudichi i servizi offerti da AmicoPc.com? </b></font></p>
<div align="left">
<table border="0" cellpadding="0"
cellspacing="0" width="484"
height="38">
<tr>
<td width="2" height="21"></td>
<td width="72" height="21"></td>
<td width="102" height="21">
<p align="center"><font size="2"
face="Verdana"><i>Percentuale</i></font></td>
<td width="102" height="21">
<p align="center"><font size="2"
face="Verdana"><i>N° voti</i></font></td>
<td width="200" height="21"></td>
</tr>
<tr>
<td width="2" height="0"></td>
<td width="72" height="0"></td>
<td height="0" align="center"
colspan="2" width="202"></td>
<td width="200" height="0"></td>
</tr>
<tr>
<td width="2" height="25"></td>
<td width="72" height="25"><font
face="Verdana" size="2"><b>Ottimi</b></font></td>
<td width="102" height="25"
align="center"><font face="Verdana"
size="2"><%= prima2%></font></td>
<td width="102" height="25"
align="center"><font face="Verdana"
size="2"><%= prima%></font></td>
<td width="200" height="25"><img
border="0" src="sondaggio1.gif"
width="<%= prima3%>" height="10"></td>
</tr>
<tr>
<td width="2" height="25"></td>
<td width="72" height="25"><font
face="Verdana" size="2"><b>Buoni</b></font></td>
<td width="102" height="25"
align="center"><font face="Verdana"
size="2"><%= seconda2%></font></td>
<td width="102" height="25"
align="center"><font face="Verdana"
size="2"><%= seconda%></font></td>
<td width="200" height="25"><img
border="0" src="sondaggio5.gif"
width="<%= seconda3%>" height="10"></td>
</tr>
<tr>
<td width="2" height="25"></td>
<td width="72" height="25"><font
face="Verdana" size="2"><b>Sufficienti</b></font></td>
<td width="102" height="25"
align="center"><font face="Verdana"
size="2"><%= terza2 %></font></td>
<td width="102" height="25"
align="center"><font face="Verdana"
size="2"><%= terza %></font></td>
<td width="200" height="25"><img
border="0" src="sondaggio3.gif"
width="<%= terza3%>" height="10"></td>
</tr>
<tr>
<td width="2" height="25"></td>
<td width="72" height="25"><font
face="Verdana" size="2"><b>Mediocri</b></font></td>
<td width="102" height="25"
align="center"><font face="Verdana"
size="2"><%= quarta2%></font></td>
<td width="102" height="25"
align="center"><font face="Verdana"
size="2"><%= quarta%>
</font></td>
<td width="200" height="25"><img
border="0" src="sondaggio4.gif"
width="<%= quarta3%>" height="10"></td>
</tr>
<tr>
<td width="2" height="25"></td>
<td width="72" height="25"><font
face="Verdana" size="2"><b>Pessimi</b></font></td>
<td width="102" height="25"
align="center"><font face="Verdana"
size="2"><%= quinta2%></font></td>
<td width="102" height="25"
align="center"><font face="Verdana"
size="2"><%= quinta%>
</font></td>
<td width="200" height="25"><img
border="0" src="sondaggio2.gif"
width="<%= quinta3%>" height="10"></td>
</tr>
<tr>
<td width="2" height="25"></td>
<td width="72" height="25"></td>
<td height="25" colspan="2"
width="202"></td>
<td width="200" height="25"></td>
</tr>
<tr>
<td width="2" height="25"></td>
<td width="72" height="25"
bgcolor="#EFEFEF"><font face="Verdana"
size="2">Voti
totali:</font></td>
<td width="102" height="25"
bgcolor="#EFEFEF"><font face="Verdana"
size="2" color="#CC0000"><b>
<p align="center"><%=totale%></b></font></td>
<td width="102" height="25"></td>
<td width="200" height="25"></td>
</tr>
</table>
</div>
</body>
</html>
|
|