Avatar billede kaptajnknas Nybegynder
17. august 2006 - 19:00 Der er 79 kommentarer og
2 løsninger

Hjælp til udregning i ASP

Jeg arbejder på en slags hot or not, jeg har input fra 1 til 3 i databasen og jeg gemmer hvor mange stemmer der er gået ind.
Men jeg kan ikke få out-putet beregnet korrekt, så der også vises procent.
Er der nogen der har et bud, om det kan laves?
Avatar billede madeindk Nybegynder
17. august 2006 - 19:01 #1
Du skal ligge stemmerne sammen i databasen og så gemme hvor mange der har stemt, gør du det?
Avatar billede kaptajnknas Nybegynder
17. august 2006 - 19:19 #2
ja det gør jeg..
Avatar billede thesurfer Nybegynder
17. august 2006 - 19:26 #3
Hvis du lægger tallene sammen, og antallet af stemmer, er det simpelt nok:

sql = "select * from TabelNavn where id = " & id

...
response.write "procent: " & CBDL( CDBL(rs("rating")) / CInt(rs("antal_stemmer")) )
Avatar billede thesurfer Nybegynder
17. august 2006 - 19:27 #4
Egenligt burde det være:

response.write "procent: " & CBDL( CInt(rs("rating")) / CInt(rs("antal_stemmer")) )

Da rating (det man har stemt) og antallet af stemmer, begge er hele tal.

Procent delen kan indeholde kommatal, og er derfor ikke en integer (CInt) men en double (CDbl).
Avatar billede madeindk Nybegynder
17. august 2006 - 19:29 #5
<%
' Antal stemmer
strStemmer = "45"
' Alle stemmer lagt sammen
strResultat = "388"
   
hotStatus = strResultat / strStemmer
hotStatus = formatnumber(hotStatus, 0, 0)
hotStats = hotstatus * 100

response.write(hotstatus)
%>
Avatar billede thesurfer Nybegynder
17. august 2006 - 19:38 #6
Nå ja, man skal lige bruger formatnumber.. :-)

response.write "procent: " & FormatNumber( CBDL( CInt(rs("rating")) / CInt(rs("antal_stemmer")) ) )
Avatar billede thesurfer Nybegynder
17. august 2006 - 19:40 #7
Man kan også bruger FormatPercent, men man skal lige vende den om, så det er antal_stemmer / rating:

response.write "procent: " & FormatPercent( CBDL(  CInt(rs("antal_stemmer")) / CInt(rs("rating")) ) )
Avatar billede kaptajnknas Nybegynder
17. august 2006 - 19:41 #8
Kan du udbyde forklaring til dette udtræk? bare så jeg forstår til næste gang :-)
response.write "procent: " & CBDL( CInt(rs("rating")) / CInt(rs("antal_stemmer")) )
Avatar billede thesurfer Nybegynder
17. august 2006 - 19:46 #9
CInt(værdi) konverterer "værdi" til en integer, dvs, helttal (uden komma/punktum): 5
CDBl(værdi) konverterer "værdi" til en double, dvs, et kommatal: 5,2

Procenten udregnes, ved sige "rating divideret med antallet af stemmer".

Nu skrev du "input fra 1 til 3", så jeg gik ud fra at det var enten 1, 2 eller 3. Altså, at man ikke kan bruge kommatal, som f.eks. 2,4.

Hvis man kan bruge kommatal, skal det være: response.write "procent: " & CBDL( CDBl(rs("rating")) / CInt(rs("antal_stemmer")) )

Dvs, CDBl(rs("rating")) i stedet for CInt(rs("rating")).
Avatar billede kaptajnknas Nybegynder
17. august 2006 - 19:49 #10
Tak jeg prøver mig lige frem..
Avatar billede kaptajnknas Nybegynder
17. august 2006 - 20:08 #11
Jeg får Overflow i denne linie:
hotStatus = strResultat / strStemmer

hvad betyder det?
Avatar billede kaptajnknas Nybegynder
17. august 2006 - 20:11 #12
Hov nu står der:
Division by zero
Avatar billede thesurfer Nybegynder
17. august 2006 - 20:12 #13
strStemmer er lig 0. Man kan ikke dividere med 0.
Avatar billede thesurfer Nybegynder
17. august 2006 - 20:13 #14
dim intStemmer
intStemmer = CInt(strStemmer)

