webForumDet fria alternativet

Dictionary eller nått annat fint

40 svar · 1 449 visningar · startad av devotion

devotionMedlem sedan jan. 20013 582 inlägg
#1

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
#2

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
#3

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
#4

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.

devotionMedlem sedan jan. 20013 582 inlägg
#5

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
#6

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

devotionMedlem sedan jan. 20013 582 inlägg
#7

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
#8

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

emissionMedlem sedan dec. 19996 721 inlägg
#9

My bad, jag klippte bort den.

devotionMedlem sedan jan. 20013 582 inlägg
#10

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

devotionMedlem sedan jan. 20013 582 inlägg
#11

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
#12

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
devotionMedlem sedan jan. 20013 582 inlägg
#13

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
#14

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
#15

: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
#16

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

devotionMedlem sedan jan. 20013 582 inlägg
#17

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
#18

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>"
emissionMedlem sedan dec. 19996 721 inlägg
#19

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
#20

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

Mvh
Henrik

141 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)