Sök på  
Tekniker In English Favorit Min profil 0 nya iMail Kontakta Hjälp  
 

Konsten att rösta, inkl. stapeldiagram


Av: Benni Svensson
Publicerad: 2005-06-02

Då och då, så dyker frågan upp, om hur man bör skriva ett lyckat röstnings-script. Därtill så har man i regel lite olika önskemål, om uppbyggnad och teknisk utformning. För min del, så vill jag alltid att någonting skall hända på en asp-sida, därför så visar jag hur man gör en röstapplikation med en slumpgenerator, som helt enkelt slumpar fram frågan.

Innehåll

  » Inledning
  » Databasen
  » dataconn.asp
  » MinaSubbar.asp:
  » Vote.asp
  » Uppdatera databasen
  » Hela koden
  » Avslutningsvis

Relaterade artiklar


 
Inledning


Precis som jag har gjort i mina tidigare artiklar
Artikel [Ett Administrations script för webb baserad databas Del 1]
Artikel [Ett Administrations script för webb baserad databas del 2]
Artikel [Ett Administrations script för webb baserad databas del 3]
Artikel [Skriv inte för mycket kod, återanvänd den istället.]

så använder jag en include-fil för min data-connection, och en fil för mina subbar
(för koder som upprepas).

Databasen

Databasen har jag kallat för vote.mdb, och består av två tabeller

t_quize:
Fälnamn Datatyp
ID Räknare primärnyckel
Quize text text 50 tecken


t_answer:
Fälnamn Datatyp
a_id Räknare primärnyckel
id tal främmande nyckel till tabellen t_quize
vyes tal räknar upp alla yes-svar
vno tal räknar upp alla no-svar
vdontKnow tal räknar upp alla dontKnow-svar


Relationen t_quize.id ? t_answer.id
Detta är en väldigt enkel design, men jag har ändå försökt att hålla mig till normaliserings
reglerna så långt som jag har förstått.

dataconn.asp


Denna fil ser i stort sett ut som tidigare…

Set Connection = Server.CreateObject("ADODB.Connection")
Connection.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & server.MapPath("vote.mdb")    



I detta exempel, så har jag lagt databasen i rooten(inte att rekommendera), enbart för
enkelhetens skull.


MinaSubbar.asp:



MinaSubbar har jag lagt in som en include-fil, det är alltså koder som kommer eller
kan komma att användas flera gånger.

Sub MakeRecordSet(rec,sql,con)
    Set rec = Server.CreateObject("ADODB.Recordset")
    rec.open  sql,con, 2, 2
End Sub



Denna sub gör det enkelt att öppna upp ett rekordset, samt köra SQL:en. Som ni
ser så vill den ha tre argument, vad vi skall kalla rekordsetet för, SQL:en samt
connectionsträngen. Den används så här:

SQL="SELECT id FROM t_answer WHERE  id =" & nId
CALL MakeRecordSet(rst,SQL,Connection)



Nästa subb är lite större. Den används för att räkna fram alla ja/nej/vetinte-röster,
räknar procenten samt visar ett stapeldiagram.

SUB Voting(sID)
SQL="SELECT a_id,id,vyes,vno,vdontKnow from t_answer WHERE id =" & sID
CALL MakeRecordSet(rst,sql,Connection)
if not rst.eof then
totalt= rst("vyes") + rst("vno") + rst("vdontKnow")
dim syes
syes = rst("vyes")/totalt * 100
sno = rst("vno")/totalt * 100
sdontknow = rst("vdontKnow")/totalt * 100

response.write "<table><tr><td><B>Ja</B>" & "</td><td>
<Img Src=""4.gif"" height=10 width =" & syes  & "></td>
<td align=right>&nbsp;" & FormatPercent(rst("vyes")/totalt)  & "</td></tr>"
response.write "<tr><td><B>Nej" & "</B></td><td>
<Img Src=""5.gif"" height=10 width =" & sno  & "></td>
<td align=right>&nbsp;" & FormatPercent(rst("vno") / totalt) & "</td></tr>"
response.write "<tr><td><B>Vet inte</B>" & "</td><td>
<Img Src=""6.gif"" height=10 width =" & sdontknow  & "></td>
<td align=right>&nbsp;"  & FormatPercent(rst("vdontKnow") / totalt)  & "</td></tr></table>"

end if
End Sub



Vote.asp


Den kod som jag har skrivet, baseras på en slumgenerator, dvs den slumpar
fram en fråga av alla de frågor som finns i databasen. Detta system gör att det
hela tiden tycks hända någonting på sidan.