if intStemmer > 0 then
  ' her udskrives procent
else
  response.write "0 procent"
end if
Avatar billede madeindk Nybegynder
17. august 2006 - 20:22 #15
Må jeg også være med - det er trods alt mig der har smidt med det med:

hotStatus = strResultat / strStemmer

Jeg har bare gjort sådan her...

<%
strStemmer = rs("stemmer")
strResultat = rs("resultat")

if strStemmer > 0 AND strResultat > 0 then
' Regn ud
else
strStemmer = "0"
strResultat = "0"
end if
%>
Avatar billede kaptajnknas Nybegynder
17. august 2006 - 20:25 #16
Okay.
Hvis jeg sætter en stemme nu med input 3 , så burde det vel være 100%??
Hvis jeg sætter 3 stemmer med input 1 skal udtrækket vel være 33.3%??
Avatar billede thesurfer Nybegynder
17. august 2006 - 20:25 #17
madeindk> Hehe.. jeg kan da sagtens rette i din kode.. :-)
(og var også lidt hurtigere)

Egenligt er det lidt overflødigt at teste "strResultat > 0", da strResultat automatisk vil være 0 (eller ingenting, men det kommer an på felttype), da der jo ikke har været stemt.. :-)

Så kan man nøjes med:

if intStemmer > 0 then
  ' her udskrives procent
else
  strStemmer = "0"
  strResultat = "0"
end if
Avatar billede thesurfer Nybegynder
17. august 2006 - 20:27 #18
kaptajnknas> Du har da ret.. :-)
Tænker lige over det..
Avatar billede kaptajnknas Nybegynder
17. august 2006 - 20:44 #19
Jeg selvfølgelig hæve værdierne til 33 - 66 - 100
Avatar billede thesurfer Nybegynder
17. august 2006 - 20:52 #20
Ja, det ville være det nemmeste.. jeg kan ikke lige se hvordan man skulle gøre det, når det er 1,2 og 3.

33, 66 og 100 er nemmere, da 3 stemmer á 1 "points" vil give 100% :-)
Avatar billede kaptajnknas Nybegynder
17. august 2006 - 21:02 #21
Ja det kan bruges, men det er ikke den helt rigtige løsning.
Hvis jeg gørdet, kan jeg så få udskrevet i procenter med komma som eks. 33.3%
Avatar billede thesurfer Nybegynder
17. august 2006 - 21:04 #22
Det er egenligt lidt forkert, at bruge 33, 66 og 100, da 1/3 ikke er 33, men "33,3333333...."

Men ja, du kan godt formatere det så det er på "xx,xx%" formatet..
Avatar billede kaptajnknas Nybegynder
17. august 2006 - 21:17 #23
Kan du hjælpe lidt med formatering?
Skal jeg hæve værdien til 3333 - 6666 - 10000 for at gøre det mere præcis?
Avatar billede thesurfer Nybegynder
17. august 2006 - 22:04 #24
Jeg ved ikke om det gør det mere præcist, men man kunne jo lave en test..
Avatar billede kaptajnknas Nybegynder
17. august 2006 - 23:41 #25
jo men jeg vil gerne have decimaler med ud, så der eks. står 49,2% er det muligt?
Avatar billede madeindk Nybegynder
18. august 2006 - 06:48 #26
<%
hotStatus = formatnumber(hotStatus, 1, 0)
response.write(hotstatus
%>
Avatar billede nielle Nybegynder
18. august 2006 - 08:01 #27
Man kan faktisk beregne gennemsnittet som en del af selve SQL-kaldet:

SELECT count(*) AS antalStemmer, avg(stemme) AS gennemsnit FROM dinTabel
Avatar billede thesurfer Nybegynder
18. august 2006 - 08:51 #28
nielle>
Hmm.. Nu ved jeg ikke hvordan kaptajnknas har lavet det, men "count(*) AS antalStemmer" kræver vel, at man har 1 post per bruger der stemmer?

Hvis man bare har 1 post ("antal_stemmer","rating","afstemningsid") per afstemning, kan man vel ikke bruge den metode?

Jeg er bare nysgerrig.. :-)
Avatar billede nielle Nybegynder
18. august 2006 - 09:01 #29
Nej, det er rigtigt.

