devotionMedlem sedan jan. 20013 582 inlägg 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 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 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 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
@ndersMedlem sedan juni 200032 969 inlägg 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 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
@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 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
@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 Snabba tankar:
- 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).
- 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 Ska se om jag kan lyckas med detta...
Tackar!
:)
devotionMedlem sedan jan. 20013 582 inlägg
@nders skrev:
Snabba tankar:
- 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).
- 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
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 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