Skulle man istället vilja ha en fråga i veckan eller i månaden så är det inga problem:

'Veckonummer
 strId = DatePart("ww", Now(), vbUseSystemDayOfWeek, vbUseSystem)
 'Månaden i tal
 strId= DatePart("m", Now(), vbUseSystemDayOfWeek, vbUseSystem)



Och då blir SQL:en:

SQL = "SELECT id,quize FROM t_quize WHERE ID = " & strId



…men nu så skulle vi ha ett randomscript och det ser ut så här:
    
SQL = "SELECT id,quize FROM t_quize Order BY id "
CALL MakeRecordSet(rst,SQL,Connection)
Dim arrData       
Dim arrSequencer  
Dim iArrayLooper  
Dim iArraySize    
arrData = rst.GetRows’här får vi allt vad som finns i databasen
'stänger objecten
rst.close
Set rst = Nothing
’hur många poster finns det i databasen
iArraySize = CLng((Ubound(arrData, 2) - LBound(arrData, 2)))
Randomize’slumpar fram ett id
'nu har vi fått ett random nr och hämtar det ifrån arrayen
i = CInt(Int((iArraySize * Rnd()) + 1))
strId          = arrData(0, i)
strquize       = arrData(1, i)
'skriver ut frågan
response.write "<DIV CLASS=""Titel"">" & strquize & "</DIV>"



För min del så tycker jag att detta är ett väldigt smidigt sätt att dynamiskt få en
levande asp-sida.

Uppdatera databasen


Ifrån formen, så skickas id(som vi fick ifrån slumgeneratorn) med, och det första
vi måste göra är, att kolla, har det röstats på denna fråga innan?
Har det inte det, så måste vi göra en INSERT, annars så gör vi en UPDATE.
Men innan detta, så måste vi se vad som har röstats. Det gör vi med en CASE SELECT-sats

Dim totalt,nVote,sAnsw
nVote=Request.form("Vote")'variabler ifrån formuläret
nId = request("id")'variabler ifrån formuläret

SELECT CASE nVote'härkollar vi vad som röstades, och ger variablen ett tal
Case "yes"       'som vi använder när vi skall uppdateara röstningen
sAnsw ="vyes" 'fältnamn i databasen
iAnsw = 1
Case "no"
sAnsw ="vno" 'fältnamn i databasen
iAnsw = 1
Case "dont_know"
sAnsw ="vdontKnow" 'fältnamn i databasen
iAnsw = 1
End Select



Nu får vi reda på o, användaren har klickat på yes/no/dontknow, och vi sparar
variablerna så vi lätt kan uppdatera databasen.

'Vi kollar efter om denna fråga har röstats  tidigare
SQL="SELECT id FROM t_answer WHERE  id =" & nId
CALL MakeRecordSet(rst,SQL,Connection)

if rst.eof then
'om den inte har det  måste vi göra en insert
SQL = ("Insert INTO t_answer(id,"  & sAnsw & ")VALUES(" & request("id") & "," & iAnsw   & ")")
Connection.Execute(SQL)
else
'annars  gör vi en uppdate och plussa  med ett
SQL = "UPDATE  t_answer set " & sAnsw & " = " & sAnsw & " +1 WHERE  id =" & request("id") & " "
Connection.Execute(SQL)
end if



Slutligen så sätter vi en cookies, för att man inte skall kunna rösta en gång till samma dag:

'Vi sätter en cookies  att det inte går att rösta med en gång igen
Response.Cookies("vote")("yes") = "yes"
Response.Cookies("vote").Expires = date()+1'antal dagar cookies skall leva



När man sedan laddar applikationen, så kollar vi om det finns en cookies, finns det en
så gör vi radioknapparna och submittknapparna disabla, annars inte.

If LEN(Request.Cookies("vote")("yes")) > 0 Then
sdisabled ="disabled"
else
sdisabled =""
End If



Nu är det dags att visa den hela koden:
Hela koden



< % Response.Buffer = true % >
< !--#include file="dataconn.asp"-- >
< !--#include file="Style/MinaSubbar.asp"-- >

<html>
<head>
<title>Vote<>
<LINK rel="stylesheet" type="text/css" href="Style/styles.css">
</HEAD>
<body>
< %
Dim sdisabled
session.LCID = 1053

if LEN(Request.form("btnsubmit"))>0 AND LEN(Request.form("Vote"))>0 then
Dim totalt,nVote,sAnsw
nVote=Request.form("Vote")'variabler ifrån formuläret
nId = request("id")'variabler ifrån formuläret