Hvis der ialt er 3 rækker i tabellen - en med antallet af 1-stemmer, en med antallet af 2-stemmer og en med antallet af 3-stemmer - så går det ikke med count() og avg(). Man kan bruge sum() i stedet for count(), men der er vist ikke nogen nem erstatning for avg() i det tilfælde.
Avatar billede kaptajnknas Nybegynder
18. august 2006 - 10:03 #30
Jeg sætter 1 post per. stemme, så jeg prøver lige de forslag..
Avatar billede kaptajnknas Nybegynder
18. august 2006 - 12:45 #31
Jeg forstår ikke helt hvordan det her virker:
SELECT count(*) AS antalStemmer, avg(stemme) AS gennemsnit FROM dinTabel

Kan i forklare det lidt nærmere?
Hvad betyder feks. avg?
Avatar billede snakeeye Nybegynder
18. august 2006 - 12:49 #32
avg er gennemsnit...

det som avg(stemme) gør er at tage gennemsnittet for de tal som ligger tabellen dinTabel i kolonnen stemme og gemmer dette i variablen gennemsnit
Avatar billede kaptajnknas Nybegynder
18. august 2006 - 14:14 #33
arhh okay :-D
Avatar billede nielle Nybegynder
18. august 2006 - 14:58 #34
"avg" er en forkortelse af "average" så betyder "gennemsnit" på dansk.
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 11:14 #35
Ved ikke om jeg har overset noget, men jeg får intet ud med dette:

Set rs = Conn.Execute("SELECT count(*) AS count, avg(input) AS gennemsnit FROM mintabel")
response.write count
response.write gennemsnit
Avatar billede nielle Nybegynder
19. august 2006 - 11:19 #36
Du skal nok ikke bruge "... AS count" idet count jo er et reserveret ord.

Men ellers er det:

Set rs = Conn.Execute("SELECT count(*) AS antal, avg(input) AS gennemsnit FROM mintabel")
response.write rs("antal") & "<br>"
response.write rs("gennemsnit")
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 11:35 #37
Det var bedre, skal jeg så bruge gennemsnittet i procent beregning herefter?
Avatar billede nielle Nybegynder
19. august 2006 - 11:51 #38
Jeg har gennemlæst tråden, men jeg synes ikke rigtigt at jeg kan finde ud af hvad det er for et resultat du gerne vil have ud af det til sidst? Hvordan skal output egentlig se ud?
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 12:37 #39
Jamen jeg prøver at få et output der hedder eks. 77.8 %
Avatar billede nielle Nybegynder
19. august 2006 - 12:44 #40
Du har 3 stemme-muligheder: 1, 2, og 3. Ønsker du at vide hvor mange procent som gar stemt 1, hvor mange procent som har stemt 2, og hvor mange procent som har stemt 3? Eller skal alle tre stemme-muligheder kombineres i et tal?
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 12:47 #41
Alle stemmer kombineres og deraf skal der beregnes procent
Avatar billede nielle Nybegynder
19. august 2006 - 13:05 #42
Det er lidt svært at se hvad det er for en formel du ønsker at bruge.

Hvad skal to stemmer, 1 hhv. 1, blive til?
Hvad skal to stemmer, 2 hhv. 2, blive til?
Hvad skal to stemmer, 3 hhv. 3, blive til?

Og hvad skal tre stemmer, 1, 2 og 3, blive til?
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 13:12 #43
1 svarer til 0%
2 svarer til 50%
3 svarer til 100%

Dvs.

Hvad skal to stemmer, 1 hhv. 1, blive til? = 0+0/1 = 0%
Hvad skal to stemmer, 2 hhv. 2, blive til? = 50+50/2 = 50%
Hvad skal to stemmer, 3 hhv. 3, blive til? = 100+100+100/3 = 100%

Tre stemmer bliver til: 0+50+100/3 = 75%
Avatar billede nielle Nybegynder
19. august 2006 - 13:20 #44
sql = "SELECT avg((stemme-1)*50) AS rating FROM dinTabel"
Set rs = Conn.Execute(sql)
Response.Write "Rating: " & Round(rs("rating"), 0) & "%<br>"
Avatar billede nielle Nybegynder
19. august 2006 - 13:24 #45
Ps:

