webForumDet fria alternativet

Jämföra priser

ASP

53 svar · 1 283 visningar · startad av devotion · sida 3 av 3

Frågan, av devotion

Hej! Jag har en tabell med olika priser för olika leverantörer 3. Tanken är att de ska jämföras med varandra. Hur gör man för att det lägsta ska bli grönt, det högsta rött. De mittemellan ska vara svarta??? sedan vill jag att leverantörens namn skrivs ut på det lägsta priset. Resultat: Solar-Storel-elektroskandia-Lägsta pris \------------------------------------------------- 100 \--125 -- 15

Läs frågan i sin helhet →
Medlem sedan juni 200032 967 inlägg
#41

Det där kommer dessvärre inte att fungera, eftersom färgningen är baserad på prisernas placering i recordsetet.

Först och främst måste det till en till sortering i SQL-frågan (eNumber primärt, sedan pris sekundärt), och sedan måste man göra en drös kontroller inne i recordsetet för att hantera prisordning och färgning.

Jag hinner inte kolla på detta nu, men jag ska försöka se till att återkomma i ärendet.

mvh

Medlem sedan jan. 20013 582 inlägg
#42

:)
Jag väntar med spänning!

Mvh

Medlem sedan juni 200032 967 inlägg
#43

Det är väl dags nu då, jag hade lite tråkigt på vägen hem från jobbet, så då var det väl lika bra att skriva lite kod. ;)

  1. Notera att jag tagit bort din felaktiga inkludering av adovbs.inc. Den behövs ju heller inte, eftersom du inte på denna sida använder någon av de konstanter som definieras där.

  2. Jag har ändrat i SQL-frågan så den gör en sökning med wildcards istället för att använda =, samt lagt till i ORDER BY.

  3. Jag har lagt till "Saknas" i utskriften om produkten saknas hos en specifik leverantör.

<%@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

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

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

strSQL = "SELECT DISTINCT * 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 tblArticle.eNumber, tblPrice.articlePrice ASC"

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.<br>")
Else
	
	Response.Write("Du har sökt på E-nummer: <b>" & strSearch & "</b><br><br>")

	Response.write "<table><tr><td>E-nummer</td><td>Benämning</td><td>Solar</td><td>StorEl</td><td>Elektroskandia</td><td>Lägst</td></tr>"
	Response.Write "<tr><td colspan=""6""><hr></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 "unit", 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
	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)
   Response.write "<tr><td>" & objPricesDict.Item("eNumber") & "</td><td>" & objPricesDict.Item("articleName") & "</td>"
   if objPricesDict.Exists("Solar") then
       Response.write "<td>" & objPricesDict.Item("Solar") & "</td>"
   else
       Response.write "<td><i>Saknas</i></td>"
   end if
   if objPricesDict.Exists("Storel") then
       Response.write "<td>" & objPricesDict.Item("Storel") & "</td>"
   else
       Response.write "<td><i>Saknas</i></td>"
   end if
   if objPricesDict.Exists("Elektroskandia") then
       Response.write "<td>" & objPricesDict.Item("Elektroskandia") & "</td>"
   else
       Response.write "<td><i>Saknas</i></td>"
   end if
   Response.write "<td>" & objPricesDict.Item("lowest") & "</td></tr>"
end sub
%>
</body>
</html>

Vi börjar med att se om detta kan funka, så kan vi gå på det sista lyxproblemet sedan.

Mvh

Medlem sedan jan. 20013 582 inlägg
#44

:)

Nu börjar koden bli väl avancerad för min hjärna...

Det fungerar!! :)

Lyxproblem nr 2 hade jag faktiskt kunnat lista ut :r (är ju inte så svårt att skriva Saknas mellan två taggar...

Nu fungerar det att söka på delar av E-nummer men inte på hela. Mycket konstigt. Altså; skriver jag ett komplett nummer presenteras ingen data. Tabellhuvudet kommer upp. Då måste ju numret hittas i tabellen annars hade ju texten "Din sökning gav inget resultat visats" Hmmm

Ska försöka felsöka på det.

Det känns som vi snart är framme. Tack! :birp

Ska bli skönt att kunna "klarmarkera" denna tråd!!

Men då dyker väl fler frågor upp....

@nders; vilket program använder du för att koda??

Mvh

Medlem sedan juni 200032 967 inlägg
#45

Vi börjar i alla fall närma oss, och det känns ju trevligt. :)

