webForumDet fria alternativet

Räkna ihop summan av en kolumm i en databas.

ASPur ASP

16 svar · 547 visningar · startad av trexter.com

Medlem sedan apr. 20021 203 inlägg
Frågan#1

LarsG gav mig ett litet script innan men tyvärr fick jag ett felmeddelande och tänkte att det nog är lika bra att göra det själv. Jag vill alltså göra så här:

Namn: Bosse
Köpte: En gitarr
Pris: 2000

Namn: Lina
Köpte: En lina :OO
Pris: 20

Summa: 2020

Därför klurade jag upp följande struktur på koden som skulle summera alla "total" i databasen men av någon anledning skrivs inte summa ut, måste vara något fel i tankesättet....

<%
' Databaskoppling
' RecordSet som hämtar namn och lite sådant
Summa = 0
Do Until RecSet.EOF
total = RecSet("total")
Summa = Summa + total
' Listar ut namn och sådant...
RecSet.MoveNext
Loop
RecSet.Close
Connect.Close
Response.Write Summa
%>

:)

Medlem sedan juni 200032 969 inlägg
#2

Hur ser koden LarsG gav dig ut?

Jag hade gjort det med en enkel select-fråga i stället för att loopa och krångla.

strSQL = "SELECT Sum(prisfältet) AS Prissumma FROM tabellen"
set objRS = objConn.Execute(strSQL)
dblSum = CDbl(objRS("Prissumma"))

Mvh,

Medlem sedan apr. 20021 203 inlägg
#3

Så här såg hans inlägg ut:

"Hur vill du ha det om samma person har köpt flera (olika) saker?

Hur som helst så är det enklast att summera i VB-script då du går igenom alla poster.

q = "select * from t where orderdate between ... order by name"
set rs = connect.execute(q)
totper = 0.0
totall = 0.0
p = ""
while not rs.eof
if  p<> "" and p <> rs("name") then
   if totper <> 0.0 then response.write totper & "<br><br>"
   p = rs("namn")
   response.write p & "<br>"
   totper = 0.0
end if
  'övrig info
  totall = totall + cdbl(rs("kostnad"))
  totper = totperl + cdbl(rs("kostnad"))
 rs.movenext
wend
if totper <> 0.0 then response.write totper & "<br><br>"
if totall <> 0.0 then response.write "Alla" & totper & "<br><br>"

Du får frilla till det lite."

... och jag måste säga att det nästan är lite för komplicerad för min smak.

Men saken är ju den att om jag använder din metod @nders (som jag också själv trodde att jag skulle bli föreslagen), så måste jag ju ha två RecordSet...

:)

Medlem sedan juni 200032 969 inlägg
#4

Japp.

Jag missade att du skrev ut andra saker i din kod också, eftersom du tagit bort själva koden. Så jag fick för mig att det var det enda du ville göra. :-)

Då gör vi så här i stället. Du är inne på rätt spår med din kod, men du måste alltid se till att subtypskonvertera, så du lägger ihop tal som verkligen är tal. Det här borde fungera:

<%
' Databaskoppling
' RecordSet som hämtar namn och lite sådant
Summa = 0
Do Until RecSet.EOF
Summa = Summa + Cdbl(RecSet("fältet"))
' Listar ut namn och sådant...
RecSet.MoveNext
Loop
RecSet.Close
Connect.Close
Response.Write Summa
%>

På vilket sätt fungerade det inte tidigare?
Jag använde Cdbl() i koden för att typkonvertera till decimaltal.

Mvh,

Medlem sedan apr. 20021 203 inlägg
#5

Invalid use of Null: 'Cdbl' :l

Medlem sedan juni 200032 969 inlägg
#6

Har du null i talfältet? Ha inte det. Se till att det står 0 istället.

Annars:

<%
' Databaskoppling
' RecordSet som hämtar namn och lite sådant
Summa = 0
Do Until RecSet.EOF
[b]If not IsNull(RecSet("fältet")) Then
    Summa = Summa + Cdbl(RecSet("fältet"))
End if[/b]
' Listar ut namn och sådant...
RecSet.MoveNext
Loop
RecSet.Close
Connect.Close
Response.Write Summa
%>

Mvh,

Medlem sedan apr. 20021 203 inlägg
#7

Hmm.. var ändrar jag det (svenskt Access 2000)?
total är av typen valuta...

:q