(0+50+100)/3 = giver 50%
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 13:41 #46
Ja det er rigtig:)

Men jeg synes der kommer nogen mærkelige tal ud med den sql og de kommer ikke ud med decimal 100.0%
Avatar billede nielle Nybegynder
19. august 2006 - 13:51 #47
Mærkelige tal? Kan du ikke uddybe?

Hvis du vil have 1 decimals nøjagtighed, så er det:

sql = "SELECT avg((stemme-1)*50) AS rating FROM dinTabel"
Set rs = Conn.Execute(sql)
Response.Write "Rating: " & Round(rs("rating"), 1) & "%<br>"
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 13:55 #48
jeg får noget der ligner 47,3258% ud når jeg bruger denne sql
Avatar billede nielle Nybegynder
19. august 2006 - 13:58 #49
Round() skulle da gerne runde af?

Jeg har ingen holdning til om tallet 47,3258% ellere er det rigtige? Er det det?
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 13:59 #50
Når der ingen poster er overhoved får jeg resultatet 2317,5%
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 14:00 #51
Hvor ved sql'en hvor mange stemmer der er lagt??
Avatar billede nielle Nybegynder
19. august 2006 - 14:02 #52
SQL'en bliver kørt af databasen. Og, den har skam fuld tjek på de data der ligger i den.
Avatar billede nielle Nybegynder
19. august 2006 - 14:03 #53
Hvis der ikke er nogen stemmer i tabellen er gennemsnittet udefineret.
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 14:06 #54
Det kan jeg ikke få til at virke, det der kommer tættes på er:

<%
' Antal stemmer
strStemmer = "45"
' Alle stemmer lagt sammen
strResultat = "388"
   
hotStatus = strResultat / strStemmer
hotStatus = formatnumber(hotStatus, 0, 0)
hotStats = hotstatus * 100

response.write(hotstatus)
%>
Det kommer ud med det korrekte procent, dog ikke med decimel som jeg gerne vil ha'
Avatar billede nielle Nybegynder
19. august 2006 - 14:07 #55
<%
' Antal stemmer
strStemmer = "45"
' Alle stemmer lagt sammen
strResultat = "388"
   
hotStatus = strResultat / strStemmer
hotStatus = Round(hotStatus, 1)
hotStats = hotstatus * 100

response.write(hotstatus)
%>
Avatar billede nielle Nybegynder
19. august 2006 - 14:08 #56
Men det giver jo faktisk ikke det resultat som du ønsker i følge 19/08-2006 13:12:16.
Avatar billede nielle Nybegynder
19. august 2006 - 14:09 #57
<%
' Antal stemmer
strStemmer = "45"
' Alle stemmer lagt sammen
strResultat = "388"
   
hotStatus = strResultat / strStemmer
hotStatus = Round(hotstatus * 100, 1)

response.write(hotstatus)
%>
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 14:10 #58
Jo får det er de samme værdier der er samlet i en anden kolonne, så det skulle være det samme.
Avatar billede nielle Nybegynder
19. august 2006 - 14:12 #59
Nej, for med den formel så tæller en stemme på 1 som noget mere end 0%
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 14:14 #60
Men hvorfår siger du: avg((stemme-1)*50)
Det er jeg ikke med på.
Avatar billede nielle Nybegynder
19. august 2006 - 14:20 #61
Trin 1) Regnestykket stemme-1 giver:

1 -> 0
2 -> 1
3 -> 2

Trin 2) Regnestykket (stemme-1)*50 giver:

1 -> 0 -> 0
2 -> 1 -> 50
3 -> 2 -> 100

Det var de procenter du ville i følge 19/08-2006 13:12:16.

Trin 3) Regnestykket avg((stemme-1)*50) udregnmer gennemsnittet af alle stemmerne:

1+2+3 -> (0+50+100)/3 = 50%
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 14:33 #62
Ja det lyder rigtig nok. hm. men ikk om jeg kan få det til at fungerer.
Men ligger det i mine input's jeg sætter nemlig ikke værdierne 1 - 2 - 3 ind i kolonnen, men 0 - 50 - 100
Avatar billede nielle Nybegynder
19. august 2006 - 14:38 #63
Hvad står der i databasen 1,2,3 eller 0,50,100?
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 14:42 #64
0,50,100
Avatar billede nielle Nybegynder
19. august 2006 - 14:45 #65
Hvorfor i alverdene har du så skrevet 1, 2, og 3 hele tide?

