---
title: "Dictionary eller nått annat fint"
type: "forum-thread"
url: "https://www.webforum.nu/amne/asp/147457-dictionary-eller-nått-annat-fint"
topic: "ASP"
topic_url: "https://www.webforum.nu/amne/asp"
author: "devotion"
published: "2006-05-29T20:45:29.000Z"
updated: "2006-07-26T20:37:59.000Z"
replies: 40
views: 1474
page: 1
pages: 3
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/asp/147457-dictionary-eller-nått-annat-fint"
---

# Dictionary eller nått annat fint

_Sida 1 av 3._

## #1 — devotion, 2006-05-29T20:45Z

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

Permalänk: https://www.webforum.nu/p/147457

## #2 — emission, 2006-05-29T22:05Z

Vilka datamängder talar vi om? Kommer det oftast att röra sig om 2 produkter? 100? 1000?

Permalänk: https://www.webforum.nu/p/1821531

## #3 — devotion, 2006-05-29T22:09Z

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

Permalänk: https://www.webforum.nu/p/1821532

## #4 — emission, 2006-05-29T22:44Z

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 "&nbsp;"
			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.

Permalänk: https://www.webforum.nu/p/1821533

## #5 — devotion, 2006-05-30T07:20Z

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

Permalänk: https://www.webforum.nu/p/1821559

## #6 — emission, 2006-05-30T09:55Z

**set** supplierarticles(key)=CreateObject("Scripting.Dictionary")

Permalänk: https://www.webforum.nu/p/1821599

## #7 — devotion, 2006-05-30T10:37Z

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

Permalänk: https://www.webforum.nu/p/1821606

## #8 — @nders, 2006-05-30T10:48Z

Det kanske betyder att du glömt movenext i din loop? :)

Permalänk: https://www.webforum.nu/p/1821609

## #9 — emission, 2006-05-30T11:31Z

My bad, jag klippte bort den.

Permalänk: https://www.webforum.nu/p/1821621

## #10 — devotion, 2006-05-30T11:36Z

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 "&nbsp;"
			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

Permalänk: https://www.webforum.nu/p/1821622

## #11 — devotion, 2006-05-30T11:43Z

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

Permalänk: https://www.webforum.nu/p/1821625

## #12 — emission, 2006-05-30T12:09Z

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 "&nbsp;"
			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
```

Permalänk: https://www.webforum.nu/p/1821639

## #13 — devotion, 2006-05-30T12:32Z

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

Permalänk: https://www.webforum.nu/p/1821647

## #14 — @nders, 2006-05-30T12:42Z

Borde inte:

```
& article & "</td><td>" & articles(article) & [b]"<td>"[/b]
```

vara:

```
& article & "</td><td>" & articles(article) & [b]"</td>"[/b]
```

?

Permalänk: https://www.webforum.nu/p/1821653

## #15 — devotion, 2006-05-30T12:47Z

:r

Givetvis.....

Funkar finfint... Man blir nästan tårögd.... (y) (y)  

Tack emission och @nders....

Mvh
Henrik

Permalänk: https://www.webforum.nu/p/1821657

## #16 — devotion, 2006-05-30T17:51Z

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 "&nbsp;"
			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

Permalänk: https://www.webforum.nu/p/1821795

## #17 — devotion, 2006-05-30T19:57Z

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

Permalänk: https://www.webforum.nu/p/1821870

## #18 — emission, 2006-05-30T20:26Z

> **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 "&nbsp;"
			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>"
```

Permalänk: https://www.webforum.nu/p/1821882

## #19 — emission, 2006-05-30T20:31Z

> **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)
```

Permalänk: https://www.webforum.nu/p/1821885

## #20 — devotion, 2006-05-30T20:32Z

Tack för det... då ska jag se om jag lyckas lägga till categoryName, enligt mitt förra inlägg..;)  

Mvh
Henrik

Permalänk: https://www.webforum.nu/p/1821886

---

Tråden på webben: https://www.webforum.nu/amne/asp/147457-dictionary-eller-nått-annat-fint  
Nästa sida: https://www.webforum.nu/amne/asp/147457-dictionary-eller-nått-annat-fint/page2.md