Medlem sedan juni 200032 969 inlägg
#8

Ändra och ändra... Se till att dina poster har värdet 0 istället för null...

Du kan ju lägga in 0 som standardvärde på fältet också.

Mvh,

Medlem sedan apr. 20021 203 inlägg
#9

Kanon, det fungerar faktiskt, det var bara en post i databasen som bråkade. Då var jag ju faktiskt inte så där _fruktansvärt_ långt ifrån i alla fall. :)

Men en sak... det där med Cdbl. Jag förstår inte riktigt när man använder...

:)

Medlem sedan juni 200032 969 inlägg
#10

I ASP / VbScript finns inga egentliga datatyper, utan alla variabler är av typen variant. Dock finns en hel del subtyper. För att du ska kunna använda talfunktioner på tal, och strängfunktioner på strängar, och datumfunktioner på datum, måste du se till att värdet är av rätt subtyp.

CDbl() - Konverterar någonting till en double, ett decimaltal (kan vara riktigt stort)
CSng() - Konverterar någonting till en single, ett decimaltal, inte lika stort som double.
CStr() - Konverterar till sträng
CDate() - Konverterar till datumtyp
CBool() - Konverterar ett värde till boolean, dvs true/false
CInt() - Konverterar till integer (heltal) (Dock max 32768, så vid stora tal, se nedan)
CLng() - Konverterar till long (heltal), kan vara attans stort.

Det finns säkert fler jag inte hade i hjärnan just nu, men konsultera http://msdn.microsoft.com/scripting/ .

Kom ihåg att du inte kan använda konverteringsfunktionerna på nullvärden, utan endast värden som verkligen kan konverteras till den typen.

Mvh,

Medlem sedan apr. 20021 203 inlägg
#11

Tack! :bire

Medlem sedan sep. 2000314 inlägg
#12

Testade nedanstående kod med lyckat resultat, men om man vill summera fler fält, hur skall man då gå tillväga? Har testat på olika sätt men inte lyckats.

<%
' Databaskoppling
' RecordSet som hämtar namn och lite sådant
Summa_1 = 0
Do Until RecSet.EOF
If not IsNull(RecSet("fältet_1")) Then
    Summa_1 = Summa_1 + Cdbl(RecSet("fältet_1"))
End if
' Listar ut namn och sådant...
RecSet.MoveNext
Loop
RecSet.Close
Connect.Close
Response.Write Summa_1
%>
Medlem sedan dec. 200012 464 inlägg
#13

Vill du ha en summa för allt eller vill du ha olika summor?

Medlem sedan sep. 2000314 inlägg
#14

Olika summor..
Fick fram 2 stycken olika på följande sätt, men när jag lägger till de jag nedan tagit bort så blir resultaten fel.

Summa_hm = 0
Summa_bm = 0
'Summa_bu = 0

Do Until RecSet.EOF
If not IsNull(RecSet("hm")) AND (RecSet("bm")) Then
'If not IsNull(RecSet("hm")) AND (RecSet("bm")) AND (RecSet("bu")) Then
    Summa_hm = Summa_hm + Cdbl(RecSet("hm"))
    Summa_bm = Summa_bm + Cdbl(RecSet("bm"))
    'Summa_bu = Summa_bu + Cdbl(RecSet("bu"))
End if

' Listar ut namn och sådant...
RecSet.MoveNext
Loop
RecSet.Close
Connect.Close
Response.Write Summa_hm
Response.Write "-"
Response.Write Summa_bm
'Response.Write "-"
'Response.Write Summa_bu
Medlem sedan dec. 200012 464 inlägg
#15

Du får kolla varje kolumn för sig.

If not IsNull(RecSet("hm"))  Then
    Summa_hm = Summa_hm + Cdbl(RecSet("hm")) 
End if
If not IsNull(RecSet("bm"))  Then
    Summa_bm = Summa_bm + Cdbl(RecSet("bm")) 
End if
Medlem sedan sep. 2000314 inlägg
#16

Tackar!!!!

Medlem sedan mars 20021 889 inlägg
#17

Wee... inte för att jag har något vettigt att säga men visst är det en viss känsla att svara på det man själv skrivit för typ ett halvår sedan!

trexter.com > Hoppas allt löste sig och lycka till i framtiden!

:)

136 ms totalt · 3 externa anrop · v20260731065814-full.55e59744
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)