webForumDet fria alternativet

Beräkningar i Recordset

ASP

16 svar · 515 visningar · startad av devotion

Medlem sedan jan. 20013 582 inlägg
Frågan#1

:)

Hej

Hur gör man för att göra beräkningar i ett recordset som loopas.

Tex summera mm.

mvh

Medlem sedan juni 200032 967 inlägg
#2

Man ska bara se till att göra subtypskonverteringar för att se till att man hanterar tal.

dblSum = 0
while not objRS.EOF
     dblSum = dblSum + CDbl(objRS("fält"))
     objRS.MoveNext
wend

Kika på typkonverteringsfunktionerna här: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/vtorifunctions.asp (de flesta funktioner som börjar på c är typkonverteringsfunktioner.)

Mvh

Medlem sedan jan. 20013 582 inlägg
#3

:)
Okidoki...

Det var ju inte så svårt!

Mvh

Medlem sedan jan. 20013 582 inlägg
#4

:)

Men hur gör jag med det emininta scriptet du hjälpt mig med. Där är det ju en subrutin som använder sig av dictionaryobjektet? Där känns det inte lika självklart...

<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<% Option Explicit %>
<%session.lcid=1053%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Sökresultat</title>
<link href="Stylesheet/test.css" rel="stylesheet" type="text/css">
</head>
<body>
<%

Dim objConn, strSearch, strSQL, objRS, intCounter, objDict, strEnumber, strArticleName, strUnit, strSupplier, curPrice, strFC, strLowest, strLastENumber, strLastSupplier, objPricesDict, strOrder, strOrder2, bgcolor

strSearch = Trim(Replace(Request.Form("searchField"), "'", "''")) ' Notera att vi inte får glömma bort att skydda oss mot SQL injections
strOrder = Request.Form("order")

If strOrder = "eNumber" then
  strOrder2 = "tblArticle.eNumber"
End If  
If strOrder = "articleName" then
  strOrder2 = "tblArticle.articleName, tblArticle.eNumber"
End if

Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString = "DSN=Prislista"
server.MapPath("Prislista.mdb")
objConn.Open

strSQL = "SELECT DISTINCT tblArticle.eNumber, articleName, articleUnit, articlePrice, SupplierName FROM (tblArticle INNER JOIN tblPrice ON tblArticle.eNumber = tblPrice.eNumber) INNER JOIN tblSupplier ON tblPrice.articleSupplierId = tblSupplier.SupplierId WHERE tblArticle.eNumber LIKE '%" & strSearch & "%' ORDER BY " & strOrder2 & ", tblPrice.articlePrice ASC"
'Response.Write strSQL & "<br><br>"

Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open strSQL, objConn, 3, 1 ' Recordsetet öppnar vi så här för att kunna få ut ett värde från egenskapen  recordcount.
intCounter = 0 ' skapa en liten posträknare som vi sedan räknar upp

Set objDict = Server.CreateObject("Scripting.Dictionary") 'ett dictionaryobjekt

If objRS.EOF then
	Response.Write("Din sökning på <b>" & strSearch & "<b> gav inget resultat. Försök igen!<br>")
