devotionMedlem sedan jan. 20013 582 inlägg Hej :(
Skulle bli väldans glad om någon kunde hjälpa mig med detta...
Har följande kod som loopar ut artiklar
<%
'Deklarera variabler
'*******************
Dim objConn, objRS, objDict, sSQL, dArticlePrice, sCategoryName, sArticleNumber, sArticleName, sArticleUnit, iSupplierId, sSupplierName
' Öppna databasen
' ***************
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString = Application("sConn")
objConn.Open
sSQL = "SELECT tblArticle.articleName, tblArticle.articleUnit, tblPrice.articlePrice, tblSupplier.SupplierName, " &_
"tblCart.articleAmount, tblSupplier.SupplierId, tblCategory.CategoryName, tblPrice.articleNumber " &_
"FROM tblArticle " &_
"INNER JOIN tblPrice ON tblArticle.articlenumber = tblPrice.articleNumber " &_
"INNER JOIN tblSupplier ON tblPrice.articleSupplierId = tblSupplier.SupplierId " &_
"INNER JOIN tblCart ON tblArticle.articleName = tblCart.articleName " &_
"INNER JOIN tblCategory ON tblPrice.articleSupplierId = tblCategory.supplierId AND tblPrice.articleCategoryNumber = tblCategory.categoryNumber " &_
"ORDER BY tblPrice.articlePrice"
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open sSQL, objConn, 3, 1
Do while not objRS.EOF
dArticlePrice = cdbl(objRS("articlePrice"))
sCategoryName = objRS("CategoryName")
sArticleNumber = objRS("articleNumber")
sArticleName = objRS("articleName")
sArticleUnit = objRS("articleUnit")
iSupplierId = objRS("SupplierId")
sSupplierName = objRS("SupplierName")
dArticlePrice = objRS("articlePrice")
Response.write "Artikelnummer: " & sArticleNumber & " Artikelbenämning: " & sArticleName & " Leverantör: " & sSupplierName & " Pris: " & dArticlePrice & "<br>"
objRS.MoveNext
Loop
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
%>
Resultatet blir:
http://80.73.182.130/testscript/dictionary.asp
Kan man inte använda dictionaryobjeketet och göra så resultatet blir så här:
http://80.73.182.130/testscript/resultat.asp
eller ännu hellre slippa listrutorna och göra så det blir så här:
http://80.73.182.130/testscript/ruta.asp
enligt denna tråd:
http://www.webforum.nu/showthread.php?p=1198146#post1198146
Är mycket tacksam för en spark i rätt riktning.. :)
Mvh
Henrik
emissionMedlem sedan dec. 19996 721 inlägg Vilka datamängder talar vi om? Kommer det oftast att röra sig om 2 produkter? 100? 1000?
devotionMedlem sedan jan. 20013 582 inlägg Om du med datamängder menar antalet artiklar i listan, kan det kanske röra sig om 100-200 max. Tanken är ju ett prisjämförelsesystem. Tex dra el i ett garage... Välja de artiklar som behövs och på så sätt få fram den billigaste leverantörern....
MVH
Henrik
emissionMedlem sedan dec. 19996 721 inlägg Ok, ja då kan det vara funkis med ett par Dictionaries.
Loopa igenom resultatet och bygg samtidigt upp tre Dictionaries.
set suppliers=CreateObject("Scripting.Dictionary")
set articles=CreateObject("Scripting.Dictionary")
set supplierarticles=CreateObject("Scripting.Dictionary")
Do while not objRS.EOF
suppliers(cstr(objRS("SupplierId"))) = cstr(objRS("SupplierName"))
articles(cstr(objRS("articleName"))) = cstr(objRS("articleUnit"))
key=cstr(objRS("SupplierId")) & vbTab & cstr(objRS("articleName"))
if not supplierarticles.Exists(key) then
supplierarticles(key)=CreateObject("Scripting.Dictionary")
end if
supplierarticles(key)(cstr(objRS("articleNumber")))=cdbl(objRS("articlePrice"))
response.write "<table><tr><td>Artikelbenämning</td><td>Enhet</td>"
for each supplierId in suppliers
response.write "<td>" & suppliers(supplierId) & "</td>"
next
response.write "</tr>"
for each article in articles
response.write "<tr><td>" & article & "</td><td>" & articles(article) & "<td>"
for each supplierId in suppliers
response.write "<td>"
key=supplierId & vbTab & article
if not supplierarticles.Exists(key) then
response.write " "
else
for each supplierarticle in supplierarticles(key)
response.write supplierarticle & ":" & supplierarticles(key)(supplierarticle) & "<br>"
next
end if
response.write "</td>
next
response.write "</tr>"
next
response.write "</table>"
Loop
Med reservation för syntaxfel.
devotionMedlem sedan jan. 20013 582 inlägg Gud hör bön..;)
Tack så mycket emission...
Men jag fick följande fel:
Feltyp:
Körningsfel i Microsoft VBScript (0x800A01C2)
Fel antal argument eller felaktig egenskapstilldelning.
/testscript/dictionary.asp, line 43
Rad 43:
supplierarticles(key)=CreateObject("Scripting.Dictionary")
Mvh
Henrik
emissionMedlem sedan dec. 19996 721 inlägg set supplierarticles(key)=CreateObject("Scripting.Dictionary")
devotionMedlem sedan jan. 20013 582 inlägg aha! Okej!
Nu fick jag detta felmeddelande:
Feltyp:
Response-objekt, ASP 0104 (0x80070057)
Operationen är inte tillåten
/testscript/dictionary.asp
http://80.73.182.130/testscript/dictionary.asp
Vad betyder det?
Mvh
Henrik
@ndersMedlem sedan juni 200032 969 inlägg Det kanske betyder att du glömt movenext i din loop? :)
emissionMedlem sedan dec. 19996 721 inlägg My bad, jag klippte bort den.
devotionMedlem sedan jan. 20013 582 inlägg Jo det var det ju... :r
Ska titta lite på resultatet.. det är siffror och text överallt:
http://80.73.182.130/testscript/dictionary.asp
Koden ser ut så här:
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open sSQL, objConn, 3, 1
set suppliers=CreateObject("Scripting.Dictionary")
set articles=CreateObject("Scripting.Dictionary")
set supplierArticles=CreateObject("Scripting.Dictionary")
Do while not objRS.EOF
suppliers(cstr(objRS("SupplierId"))) = cstr(objRS("SupplierName"))
articles(cstr(objRS("articleName"))) = cstr(objRS("articleUnit"))
key=cstr(objRS("SupplierId")) & vbTab & cstr(objRS("articleName"))
if not supplierarticles.Exists(key) then
set supplierArticles(key)=CreateObject("Scripting.Dictionary")
end if
supplierArticles(key)(cstr(objRS("articleNumber")))=cdbl(objRS("articlePrice"))
response.write "<table><tr><td>Artikelbenämning</td><td>Enhet</td>"
for each supplierId in suppliers
response.write "<td>" & suppliers(supplierId) & "</td>"
next
response.write "</tr>"
for each article in articles
response.write "<tr><td>" & article & "</td><td>" & articles(article) & "<td>"
for each supplierId in suppliers
response.write "<td>"
key=supplierId & vbTab & article
if not supplierArticles.Exists(key) then
response.write " "
else
for each supplierarticle in supplierarticles(key)
response.write supplierarticle & ":" & supplierarticles(key)(supplierarticle) & "<br>"
next
end if
response.write "</td>"
next
response.write "</tr>"
next
objRs.MoveNext
Loop
response.write "</table>"
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
Mvh
Henrik
devotionMedlem sedan jan. 20013 582 inlägg Det ser lite struligt ut.... ska det inte bara vara två rader.... Det är ju bara två artiklar.
Sen är det nog lite förskjutet i sidled....
Men. grunden verakr vara där iaf... (Y) :)
Lade till en css för lite bättre läsbarhet..
Mvh
Henrik
emissionMedlem sedan dec. 19996 721 inlägg Loopen hamnade ju lite snett...sorry
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open sSQL, objConn, 3, 1
set suppliers=CreateObject("Scripting.Dictionary")
set articles=CreateObject("Scripting.Dictionary")
set supplierArticles=CreateObject("Scripting.Dictionary")
Do while not objRS.EOF
suppliers(cstr(objRS("SupplierId"))) = cstr(objRS("SupplierName"))
articles(cstr(objRS("articleName"))) = cstr(objRS("articleUnit"))
key=cstr(objRS("SupplierId")) & vbTab & cstr(objRS("articleName"))
if not supplierarticles.Exists(key) then
set supplierArticles(key)=CreateObject("Scripting.Dictionary")
end if
supplierArticles(key)(cstr(objRS("articleNumber")))=cdbl(objRS("articlePrice"))
objRs.MoveNext
Loop
response.write "<table><tr><td>Artikelbenämning</td><td>Enhet</td>"
for each supplierId in suppliers
response.write "<td>" & suppliers(supplierId) & "</td>"
next
response.write "</tr>"
for each article in articles
response.write "<tr><td>" & article & "</td><td>" & articles(article) & "<td>"
for each supplierId in suppliers
response.write "<td>"
key=supplierId & vbTab & article
if not supplierArticles.Exists(key) then
response.write " "
else
for each supplierarticle in supplierarticles(key)
response.write supplierarticle & ":" & supplierarticles(key)(supplierarticle) & "<br>"
next
end if
response.write "</td>"
next
response.write "</tr>"
next
response.write "</table>"
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
devotionMedlem sedan jan. 20013 582 inlägg Weeee!
Nu blir det ju kanon! :)
Men varför är tabellrubrikerna förskjutna? Annars är det ju perfekt! (y)
http://80.73.182.130/testscript/dictionary.asp
Mvh
Henrik
@ndersMedlem sedan juni 200032 969 inlägg Borde inte:
& article & "</td><td>" & articles(article) & [b]"<td>"[/b]
vara:
& article & "</td><td>" & articles(article) & [b]"</td>"[/b]
?
devotionMedlem sedan jan. 20013 582 inlägg :r
Givetvis.....
Funkar finfint... Man blir nästan tårögd.... (y) (y)
Tack emission och @nders....
Mvh
Henrik
devotionMedlem sedan jan. 20013 582 inlägg Hej igen!
Nu ser koden ut så här:
<%
'Deklarera variabler
'*******************
Dim objConn, objRS, objDict, sSQL, sSuppliers, sSupplierArticles, sArticles, sKey, iSupplierId, sArticle, sSupplierarticle
' Öppna databasen
' ***************
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString = Application("sConn")
objConn.Open
sSQL = "SELECT tblArticle.articleName, tblArticle.articleUnit, tblPrice.articlePrice, tblSupplier.SupplierName, " &_
"tblCart.articleAmount, tblSupplier.SupplierId, tblCategory.CategoryName, tblPrice.articleNumber " &_
"FROM tblArticle " &_
"INNER JOIN tblPrice ON tblArticle.articlenumber = tblPrice.articleNumber " &_
"INNER JOIN tblSupplier ON tblPrice.articleSupplierId = tblSupplier.SupplierId " &_
"INNER JOIN tblCart ON tblArticle.articleName = tblCart.articleName " &_
"INNER JOIN tblCategory ON tblPrice.articleSupplierId = tblCategory.supplierId AND tblPrice.articleCategoryNumber = tblCategory.categoryNumber " &_
"ORDER BY tblPrice.articlePrice"
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open sSQL, objConn, 3, 1
set sSuppliers=CreateObject("Scripting.Dictionary")
set sArticles=CreateObject("Scripting.Dictionary")
set sSupplierArticles=CreateObject("Scripting.Dictionary")
Do while not objRS.EOF
sSuppliers(cstr(objRS("SupplierId"))) = cstr(objRS("SupplierName"))
sArticles(cstr(objRS("articleName"))) = cstr(objRS("articleUnit"))
sKey=cstr(objRS("SupplierId")) & vbTab & cstr(objRS("articleName"))
if not sSupplierarticles.Exists(sKey) then
set sSupplierArticles(sKey)=CreateObject("Scripting.Dictionary")
end if
sSupplierArticles(sKey)(cstr(objRS("articleNumber")))=cdbl(objRS("articlePrice"))
objRs.MoveNext
Loop
response.write "<table border='1'><tr><td>Artikelbenämning</td><td>Enhet</td>"
for each iSupplierId in sSuppliers
response.write "<td>" & sSuppliers(iSupplierId) & "</td>"
next
response.write "</tr>"
for each sArticle in sArticles
response.write "<tr><td>" & sArticle & "</td><td>" & sArticles(sArticle) & "</td>"
for each iSupplierId in sSuppliers
response.write "<td>"
skey=iSupplierId & vbTab & sArticle
if not sSupplierArticles.Exists(sKey) then
response.write " "
else
for each sSupplierarticle in sSupplierarticles(sKey)
response.write sSupplierarticle & ":" & sSupplierarticles(sKey)(sSupplierarticle) & "<br>"
next
end if
response.write "</td>"
next
response.write "</tr>"
next
response.write "</table>"
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
set sSuppliers = Nothing
set sArticles = Nothing
set sSupplierArticles = Nothing
%>
Funkar kanon!
Emission! Om du har tid och lust får du gärna kommentera koden, vad den gör så att säga. Så jag lär mig något och sliper fråga igen... ;)
Tack igen! Webforum rockar..(y)
Mvh
Henrik
devotionMedlem sedan jan. 20013 582 inlägg Hmmm.. kom på en sak... :)
Om jag vill ha med artikelkategorin också... categoryName Hur gör jag för att lägga till den informationen i
sArticles(cstr(objRS("articleName"))) = cstr(objRS("articleUnit"))
och
for each sSupplierarticle in sSupplierarticles(sKey)
response.write sSupplierarticle & ":" & sSupplierarticles(sKey)(sSupplierarticle) & "<br>"
next
Mvh
Henrik
emissionMedlem sedan dec. 19996 721 inlägg
devotion skrev:
Emission! Om du har tid och lust får du gärna kommentera koden, vad den gör så att säga. Så jag lär mig något och sliper fråga igen... ;)
Självklart! Rätt inställning!
'Skapa tre dictionaries
'Detta ska innehålla leveratörerna
set sSuppliers=CreateObject("Scripting.Dictionary")
'Detta ska innehålla artiklarna
set sArticles=CreateObject("Scripting.Dictionary")
'Detta ska innehålla leveratörernas artiklar
set sSupplierArticles=CreateObject("Scripting.Dictionary")
'Loopa igenom recordset för att fylla på "dictionarierna" :)
Do while not objRS.EOF
'Stoppa in en leverantör, med SupplierId som nyckel. Om samma leverantör kommer flera gånger i recordsetet så skriver den bara över. Ingen ny rad läggs till.
sSuppliers(cstr(objRS("SupplierId"))) = cstr(objRS("SupplierName"))
'Stoppa in en artikel, med articleName (i brist på annan identifierare) som nyckel. Om samma artikel kommer flera gånger i recordsetet så skriver den bara över. Ingen ny rad läggs till.
'Värdet sätter vi till articleUnit
sArticles(cstr(objRS("articleName"))) = cstr(objRS("articleUnit"))
'Skapa en nyckel som är sammansatt av SupplierId och articleName. Avgränsa med en Tab, så att t.ex. SupplierId=1,articleName="11" skiljer sig från SupplierId=11,articleName="1"
sKey=cstr(objRS("SupplierId")) & vbTab & cstr(objRS("articleName"))
'Detta dictionary (sSupplierarticles) innehåller i sin tur flera egna dictionaries, eftersom en leverantör kan ha flera olika artiklar relaterade till gällande articleName
'Om det är första gången, skapa ett nytt dictionary
if not sSupplierarticles.Exists(sKey) then
set sSupplierArticles(sKey)=CreateObject("Scripting.Dictionary")
end if
'Lägg till en rad, med articleNumber som nyckel och priset som värde
sSupplierArticles(sKey)(cstr(objRS("articleNumber")))=cdbl(objRS("articlePrice"))
objRs.MoveNext
Loop
'Starta tabellen
response.write "<table border='1'><tr><td>Artikelbenämning</td><td>Enhet</td>"
'Loopa igenom alla leverantörer. När man kör "for each" på Scripting.Dictionary så får man nyckelvärdet som iterationsvariabel, i detta fall det SupplierId som vi stoppade in
for each iSupplierId in sSuppliers
response.write "<td>" & sSuppliers(iSupplierId) & "</td>"
next
response.write "</tr>"
'Loopa igenom artiklarna
for each sArticle in sArticles
response.write "<tr><td>" & sArticle & "</td><td>" & sArticles(sArticle) & "</td>"
'Loopa än en gång igenom leverantörerna, för att bygga tabellen i sidled
for each iSupplierId in sSuppliers
response.write "<td>"
'Återskapa nyckeln som plockar fram den specifika artikellistan
skey=iSupplierId & vbTab & sArticle
'Det är ju tänkbart att leverantören inte lagerför artikeln, och i så fall måste vi hantera det. Dictionaryt blir gramse om man försöker plocka ut ett värde som inte finns, därav Exists.
if not sSupplierArticles.Exists(sKey) then
response.write " "
else
'Tjoho! Det fanns artiklar! Låtom oss loopa igenom dessa.
'I stället för att köra med sSupplierarticles(sKey)(sSupplierarticle) så hade man kunnat mellanlagra
'
'set articleDict=sSupplierarticles(sKey)
'for each sSupplierarticle in articleDict
' response.write sSupplierarticle & ":" & articleDict(sSupplierarticle) & "<br>"
'next
for each sSupplierarticle in sSupplierarticles(sKey)
response.write sSupplierarticle & ":" & sSupplierarticles(sKey)(sSupplierarticle) & "<br>"
next
end if
response.write "</td>"
next
response.write "</tr>"
next
'Over and out
response.write "</table>"
emissionMedlem sedan dec. 19996 721 inlägg
devotion skrev:
Hmmm.. kom på en sak... :)
Om jag vill ha med artikelkategorin också... categoryName Hur gör jag för att lägga till den informationen i
sArticles(cstr(objRS("articleName"))) = cstr(objRS("articleUnit"))
och
for each sSupplierarticle in sSupplierarticles(sKey)
response.write sSupplierarticle & ":" & sSupplierarticles(sKey)(sSupplierarticle) & "<br>"
next
Mvh
Henrik
sArticles(cstr(objRS("articleName"))) = Array(cstr(objRS("articleUnit")),cstr(objRS("categoryName")))
och därefter plockar du ut enheten med
sArticles(sArticle)(0)
och kategorin med
sArticles(sArticle)(1)
devotionMedlem sedan jan. 20013 582 inlägg Tack för det... då ska jag se om jag lyckas lägga till categoryName, enligt mitt förra inlägg..;)
Mvh
Henrik