webForumDet fria alternativet

Loopa ut tabell

ASPur ASP

14 svar · 700 visningar · startad av devotion

devotionMedlem sedan jan. 20013 582 inlägg
#1

Hej :)

Följande kod loopar ut en tabell:

	Dim Conn, RsPriceListName, RsArticle
	Dim sSQLPriceListName, sSQLArticle

	Set Conn = CreateObject( "ADODB.Connection" )
	Conn.Open Application.sDbConnectionString

	Set RsPriceListName = CreateObject( "ADODB.Recordset" )
	Set Rs = CreateObject( "ADODB.Recordset" )
	
	sSQLPriceListName = "SELECT [Name] AS PriceListName FROM tblPriceList"
	
	RsPriceListName.Open sSQLPriceListName, Conn, 1 
	
	sSQL =" Select a.[Id] AS ArticleId, a.[Name] AS ArticleName, a.[Nr] AS ArticleNo, a.[Unit] AS ArticleUnit," _
		& " p.[Price] AS ArticlePrice, p.[Id] AS PriceId, p.ItemId," _
		& " pl.[Name] AS PriceListName, pl.[Id] AS PriceListId" _
		& " FROM tblArticle a" _
		& " Inner join tblPrice p" _
		& " on a.Id = p.ItemId" _
		& " inner join tblpriceList pl" _
		& " on p.[PriceListId] = pl.[Id]" _
		& " Where p.ItemType = 4" _
		& " AND a.[Nr] = '12744A'" _
		& " ORDER BY a.[Nr]"

	Rs.Open sSQL, Conn, 1 

   ...

dim sPriceLists, sArticles, sPrices
	set sPriceLists=CreateObject("Scripting.Dictionary")
	set sArticles=CreateObject("Scripting.Dictionary")
	set sPrices=CreateObject("Scripting.Dictionary")
	
	Do while not RS.EOF

		sPriceLists(cstr(Rs("PriceListId"))) = cstr(Rs("PriceListName"))
		sArticles(cstr(Rs("ArticleName"))) = cstr(Rs("ArticleUnit"))
		sPrices(cstr(Rs("PriceId"))) = cdbl(Rs("ArticlePrice"))
		Rs.MoveNext
		
	Loop	
	
	response.write "<table border='1'><tr><td>Artikelbenämning</td><td>Enhet</td>"

	for each iPriceListId in sPriceLists
		response.write "<td>" & sPriceLists(iPriceListId) & "</td>"
	next

	response.write "</tr>"

	for each sArticle in sArticles
		response.write "<tr><td>" & sArticle & "</td><td>" & sArticles(sArticle) & "</td>"
		for each price in sPrices
			response.write "<td>" 
				response.write sPrices(price)
			response.write "</td>"
		next
		response.write "</tr>"
	next

	response.write "</table>"

Det funkar nästan...

Om jag bara hämtar en artikel fungerar det. Men när jag vil loopa ut alla, så skrivs alla priser på alla rader. Det skall ju bara skrivas det antalet priser som det finns kopplat till just den artikeln...

Mvh
Henrik

rhdfMedlem sedan okt. 2007446 inlägg
#2

har du testat den där sql-frågan direkt i access?
utan att kolla närmare på den så verkar det som att du pga av din join där får med alla priser på alla varor. jag misstänker att det måste till lite Group By för att du skall få allt rätt

devotionMedlem sedan jan. 20013 582 inlägg
#3

Ingen som har en bra lösning på detta? :)

Eller något annat bra sätt att loopa ut en tabell dynamsikt, dvs både horisontellt och vertikalt?

Mvh
Henrik

devotionMedlem sedan jan. 20013 582 inlägg
#4

Provade lite med:

	prevArticleId = ""
	if rs.eof then
		response.write "tomt!"
	else
		response.write "<table>"
		response.write "<tr><td>Benämning</td><td>Enhet</td><td>Inköp</td><td>Standard</td><td>UE</td></tr>"
		while not rs.eof
			if rs("articleid") <> prevArticleId then
				if prevArticleId <> "" then
					response.write "</tr>"
				end if
				response.write "<tr>"
				response.write "<td>" & rs("articleName") & "</td>"
				response.write "<td>" & rs("ArticleUnit") & "</td>"
				prevArticleId = rs("articleid")
			end if
			response.write "<td>" & rs("PriceListName") & "/" & rs("ArticlePrice") & "</td>"
			rs.movenext
		wend
		response.write "</tr>"
		response.write "</table>"
	end if

Fungerar nästan...

Dock så kan jag inte få ut kolumnrubrikerna dynamsikt samt att de olika priserna byter kolumner enligt bifogad bild... :(

Mvh
Henrik

prislista.png
devotionMedlem sedan jan. 20013 582 inlägg
#5

Ingen?

Mvh
Henrik

@ndersMedlem sedan juni 200032 969 inlägg
#6

Om du lägger till sortering på prislistetyp borde du bli av med "kolumnbytet".
Och vad menar du med att du inte kan få ut rubrikerna dynamiskt?

devotionMedlem sedan jan. 20013 582 inlägg
#7

Hej,

Nu har jag ju hårdkodat in kolumnrubrikerna (prislistorna)

Men, jag vill ju att de skrivs ut mha de namnet som finns i databasen...

Dvs rs("PriceListName")

Mvh
Henrik

devotionMedlem sedan jan. 20013 582 inlägg
#8

@nders skrev:

Om du lägger till sortering på prislistetyp borde du bli av med "kolumnbytet".

Jepp, det löstes mha sorteringen!

:)

Mvh
Henrik

@ndersMedlem sedan juni 200032 969 inlägg
#9

Har alla produkter priser i alla prislistor?

Det här känns som något som programmerare ska hålla på med - inte projektledare. ;)