Så skal koden jo passe på disse tal i stedet:

sql = "SELECT avg(stemme) AS rating FROM dinTabel"
Set rs = Conn.Execute(sql)
Response.Write "Rating: " & Round(rs("rating"), 1) & "%<br>"

- og så er det rigtogt nok at koden i 19/08-2006 14:06:02 også giver det rigtige.
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 14:54 #66
Ja nu virker det :-) min fejl med 1-2-3 Sorry.
Nu er det kun en sidste ting, nemlig når der ikke er stemt kommer fejlen:

Invalid use of Null: 'round'
Er det muligt at omgås dette på en eller anden måde?
Avatar billede nielle Nybegynder
19. august 2006 - 15:00 #67
Sådan:

sql = "SELECT count(*) AS antalStemmer, avg(stemme) AS rating FROM dinTabel"
Set rs = Conn.Execute(sql)

If rs("antalStemmer") = 0 Then
    Response.Write "Der er ikke stemt.<bt>"
Else
    Response.Write "Rating: " & Round(rs("rating"), 1) & "%<br>"
End If



- eller muligvis noget i denne stil:

sql = "SELECT avg(stemme) AS rating FROM dinTabel"
Set rs = Conn.Execute(sql)

If rs("rating") = Nothing Then
    Response.Write "Der er ikke stemt.<bt>"
Else
    Response.Write "Rating: " & Round(rs("rating"), 1) & "%<br>"
End If

- eller:

If rs("rating") = Null Then
    Response.Write "Der er ikke stemt.<bt>"
Else
    Response.Write "Rating: " & Round(rs("rating"), 1) & "%<br>"
End If

Jeg er dog ikke helt sikker på om de to sidste virker.
Avatar billede nielle Nybegynder
19. august 2006 - 15:02 #68
Jeg tror dog mest på den sidste af de to. :^)
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 15:12 #69
Ingen af dem virker.:( Har også prøvet:

If not rs.eof then
Response.Write "Rating: " & Round(rs("rating"), 1) & "%<br>"
    else
Response.Write "Der er ikke stemt.<bt>"
End If
Avatar billede nielle Nybegynder
19. august 2006 - 15:18 #70
Ja, den virker i hvert fald ikke for der vil altid blive returneret præcis en række med resultater.

Men denne her skal altså fungere:

sql = "SELECT count(*) AS antalStemmer, avg(stemme) AS rating FROM dinTabel"
Set rs = Conn.Execute(sql)

If rs("antalStemmer") = 0 Then
    Response.Write "Der er ikke stemt.<br>"
Else
    Response.Write "Rating: " & Round(rs("rating"), 1) & "%<br>"
End If
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 15:25 #71
Perfekt det virker bare :-)
Avatar billede nielle Nybegynder
19. august 2006 - 15:26 #72
Hmm, men det var jo også den første af dem jeg viste i 19/08-2006 15:00:57. Hvorfor skrev du så at der ikke var nogen af dem der virkede?
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 15:29 #73
Jeg havde ikke fået count(*) AS antalstemmer med.
Avatar billede nielle Nybegynder
19. august 2006 - 15:30 #74
Ok, det forklare jo det jo. :^)
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 15:31 #75
:-) så er svar = point herfra.
Avatar billede nielle Nybegynder
19. august 2006 - 15:34 #76
Der er vist også andre end mig som kan tillade sig at smide svar på denne her. :^)
Avatar billede kaptajnknas Nybegynder
19. august 2006 - 15:35 #77
Jeps vi venter...
Avatar billede madeindk Nybegynder
20. august 2006 - 14:56 #78
Svar.
Avatar billede nielle Nybegynder
20. august 2006 - 21:47 #79
Lægger også lige et svar :^)
Avatar billede thesurfer Nybegynder
21. august 2006 - 10:28 #80
Ingen points til mig, tak.
Avatar billede kaptajnknas Nybegynder
21. august 2006 - 13:15 #81
Points :^)
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