Else
	
	Response.Write("<span class=""text"">Du har sökt på E-nummer: <b>" & strSearch & "</b></span><br><br>")

	Response.write "<table width=""800"" border=""0"" cellspacing=""0"" cellpadding=""0""><tr><td width=""75"" height=""18"" class=""tabellhuvud"">E-nummer</td><td width=""250"" class=""tabellhuvud"">Benämning</td><td width=""50"" class=""tabellhuvud"">Enhet</td><td width=""90"" class=""tabellhuvud"">Solar</td><td width=""90"" class=""tabellhuvud"">Storel</td><td width=""120"" class=""tabellhuvud"">Elektroskandia</td><td width=""100"" class=""tabellhuvud"">Lägst pris</td><td width=""25"" class=""tabellhuvud"">Antal</td></tr>"
	

	Do While not objRS.EOF
		strENumber = "" & objRS("ENumber")
		strArticleName = "" & objRS("articleName")
		strUnit = "" & objRS("articleUnit")
		strSupplier = "" & objRS("SupplierName")
		curPrice = FormatCurrency(CLng(objRS("articlePrice"))*0.01)

		if strENumber <> strLastEnumber then
			if intCounter <> 0  then
				' aha, här har det gjorts saker förut. Skicka iväg till utskriftsfunktionen.
				' markering av det jättesunkiga priset
				objDict.Item(strLastSupplier) = Replace(objDict.Item(strLastSupplier), "black", "red")
				call writePrices(objDict)
				objDict.RemoveAll
			end if
			set objDict = Server.CreateObject("Scripting.Dictionary")
			objDict.Add "eNumber", strENumber
			objDict.Add "articleName", strArticleName
			objDict.Add "articleUnit", strUnit
			intCounter = 1
			strLastENumber = strENumber
		else
			intCounter=intCounter + 1
		end if
		if not objDict.Exists(strSupplier) then
	      ' Bara en säkerhetskoll att vi inte lägger in något om det redan är inlagt för denna leverantör
			select case intCounter
			case 1
				' weee, det här är det jättebästa priset!
				strFC = "green"
				objDict.Add "lowest", strSupplier
			case else
				strFC = "black"
			end select
			strLastSupplier = strSupplier
			objDict.Add strSupplier, "<font color=""" & strFC & """>" & curPrice & "</font>"
		end if

		objRS.MoveNext
	Loop
	' Vi måste köra visningskoden här också för att få med den sista produkten.
	Response.Write strLastSupplier
	objDict.Item(strLastSupplier) = Replace(objDict.Item(strLastSupplier), "black", "red")
	call writePrices(objDict)
	
	Response.Write "</table>"
End if

objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing

Set objDict = Nothing
Set objPricesDict = Nothing

public sub writePrices (objPricesDict)
   If bgcolor = "#FFFFFF" then bgcolor = "#EFEFEF" else bgcolor = "#FFFFFF"
   Response.write "<tr  bgcolor=""" & bgcolor & """><class=""itabell""><td height=""20"" class=""itabell"">" & objPricesDict.Item("eNumber") & "</td><td class=""itabell"">" & objPricesDict.Item("articleName") & "</td><td class=""itabell"">" & objPricesDict.Item("articleUnit") & "</td>"
   if objPricesDict.Exists("Solar") then
       Response.write "<td class=""itabell"">" & objPricesDict.Item("Solar") & "</td>"
   else
       Response.write "<td class=""itabell""><i>Saknas</i></td>"
   end if
   if objPricesDict.Exists("Storel") then
       Response.write "<td class=""itabell"">" & objPricesDict.Item("Storel") & "</td>"
   else
       Response.write "<td class=""itabell""><i>Saknas</i></td>"
   end if
   if objPricesDict.Exists("Elektroskandia") then
       Response.write "<td class=""itabell"">" & objPricesDict.Item("Elektroskandia") & "</td>"
   else
       Response.write "<td class=""itabell""><i>Saknas</i></td>"
   end if
   Response.write "<td class=""itabell"">" & objPricesDict.Item("lowest") & "</td>"
   Response.write "<td class=""itabell"">y</td></tr>"	
end sub
%>
</body>
</html>

mvh

Medlem sedan juni 200032 967 inlägg
#5

Vad är det du vill räkna ut för något? :)

Medlem sedan jan. 20013 582 inlägg
#6

:r
Jo....

Jag har tänkt använda en modifierad variant av scriptet till en varukorg.

Då radas ju alla artiklar upp i en tabell. Tanken var att summera alla priser så att man kan se vad totalkostnaden blir för respektive leverantör...

...är inte lätt att få svar om man frågar dåligt... :e

mvh

Medlem sedan jan. 20013 582 inlägg
#7

:) :)

Medlem sedan juni 200032 967 inlägg
#8

Jag hade gjort så här i loopen:

  1. skapa en variabel för varje leverantör
  2. när du loopar ut grejerna och lägger in i dictionaryobjektet så kollar du av vilken leverantör det gäller, lägg ihop med det som tidigare fanns i leverantörssummevariabeln.

Mvh

Medlem sedan jan. 20013 582 inlägg
#9

Låter enkelt ;)
Ska försöka!

mvh

Medlem sedan jan. 20013 582 inlägg
#10

:( Satan
Känner att viljan och idérikedomen är större än kunskapen just nu...

Fattar ingenting :(

Mvh

Medlem sedan jan. 20013 582 inlägg
#11

:x :x :x :x

Medlem sedan juni 200032 967 inlägg
#12

Hur ser dina försök ut då? :)

Medlem sedan jan. 20013 582 inlägg
#13

:(
Finns inte så mycket till försök.............

Hade det varit ett vanligt loopat recordset hade det inte varit några problem.

MEN, kan inte få ihop det med dictionaryobjektet...

Punkt 1 skapa en variabel för varje leverantör

strSupplier = "" & objRS("SupplierName")

Leverantörens namn loopas ut ur recordsetet

Skall jag använda det och göra en variabel för varje leverantör?

Punkt 2

Tyvärr, fattar inte :(

mvh

Medlem sedan jan. 20013 582 inlägg
#14

Please

Medlem sedan juni 200032 967 inlägg
#15

Före recordset-loopen, initiera dina totalvariabler:

lngTotalStorel = 0
lngTotalElektroSkandia = 0
...

Sedan, i recordset-loopen, exempelvis precis före if strENumber <> strLastEnumber then:

Select case strSupplier
     Case "Storel"
          lngTotalStorel = lngTotalStorel + CLng(objRS("articlePrice"))
     Case "ElektroSkandia"
          lngTotalElektroSkandia = lngTotalElektroSkandia + CLng(objRS("articlePrice"))
....
End Select

Sedan kan du använda variablerna där du vill (under förutsättning att loopen är färdigkörd, vill säga.)

... och under förutsättning att jag förstått vad du vill göra.

mvh

Medlem sedan jan. 20013 582 inlägg
#16

:e

Du är snäll @nders!

Ska prova med en gång!

mvh

Medlem sedan jan. 20013 582 inlägg
#17

Hej!

Sumeringsfunktionen fungerar och jag lär mig hela tiden...

Tack!

Nu är det andra problem istället... (se SQL-forumet)

Men, detta problem är löst i alla fall

Hmmm, vilket svar ska accepteras som slutligt??

mvh

276 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
130 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)