?
Dubletter i vadå?
Vilket resultat förväntar du dig och vilket får du?
Exemplifiera med datainnehåll.
12 svar · 490 visningar · startad av devotion
:)
Premiär i detta forum!
Varför visar inte denna SQL-string dubletter i databasen?
strSQL = "SELECT tblArticle.articleName, tblArticle.articleUnit, tblCart.userId, tblCart.quantity, tblDiscount.articleDiscount, tblPrice.articlePrice, tblSupplier.SupplierName, tblArticle.eNumber FROM (((tblArticle INNER JOIN tblCart ON tblArticle.eNumber = tblCart.eNumber) INNER JOIN tblPrice ON tblArticle.eNumber = tblPrice.eNumber) INNER JOIN tblDiscount ON tblPrice.articleCategory = tblDiscount.articleCategory) INNER JOIN tblSupplier ON tblPrice.articleSupplierId = tblSupplier.SupplierId WHERE tblCart.userId = " & session("userId") & " ORDER BY tblArticle.eNumber, tblPrice.articlePrice ASC"
Har testat att göra en fråga i access med exakt samma sträng och det funkar...
mvh
?
Dubletter i vadå?
Vilket resultat förväntar du dig och vilket får du?
Exemplifiera med datainnehåll.
:(
Ok, kanske inte så bra förklarat...
SQL-satsen ska hämta information från en kundkorg, tblcart. I tblCart ligger bara antal, artikelnummer, benämning samt ett userId. Resten joinas fran tblPrice, tblArticle mfl.
Informationen loopas fram med ett recordset och presenteras i tabellform.
Problemet är att om jag lagt till samma artikel 2 gånger (dublett i databas) så visas bara en i presentationen.
När jag summerar priserna recordsetet så räknas alla priserna dvs även dubletterna. Så alla posterna loopas igenom.
Det fungerar som en SELECT DISTINCT fast det bara är en SELECT.
Kanske är något i asp-koden som gör det?
Mvh
Hej!
Här kommer hela scrpitet...
<%@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>Kundvagn</title>
<link href="../Stylesheet/stylemainFrame.css" rel="stylesheet" type="text/css">
</head>
<body>
<%
Dim objConn, strSearchField, strSQL, objRS, intCounter, objDict, strEnumber, strArticleName, strUnit, strSupplier, curPrice, strFC, strLowest, strLastENumber, strLastSupplier, objPricesDict, strOrder, bgcolor, strOption, strShow, lngTotalStorel, lngTotalSolar
If session("userId") <> "" Then
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString = "DSN=IntranetSydostel"
objConn.Open
strSQL = "SELECT tblArticle.articleName, tblArticle.articleUnit, tblCart.userId, tblCart.quantity, tblDiscount.articleDiscount, tblPrice.articlePrice, tblSupplier.SupplierName, tblArticle.eNumber FROM (((tblArticle INNER JOIN tblCart ON tblArticle.eNumber = tblCart.eNumber) INNER JOIN tblPrice ON tblArticle.eNumber = tblPrice.eNumber) INNER JOIN tblDiscount ON tblPrice.articleCategory = tblDiscount.articleCategory) INNER JOIN tblSupplier ON tblPrice.articleSupplierId = tblSupplier.SupplierId WHERE tblCart.userId = " & session("userId") & " ORDER BY tblArticle.eNumber, tblPrice.articlePrice ASC"
lngTotalStorel = 0
lngTotalSolar = 0
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("<span class=""text"">Kundvagnen är tom!</span><br>")
Else
Response.Write("<span class=""text"">Följande artiklar finns i kundvagnen:</span><br><br>")
Response.write "<table width=""690"" border=""0"" cellspacing=""0"" cellpadding=""0""><tr class=""tabellhuvud""><td width=""60"" height=""18"" class=""tabellhuvud"">E-nr</td><td width=""250"" class=""tabellhuvud"">Benämning</td><td width=""45"" class=""tabellhuvud"">Enhet</td><td width=""75"" class=""tabellhuvud"">Solar</td><td width=""75"" class=""tabellhuvud"">Storel</td><td width=""75"" class=""tabellhuvud"">Ahlsell</td><td width=""60"" class=""tabellhuvud"">Lägst</td><td width=""50"" class=""tabellhuvud"">ta bort</td></tr>"
Do While not objRS.EOF
strENumber = "" & objRS("ENumber")
strArticleName = "" & objRS("articleName")
strUnit = "" & objRS("articleUnit")
strSupplier = "" & objRS("SupplierName")
'If strShow = "avtal" then
'curPrice = "" & FormatCurrency(Cdbl(objRS("articlePriceWithDiscount")))
' End If
'If strShow = "netto" then
curPrice = "" & FormatCurrency(Cdbl(objRS("articlePrice"))*0.01)
'End If
Select case strSupplier
Case "Storel"
lngTotalStorel = lngTotalStorel + CLng(objRS("articlePrice")*0.01)
Case "Solar"
lngTotalSolar = lngTotalSolar + CLng(objRS("articlePrice")*0.01)
End Select
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.
objDict.Item(strLastSupplier) = Replace(objDict.Item(strLastSupplier), "black", "red")
call writePrices(objDict)
Response.write "<tr class=""tabellhuvud""><td width=""60"" height=""18"" class=""tabellhuvud""></td><td width=""250"" class=""tabellhuvud""></td><td width=""45"" class=""tabellhuvud"">Summa</td><td width=""75"" class=""tabellhuvud"">" & FormatCurrency(lngTotalSolar) & "</td><td width=""75"" class=""tabellhuvud"">" & FormatCurrency(lngTotalStorel) & "</td><td width=""75"" class=""tabellhuvud""></td><td width=""60"" class=""tabellhuvud""></td><td width=""50"" class=""tabellhuvud""></td></tr>"
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 onMouseOver=""this.style.backgroundColor='#D3DEF8';"" onMouseOut=""this.style.backgroundColor='';"" bgcolor=""" & bgcolor & """><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""><a href=""removeArticle.asp?eNumber=" & objPricesDict.Item("eNumber") & """><img src=""../Images/soptunna.gif"" alt=""Klicka här för att lägga till artikeln!"" width=""31"" height=""17"" border=""0""></a></td>"
end sub
Else
Response.Write "Ej inloggad"
End if
%>
</body>
</html>
Mvh
Du har ju någon kontroll om det kommer flera likadana ENumber efter varandra
if strENumber <> strLastEnumber then
Det är väl där du får ändra så att det passar.
:(
Vetifan om jag reder ut det där skriptet... Har fått jättemycket hjälp av bla @nders. Tack! Problemet nu är att jag bygger på det med nya funktioner som krockar med andra och jag själv har inte tillräcklig kunskap för att reda ut det....
Känns som jag får börja om och ställa specifikationen för hur det ska fungera innan jag börjar koda... och läsa på mer.... eller göra det simpelt och enkelt.
Om någon vill hjälpa mig är det bara att höra av sig...
Tack alla som hjäpt till!
:x :x :x
Jag förstår inte riktigt vad du är ute efter... Men:
Problemet är att om jag lagt till samma artikel 2 gånger (dublett i databas) så visas bara en i presentationen.
Så hade jag inte gjort. Ligger artikeln redan i kundvagnen skulle jag uppdaterat antalet på den posten i tabellen, inte lägga till en ny post. Det är kanske där du ska börja?
Mvh
Hej du barmhärtige människa.... :)
Jo, jag har tänkt på det och även tänkt åtgärda det. Och det är väl rätt väg att gå.
Men jag kände på att det kanske skulle bli ett "inbyggt fel" om man inte åtgärdar det....
Som sagt. Mina ideér är större än kunskaperna...
Men det är väl i cart.asp som posterna skall uppdateras istället för att läggas till om de redan finns där.
MEN (detta ständiga men)
Hur gör jag för att uppdatera en post och samtidigt ha kvar de antal som redan finns i kundvagnen
Dvs ta om antalet av en vara i kundvagnen är 3 så lägger jag till en till
Efter uppdateringen skall det vara 4 i kundvagnen
Jag får trösta mig med att jag inte behöver ställa 2 frågor på samma sak eftersom jag lär mig hela tiden.... Det är dock mycket kvar att lära!
mvh
En mycket frustrerad
devotion skrev:
... Jo, jag har tänkt på det och även tänkt åtgärda det. Och det är väl rätt väg att gå. ...
Ja. I en relationsdatabas (vilket du använder) ska man inte lagra dubbletter.
Hur gör jag för att uppdatera en post och samtidigt ha kvar de antal som redan finns i kundvagnen
http://www.webforum.nu/showthread.php?s=&postid=994544#post994544
I din UPDATE kan du ju alltid skriva, exempel:
UPDATE tbl SET fält = fält + 1 WHERE fält = värde
mvh
Med risk för att vara övertydlig:
@nders skrev:
... I din UPDATE kan du ju alltid skriva, exempel:
UPDATE tbl SET fält = fält + 1 WHERE fält = värde
Troligtvis vill du nog använda ett annat fält i Where-klausulen än i set-delen, dock... Annars uppdateras alla varor i den kvantiteten samtidigt....
Alltså exempel:
UPDATE tbl SET kvantitet = kvantitet + 1 WHERE produktnr = värde