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....
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
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
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
<%
'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... ;)
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>"