SELECT CASE nVote'härkollar vi vad som röstades, och ger variablen ett tal
Case "yes"       'som vi använder när vi skall uppdateara röstningen
sAnsw ="vyes"
iAnsw = 1
Case "no"
sAnsw ="vno"
iAnsw = 1
Case "dont_know"
sAnsw ="vdontKnow"
iAnsw = 1
End Select

'Vi kollar efter om denna fråga har röstats  tidigare
SQL="SELECT id FROM t_answer WHERE  id =" & nId
CALL MakeRecordSet(rst,SQL,Connection)

if rst.eof then
'om den inte har det  måste vi göra en insert
SQL = ("Insert INTO t_answer(id,"  & sAnsw & ")VALUES(" & request("id") & "," & iAnsw   & ")")
Connection.Execute(SQL)
else
'annars  gör vi en uppdate och plussa  med ett
SQL = "UPDATE  t_answer set " & sAnsw & " = " & sAnsw & " +1 WHERE  id =" & request("id") & " "
Connection.Execute(SQL)
end if
'Vi sätter en cookies  att det inte går att rösta med en gång igen
Response.Cookies("vote")("yes") = "yes"
Response.Cookies("vote").Expires = date()+1'antal dagar cookies skall leva
end if
% >
<CENTER>
<fieldset Style ="width: 300; height:200"><legend>
 Dagens fråga!!!
</legend>
< %'om det finns en cook disabla radioknapparna och supmittknappen
If LEN(Request.Cookies("vote")("yes")) > 0 Then
sdisabled ="disabled"
else
sdisabled =""
End If

'Vi slumpar fram en fråga ifrån databasen

Dim Connection
SQL = "SELECT id,quize FROM t_quize Order BY id "
CALL MakeRecordSet(rst,SQL,Connection)
Dim arrData       ' Array to Store Data
Dim arrSequencer  ' Array to Hold Random Sequence
Dim iArrayLooper  ' Integer for Looping
Dim iArraySize    ' Size of Data Array

arrData = rst.GetRows
'stänger objecten
rst.close
Set rst = Nothing

iArraySize = CLng((Ubound(arrData, 2) - LBound(arrData, 2)))
Randomize
'nu har vi fått ett random nr och hämtar det ifrån arrayen
i = CInt(Int((iArraySize * Rnd()) + 1))
strId          = arrData(0, i)
strquize       = arrData(1, i)
'skriver ut frågan
response.write "<DIV CLASS=""Titel"">" & strquize & "</DIV>"
% >
<DIV align=left>
<table width="100%"><tr><td width="60%">
<form method="POST" name="Kolla" action="Vote.asp">
<INPUT  Type="HIDDEN" NAME="Id"  Value="<% = strId %>">
<input  type="radio" < %= sdisabled % > name="Vote" value="yes">Ja<BR>
<input  type="radio" < %= sdisabled % > name="Vote" value="no">Nej<BR>
<input  type="radio" < %= sdisabled % > name="Vote" value="dont_know">Vet inte<BR>
<INPUT  TYPE="SUBMIT" < %= sdisabled % > VALUE="Rösta" name="btnsubmit">
</form>
</td><td width="40%">
< %
'här skriver vi ut resultatet
CALL Voting(strId)
% >
</td></tr></table>
<fieldset></CENTER>

</body>
</html>



Eftersom jag visade hela connection.asp och MinaSubbar.asp ovanför, så skriver jag
inte ut dem igen.

Så här kan det se ut, om man har följt denna artikel:


De bilder som jag har använt till stapeldiagrammet ser ut så här:





Avslutningsvis


Denna applikation är menat som en includefil i t ex öppningsfilen som Du har på din site.
När det gäller formatering osv, så är det ju upp till den egna fantasin.

Någonstans så är det galet med Pelles artikel-applikation, vilket innebär, att jag har varit tvungen
att "fuska" en del.
Jag var tvungen att lägga in mellanslag mellan "<" och "%", mellan "%" och ">".
Likadant mellan "<" och "!" samt mellan "!" och ">".
Jag hoppas att ni tänker på det.

Lycka till

Med vänlig hälsning
Benni Svensson

 
Vad tyckte du om artikeln?
Ge skribenten eller andra läsare dina tips och kommentarer. Betygsätt artikeln och kommentera gärna anledning till det satta betyget.
 
Visningar: 3500
Har röstat:  7

Snittbetyg: 94%

Rubrik 
Text

 
Sven-Eric IngblomTack ! 2005-07-11 08:28:11
Hej vill bara tacka för en utförlig beskrivning...

  Se utskriftsversion

pellesoft it - en resurs att lita på | copyright © 1986-2010 | regler & avtal | cookies