Jag använder Microsoft Visual Interdev när jag pysslar med ASP. Andra program för andra språk / miljöer.

Mvh
anders

Medlem sedan jan. 20013 582 inlägg
#46

Vad tror du det är för fel att jag inte hittar kompletta e-nummer??

Om jag vill ha olika fäger på varannan rad i tabellen har jag förstått att jag ska ha den här koden:

If bgcolor = "#FFFFFF" then bgcolor = "#EFEFEF" else bgcolor = "#FFFFFF"

Men hur får jag in den i denna komplexa kod? :r

Mvh

Medlem sedan juni 200032 967 inlägg
#47

Radfärgningen kan du lösa direkt i subrutinen:

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

Glöm inte att lägga till bgcolor överst i filen i dim-listan.

Vad tror du det är för fel att jag inte hittar kompletta e-nummer??

Har inte en aning. Börja med att skriva ut den färdiga SQL-frågan och se hur den ser ut, så kanske du har lättare att se problemet.

Det kan inte vara så att det råkar halka med ett mellanslag, exempelvis om du kör copy & paste på ett eNummer någonstans ifrån? Jag ser att det inte trimmas någonstans, så det är väl läka bra att lägga in det:

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

Mvh

Medlem sedan jan. 20013 582 inlägg
#48

Hej!

Får detta svaret från SQL-satsen:

SELECT DISTINCT * FROM (tblArticle INNER JOIN tblPrice ON tblArticle.eNumber = tblPrice.eNumber) INNER JOIN tblSupplier ON tblPrice.articleSupplierId = tblSupplier.SupplierId WHERE tblArticle.eNumber LIKE '%2538301%' ORDER BY tblArticle.eNumber, tblPrice.articlePrice ASC

Inga konstigheter vad jag kan se.

Det konstiga är att e-numret hittas, annars hade ju "Din sökning gav inget resultat visats"

Tar jag bort den sista siffran i e-numret listas 4 träffar upp som har den kombinationen...

Har även provat med"=" i stället för LIKE, men det ger samma resultat....

:(

Mvh

Medlem sedan jan. 20013 582 inlägg
#49

:)
På några artiklar gör scriptet "fel" dvs kodar grönt på det högsta priset och skriver dess leverantör som lägst pris. Tvärtom

Det är ju några artiklar i databasen så jag kan ju inte kolla alla. Majoriteten är rätt men som sagt finns det några som blir fel..

Varför??

:)

Mvh

Medlem sedan juni 200032 967 inlägg
#50

Konstigt. Har du möjlighet att maila över databasen och exempel där det blir konstigt, så kan jag testa själv? Det är mycket lättare att hitta felen då.

min mailadress är anders@cyber.nu .

Mvh

Medlem sedan jan. 20013 582 inlägg
#51

Har skickat...

Mvh

Medlem sedan juni 200032 967 inlägg
#52

Har mottagit. Återkommer! :)

Medlem sedan juni 200032 967 inlägg
#53

Efter lite om och men...

  1. Jag har skrivit om din SELECT-fråga en aning, så du bara hämtar de fält du använder.
  2. Jag har lagt till eNumber som sekundärt sorteringsfält även när man väljer att sortera efter benämning.
<%@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
	' [b]Vi måste köra visningskoden här också för att få med den sista produkten.[/b]
	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>

Problemet med att fel pris markeras som lägst ibland beror på datatypen i databasen.
Eftersom du lagrar priser i textfält så sorteras det också därefter.

Mvh

Medlem sedan jan. 20013 582 inlägg
#54

:)
Då accepterar jag det svaret som lösning på problemet!!! :)

Känns skönt!

Tack alla som hjälpt mig! Särskilt @nders och Poffe....

Jag lär återkomma i andra ärenden... Sidan är inte klar än. ;)

Tack!

Mvh

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