devotionMedlem sedan jan. 20013 582 inlägg
#10

@nders skrev:

Har alla produkter priser i alla prislistor?

Det behöver de inte ha...

@nders skrev:

Det här känns som något som programmerare ska hålla på med - inte projektledare. ;)

Så hade det varit i den bästa av världar... :e

Mvh
Henrik

@ndersMedlem sedan juni 200032 969 inlägg
#11

Snabba tankar:

  1. Loopa ut rubrikrad med alla prislistenamn. När du gör detta, spara ner någonstans en referens till vilken kolumn vilken prislista ligger i. (prisliste-id -> kolumnindex).
  2. När du loopar ut produkterna slår du upp i ditt "någonstans" vilken kolumn du ska visa priset i. Är det inte den kolumnen det är dags att skriva ut, ja då är det dax att slänga fram en tom kolumn eller två.

Sen finns det säkert ett antal andra fina sätt att lösa det på, som antagligen är enklare...

devotionMedlem sedan jan. 20013 582 inlägg
#12

Ska se om jag kan lyckas med detta...

Tackar!

:)

devotionMedlem sedan jan. 20013 582 inlägg
#13

@nders skrev:

Snabba tankar:

  1. Loopa ut rubrikrad med alla prislistenamn. När du gör detta, spara ner någonstans en referens till vilken kolumn vilken prislista ligger i. (prisliste-id -> kolumnindex).
  2. När du loopar ut produkterna slår du upp i ditt "någonstans" vilken kolumn du ska visa priset i. Är det inte den kolumnen det är dags att skriva ut, ja då är det dax att slänga fram en tom kolumn eller två.

Sen finns det säkert ett antal andra fina sätt att lösa det på, som antagligen är enklare...

:(

Du har inte lust att ta det lite mer detaljrikt....?

Ska jag skapa 2 recordset?

Mvh
Henrik

@ndersMedlem sedan juni 200032 969 inlägg
#14

Ska jag skapa 2 recordset?

Det hade jag tänkt mig. :)
Jag har lust att göra det mer detaljrikt. Jag skulle kunna tänka mig att bota cancer och rädda världen, men jag har inte tid till allt dessvärre. ;)

devotionMedlem sedan jan. 20013 582 inlägg
#15

Hej! :)

Skam den som ger sig... (Även om man bara är projektledare... ;) )

Jag har nu följande kod som gör det jag vill, till acceptabel prestanda:

	Dim Conn, RsPriceList, RsArticle
	Dim sSQLPriceList, sSQLArt

	Set Conn = CreateObject( "ADODB.Connection" )
	Conn.Open Application.sDbConnectionString

	Set RsPriceList = CreateObject( "ADODB.Recordset" )
	Set RsArt = CreateObject( "ADODB.Recordset" )
	
	sSQLPriceList=" SELECT [Name] AS PriceListName, [Id] AS PriceListId" _
				& " FROM tblPriceList" _
				& " ORDER BY [Name]"
	
	RsPriceList.Open sSQLPriceList, Conn, 1 
	
	sSQLArt =" Select a.[Id] AS ArticleId, a.[Name] AS ArticleName, a.[Nr] AS ArticleNo, a.[Unit] AS ArticleUnit," _
		& " p.[Price] AS ArticlePrice, p.[Id] AS PriceId, p.ItemId," _
		& " pl.[Name] AS PriceListName, pl.[Id] AS PriceListId" _
		& " FROM tblArticle a" _
		& " Inner join tblPrice p" _
		& " on a.Id = p.ItemId" _
		& " inner join tblpriceList pl" _
		& " on p.[PriceListId] = pl.[Id]" _
		& " Where a.[Id] IN (<ARTICLES><Article.Id>,</ARTICLES>-1)" _
		& " AND p.ItemType = 4" _
		& " ORDER BY a.[Nr], pl.[Name]"
	RsArt.Open sSQLArt, Conn, 1 

        ...

	dim dic
	dim lPrevArticleId

	set dic = createobject("scripting.dictionary")
	dic.comparemode = 1

	lPrevArticleId = ""

	'Skapa dictionary
	while not rsart.eof 
	   dic("PriceList" & rsart("PriceListId") & "Article" & rsart("ArticleId") & "ArticlePrice") = rsart("ArticlePrice")
	   rsart.movenext
	wend	

	'Skapa tabell
	response.write "<table>"
	response.write "<tr><td><b>Benämning</b></td><td><b>Enhet</b></td>"

	'Skapa tabell header
	while not rspriceList.eof 
	   response.write "<td><b>" & RsPriceList("PriceListName") & "</b></td>"
	   rspriceList.movenext
	wend

	response.write "</tr>"

	rsart.movefirst
	rspriceList.movefirst

	'Loopa ut alla artiklar
	while not rsart.eof 
		if RsArt("articleid") <> lPrevArticleId then
			if lPrevArticleId <> "" then
				response.write "</tr>"
			end if
			response.write "<tr>"
			Response.write "<td>" & rsart("ArticleName") & "</td><td>" & rsart("ArticleUnit") & "</td>"
			lPrevArticleId = RsArt("articleid")
		
			while not rspriceList.eof 
				response.write "<td>"
				response.write dic("PriceList" & rspriceList("PriceListId") & "Article" & rsart("ArticleId") & "ArticlePrice")
				response.write "</td>"
				rspriceList.movenext
			wend
		end if
		rspriceList.movefirst
		response.write "</tr>"
		rsart.movenext
	wend

	response.write "</table>"

Är detta funkisch, eller kan man förbättra något?

Jag hade ju helst velat ha endast ett recordset, som i mitt första inlägg, men, det har jag inte lyckats lösa...

Synpunkter tack!

Mvh
Henrik

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