Avatar billede hjemmeskoen Nybegynder
02. september 2005 - 19:00 Der er 11 kommentarer og
1 løsning

Optælling af stemmer

Hejsa..

Jeg har lavet et fint 'afstemnings system' det vil sige at de har mulighed for at markere det de stemmer på også bliver deres svar samt deres IP og Datoen smidt ind i en tabel (Stemmer) også bliver de sendt videre.

Problemet er så bare at spørgsmålene bliver hentet ud af en anden tabel (Afstemning) og det jo ikke så smart for så får man lidt problemer ved optællingen har jeg erfaret.
Så det jeg egentlig spørg om er hvordan man kan hive stemme resultaterne ud af de to tabeller også måske dele dem op i nogle procent linier.
Altså lidt ligesom denne afstemning www.hjemmeskoen.dk/Afstemning.JPG også samtidig skrive hvor mange stemmer også procent også ialt stemmer.

Måske lidt sådan:

Hvilket hold holder du med?
AGF (500 stemmer)  <-------Procent Linie------> 50%
BIF (500 stemmer)  <-------Procent Linie------> 50%

Ialt ser min kode sådan ud:

<html>
<head>
<title>Afstemning</title>
</head>

<%if request.querystring("Side") = "Afstemning" then%>

<%
' ADODB connection objektet
Set Conn = Server.CreateObject("ADODB.Connection")
' Husk at angive den rigtige sti til din database
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("Database.mdb")
' Åben databaseforbindelsen
Conn.Open DSN
strSQL = "Select * from Afstemning "
set rs = Conn.execute(strSQL)
if rs.eof then
response.write "Der er ingen aktiv afstemning lige nu."
else
do until rs.eof
%>

<form method="post" action="Afstemning.asp?Side=Stem">

<%=rs("Spg")%><br>
<%=rs("Spg1")%>: <input type="radio" name="Svar" value="<%=rs("Spg1")%>"><br>
<%=rs("Spg2")%>: <input type="radio" name="Svar" value="<%=rs("Spg2")%>"><br>
<%=rs("Spg3")%>: <input type="radio" name="Svar" value="<%=rs("Spg3")%>"><br>

<input type="submit" value="Stem!" name="Stem">


<%
rs.movenext
loop
end if
end if
%>

<%if request.querystring("Side") = "Stem" then

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath ("Database.mdb")

IP = Request.ServerVariables("REMOTE_ADDR")
Svar = Request.form("Svar")
Dato = Date()

sql = "INSERT INTO Stemmer (Svar,Dato,IP) VALUES('" & Svar & "','" & Dato & "','" & IP & "')"
Conn.Execute(sql)
response.redirect("Tjek.asp")

Set conn = Nothing
Set rs = Nothing

end if
%>

<%if request.querystring("Side") = "Resultater" then%>

Der her jeg skal bruge lidt hjælp..

<%end if%>

</html>

Nogle der kan hjælpe?
Avatar billede nielle Nybegynder
02. september 2005 - 19:11 #1
Du kan tælle semmefordelingen med denne SQL:

SELECT Svar, count(*) AS Antal FROM Stemmer GROUP BY Svar
Avatar billede nielle Nybegynder
02. september 2005 - 19:16 #2
sql = "SELECT Svar, count(*) AS Antal FROM Stemmer GROUP BY Svar"
Set rs = Conn.Execute(sql)

Do While Not rs.EOF
    Response.Write "Svaret: " & rs("Svar") & " fik " & rs("Antal") & "stemmer<br>"
    rs.MoveNext
Loop
Avatar billede hjemmeskoen Nybegynder
02. september 2005 - 20:46 #3
Nogle der ved noget ang. procent?
Avatar billede nielle Nybegynder
02. september 2005 - 20:59 #4
Sådan:

sql = "SELECT count(*) AS Antal FROM Stemmer"
Set rs = Conn.Execute(sql)
Total = rs("Antal")

sql = "SELECT Svar, count(*) AS Antal FROM Stemmer GROUP BY Svar"
Set rs = Conn.Execute(sql)

Do While Not rs.EOF
    Response.Write "Svaret: " & rs("Svar") & " fik " & rs("Antal")/Total*100 & " % af stemmerne<br>"
    rs.MoveNext
Loop
Avatar billede hjemmeskoen Nybegynder
03. september 2005 - 09:52 #5
Lidt om opsætningen:
-------------------------------------------------------------------------------------

Afstemning:
Spg = Det overordnede spørgsmål (Eks. Hvilket hold holder du med?)
Spg1 = Svarmulighed 1 (Eks. AGF)
Spg2 = Svarmulighed 2 (Eks. BIF)
Spg3 = Svarmulighed 3 (Eks. FCK)

Så bliver det smidt ind i tabellen Stemmer som:

Svar (Det man har markeret oven over)
IP (Ens IP så man ikke kan stemme igen)
Dato (Har egentlig ingen rigtig grund)

