@ndersMedlem sedan juni 200032 967 inläggDet 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
devotionMedlem sedan jan. 20013 582 inlägg:)
Jag väntar med spänning!
Mvh
@ndersMedlem sedan juni 200032 967 inläggDet ä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. ;)
-
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.
-
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.
-
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
devotionMedlem sedan jan. 20013 582 inlägg:)
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
@ndersMedlem sedan juni 200032 967 inläggVi 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
devotionMedlem sedan jan. 20013 582 inläggVad 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
@ndersMedlem sedan juni 200032 967 inläggRadfä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
devotionMedlem sedan jan. 20013 582 inläggHej!
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
devotionMedlem sedan jan. 20013 582 inlägg:)
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
@ndersMedlem sedan juni 200032 967 inläggKonstigt. 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
@ndersMedlem sedan juni 200032 967 inläggHar mottagit. Återkommer! :)
@ndersMedlem sedan juni 200032 967 inläggEfter lite om och men...
- Jag har skrivit om din SELECT-fråga en aning, så du bara hämtar de fält du använder.
- 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
devotionMedlem sedan jan. 20013 582 inlägg:)
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