-------------------------------------------------------------------------------------

Så skal vi jo så finde ud af noget med når man trækker det ud skal det jo vise hvor mange svar der er til Spg1 eks. derfor skal Spg1,2,3 jo også smides ind i Stemmer alt efter hvad man vælger.

Håber du forstår ellers må du jo lige råbe op :)
Avatar billede nielle Nybegynder
03. september 2005 - 10:11 #6
Du har da allerede den kode som lægger folks svar ind i databasen.

Min kode fra 02/09-2005 20:59:19 udtrækker svar-statistikken. Med procenter. Hvordan er det at du ønsker den skal se anderledes ud?
Avatar billede hjemmeskoen Nybegynder
03. september 2005 - 10:16 #7
Jamen den trækker jo kun svar ud den skal jo os gøre det bestemt. Den skal jo vise hvor mange stemmer der er på eks. Spg1 også på Spg2 og derefter på Spg3.
På den måde skal der jo indsættes i databasen at den bruger stemte på Spg1.

Og ved din kode kan jeg ikke lige se hvad kolonnen Antal gør? :s
Avatar billede hjemmeskoen Nybegynder
03. september 2005 - 10:49 #8
Så der skal jo egentlig en udtrækning til ind i den kode du smed op d. 02/09-2005 20:59:19..
Avatar billede nielle Nybegynder
03. september 2005 - 11:10 #9
Har du prøvet at køre koden fra 02/09-2005 20:59:19?

Hvad angår ”Antal” så går jeg ud fra at det er denne her du snakker om?

sql = "SELECT count(*) AS Antal FROM Stemmer"
Set rs = Conn.Execute(sql)
Total = rs("Antal")

Den bruges til at finde det totale antal stemmer. ”Antal” er et alias for ”count(*)” som er den SQL-funktion som tæller sammen, og ved at indføre aliaset kan jeg efterfølgende få fat i totalen med:

Total = rs("Antal")

Man kan vist godt klare det uden aliaset, men jeg foretrækker altid at gøre det på denne måde.

Jeg bruger efterfølgende denne Total til at beregne hvad procent-satserne er:

Do While Not rs.EOF
    Response.Write "Svaret: " & rs("Svar") & " fik " & rs("Antal")/Total*100 & " % af stemmerne<br>"
    rs.MoveNext
Loop
Avatar billede nielle Nybegynder
03. september 2005 - 12:58 #10
For det første bør du vide at dit script vil fejle hvis du hare mere end én afstemning i din tabel. Jeg er derfor gået ud fra at du aldrig har f.eks. 2, 3 eller flere afstemninger kørende på samme gang.

Det er stadigvæk det nemmeste at bruge GROUP BY, men det kan da også laves på andre måder, f.eks. sådan her:

sql = "SELECT * FROM Afstemning"
rs1 = Conn.Execute(sql)

If rs1.eof Then
    Response.Write "Ingen afstemning lige nu.<br>"
Else
    Spg1 = rs1("Spg1")
    Spg2 = rs1("Spg2")
    Spg3 = rs1("Spg3")

    sql = "SELECT count(*) As AntalStemmer FROM Stemmer Where Svar='" & Spg1 & "'"
    rs3 = Conn.Execute(sql)
    AntalStemmerSpg1 = rs3("AntalStemmer")

    sql = "SELECT count(*) As AntalStemmer FROM Stemmer Where Svar='" & Spg2 & "'"
    rs3 = Conn.Execute(sql)
    AntalStemmerSpg2 = rs3("AntalStemmer")

    sql = "SELECT count(*) As AntalStemmer FROM Stemmer Where Svar='" & Spg3 & "'"
    rs3 = Conn.Execute(sql)
    AntalStemmerSpg3 = rs3("AntalStemmer")

    AntalStemmer = AntalStemmerSpg1 + AntalStemmerSpg2 + AntalStemmerSpg3

    Response.Write "Spørgsmål: " & rs1("Spg") & "<br><br>"
    Response.Write Spg1 & ": " & AntalStemmerSpg1 & " stemmer (" & AntalStemmerSpg1/AntalStemmer * 100 & "%)<br>"
    Response.Write Spg2 & ": " & AntalStemmerSpg2 & " stemmer (" & AntalStemmerSpg2/AntalStemmer * 100 & "%)<br>"
    Response.Write Spg3 & ": " & AntalStemmerSpg3 & " stemmer (" & AntalStemmerSpg3/AntalStemmer * 100 & "%)<br>"
End If
Avatar billede hjemmeskoen Nybegynder
03. september 2005 - 18:10 #11
Tjah..
Fik hjælp af en anden..

Men derfor skal du da have dine point så kom med et svar :)
Avatar billede nielle Nybegynder
03. september 2005 - 18:14 #12
Jeg er nysgerrig; Hvordan kom din løsning så til at se up?

... og et svar :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester