webForumDet fria alternativet

lista i ASP

ASP

21 svar · 1 200 visningar · startad av Sanji

Medlem sedan juli 2009355 inlägg
Frågan#1

Hej! jag har gjort en lista i asp som hämtar data ur två olika tabeller. Den ena hämtar motorcykelmärken och skapar en rad i en html-tabell för varje märke, och den andra hämtar alla motorcykelmodeller där fältet "Prio = 1".

Det funkar bra och visar en lista med märken och modeller, men problemet jag har är att den skapar en rad i tabellen för motorcykelmärken som inte har några modeller med "prio = 1". jag vill bara visa de märken som har modeller med "prio=1", här nedan följer min kod på själva tabellen:

<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" WIDTH="100%">
<%
Set Recset = server.CreateObject("ADODB.recordset")

sel = "select * FROM RegisterMarken"

								
Recset.open sel, connect
DO UNTIL RecSet.EOF
	%>
	<TR>
	 <TD WIDTH="100" CLASS="brod"> <%=RecSet("Name")%></TD>
	 <TD ALIGN="center" CLASS="brod">Prio </TD>
	 <TD ALIGN="center" CLASS="brod"> Antal</TD>
	 <TD ALIGN="center" CLASS="brod">90</TD>
	 <TD ALIGN="center" CLASS="brod">91</TD>
	 <TD ALIGN="center" CLASS="brod">92</TD>
	 <TD ALIGN="center" CLASS="brod">93</TD>
	 <TD ALIGN="center" CLASS="brod">94</TD>
	 <TD ALIGN="center" CLASS="brod">95</TD>
	 <TD ALIGN="center" CLASS="brod">96</TD>
	 <TD ALIGN="center" CLASS="brod">97</TD>
	 <TD ALIGN="center" CLASS="brod">98</TD>
	 <TD ALIGN="center" CLASS="brod">99</TD>
	 <TD ALIGN="center" CLASS="brod">00</TD>
	 <TD ALIGN="center" CLASS="brod">01</TD>
	 <TD ALIGN="center" CLASS="brod">02</TD>
	 <TD ALIGN="center" CLASS="brod">03</TD>
	 <TD ALIGN="center" CLASS="brod">04</TD>
	</TR>

Tabellen som märkena ligger i heter : RegisterMarken

Tabellen som modellerna ligger i heter: RegisterModell

här finns prio-fälten.

hur kan jag göra så att utskriften av märkena som finns i RegisterMarken sker endast då prio=1 i tabellen ReisterModell stämmer?

MVH. Marcus

Medlem sedan feb. 200476 inlägg
#2

Nån form av JOIN borde ju funka.

select * FROM RegisterMarken LEFT JOIN RegisterModell ON RegisterMarken.Tillverkare = RegisterModell.Tillverkare WHERE RegiterModell.Prio = 1
Medlem sedan juli 2009355 inlägg
#3

Jag är nu tillbaka från semestern, jag ska testa detta och återkommer med svar!

Medlem sedan juli 2009355 inlägg
#4

Hmm...

jag tycker att detta borde funka, men om jag använder LEFT JOIN så listas endast några märken upp och inget annat, och då jag bara använder JOIN så får jag detta felmeddelande: [Microsoft][ODBC Microsoft Access Driver] Syntax error in FROM clause. Någon som har någon idé? jag ska testa mig fram lite så länge...

min sql-rad ser ut så här för tillfället:

sel = "SELECT * FROM RegisterMarken JOIN RegisterModell ON RegisterMarken.Name = RegisterModell.Marke WHERE RegisterModell.Prio = 1"

Det är en till sak som stör mig... om man gör på det här sättet så kommer det bli en grafisk tabellrad för varje motorcykel, ex. kawasaki-motorcyklar sorteras inte under kawasaki utan det blir en ny kawasakirubrik för varje kawasaki-motorcykel.

Medlem sedan dec. 20025 483 inlägg
#5

Byt JOIN till INNER JOIN -- samma sak men annan syntax.

Medlem sedan juli 2009355 inlägg
#6

Tack

tack för hjälpen, men är det någon som har en lösning till mitt andra problem?

Det är en till sak som stör mig... om man gör på det här sättet så kommer det bli en grafisk tabellrad för varje motorcykel, ex. kawasaki-motorcyklar sorteras inte under kawasaki utan det blir en ny kawasakirubrik för varje kawasaki-motorcykel.

jag vill ha endast EN tabellrad för varje märke.

Medlem sedan mars 2009452 inlägg
#7

Studera detta exempel... och gör dig själv en tjänst och överväg att undvika frestelsen att skriva "SELECT stjärna"! :-)

SELECT u.intID, u.strFirstName, u.strLastName FROM [users] u ORDER BY u.strLastname, u.strFirstname;

Det finns ingen anledning till att skriva select stjärna och det är bara nybörjare som gör det också, alternativt folk som av någon anledning vill... bara för de inte orkar skriva eller vad som helst!?

Oavsett vilket, det är sämsta alternativet alla kategorier! :-)

Medlem sedan juni 20003 076 inlägg
#8

Eftersom ett märke kan ha flera modeller så visas märket logiskt flera gånger (en för varje modell).
Om du vill ha ex:
Märke 1
Modell 1
Modell 2
Märke 2
...

så får du kolla i loopen om du redan skrivit ut märket eller ej.

Dim manufacter
manufacter = ""
DO UNTIL RecSet.EOF
     If manufacter <> RecSet("Namn") Then
          Response.Write(RecSet("Namn"))
          manufacter = RecSet("Namn")
     End If
...
Medlem sedan juni 20003 076 inlägg
#9

preben skrev:

Studera detta exempel... och gör dig själv en tjänst och överväg att undvika frestelsen att skriva "SELECT stjärna"! :-)

SELECT u.intID, u.strFirstName, u.strLastName FROM [users] u ORDER BY u.strLastname, u.strFirstname;

Det finns ingen anledning till att skriva select stjärna och det är bara nybörjare som gör det också, alternativt folk som av någon anledning vill... bara för de inte orkar skriva eller vad som helst!?

Oavsett vilket, det är sämsta alternativet alla kategorier! :-)

Håller inte med, jag föredrar * på alla tabeller utom extremt stora och då jag endast söker en eller ett par kolumner.
Och att döpa kolumner till int[Komumn], str[Kolumn] är verkligen inte nått jag rekomenderar!

Sen om jag tillhör nybörjarna eller annat folk låter jag vara osakt! ;)

Medlem sedan juli 2009355 inlägg
#10

tack alla som svarat

tack så mycket för all hjälp, nu ska jag testa det där med loopen direkt!

en sak jag funderar på är, vad gör: "manufacter <> RecSet("Namn")" ? jag har inte sett <> användas förut.

Medlem sedan juni 20019 519 inlägg
#11

<> innebär att det skall vara skillt ifrån något:

"bob" <> "Göran"

kommer bli sant eftersom bob inte är Göran.

Medlem sedan juli 2009355 inlägg
#12

aha, då förstår jag! tack så mycket

Medlem sedan juli 2009355 inlägg
#13

Grejen med att kolla om märket redan skrivits ut med denna loop

Dim manufacter
manufacter = ""
DO UNTIL RecSet.EOF
     If manufacter <> RecSet("Namn") Then
          Response.Write(RecSet("Namn"))
          manufacter = RecSet("Namn")
     End If

är att jag inte får det att funka ordentligt. för det första så skrivs det ut en massa märken som innan, och de hamnar heller inte i en tabell.

Ursäkta för att jag är lite nybörjare, jag har bara pracis börjat med ASP så jag är inte så van vid att felsöka och komma på lösningar :(

Medlem sedan juli 2009355 inlägg
#14

ursäkta mig

loopen fungerar om man sorterar mysql_query'n efter Märken. Jag återkommer när jag fått iordning på allt!

Medlem sedan juli 2009355 inlägg
#15

ungefär så här ser min nuvarande sida ut:

<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" WIDTH="100%">
<%
Set Recset = server.CreateObject("ADODB.recordset")

sel = "SELECT * FROM RegisterMarken INNER JOIN RegisterModell ON RegisterMarken.ID = RegisterModell.BrandID WHERE RegisterModell.Prio = 1 ORDER BY RegisterModell.Marke ASC"

Recset.open sel, connect

Dim manufacturer
manufacturer = ""

DO UNTIL RecSet.EOF
if manufacturer <> RecSet("Marke") Then
  
  

	%>
	<TR>
	 <TD WIDTH="100" CLASS="brod"><%=RecSet("Marke")%></TD>
	 <TD ALIGN="center" CLASS="brod">Prio </TD>
	 <TD ALIGN="center" CLASS="brod"> Antal</TD>
	 <TD ALIGN="center" CLASS="brod">90</TD>
	 <TD ALIGN="center" CLASS="brod">91</TD>
	 <TD ALIGN="center" CLASS="brod">92</TD>
	 <TD ALIGN="center" CLASS="brod">93</TD>
	 <TD ALIGN="center" CLASS="brod">94</TD>
	 <TD ALIGN="center" CLASS="brod">95</TD>
	 <TD ALIGN="center" CLASS="brod">96</TD>
	 <TD ALIGN="center" CLASS="brod">97</TD>
	 <TD ALIGN="center" CLASS="brod">98</TD>
	 <TD ALIGN="center" CLASS="brod">99</TD>
	 <TD ALIGN="center" CLASS="brod">00</TD>
	 <TD ALIGN="center" CLASS="brod">01</TD>
	 <TD ALIGN="center" CLASS="brod">02</TD>
	 <TD ALIGN="center" CLASS="brod">03</TD>
	 <TD ALIGN="center" CLASS="brod">04</TD>
	</TR>
	<TR>
	 <TD COLSPAN="100" CLASS="brod"><IMG SRC="iconer/tonlinje.gif"></TD>
	</TR>

	<TR>
	 <TD COLSPAN="100" CLASS="brod"><IMG SRC="iconer/tonlinje.gif"></TD>
	</TR>
	<%

manufacturer = RecSet("Marke")
end if

	BG    = "GrayLite"
	Set Rmc = server.CreateObject("ADODB.recordset")
	MC = "select * FROM RegisterModell where Prio = 1 AND VisaIGrid = 'ja' AND Marke = '" & manufacturer & "' ORDER BY Model"				
	Rmc.open MC, connect

	DO UNTIL Rmc.EOF

	'****************| koden för att räkna ut antalat av modellen i lager |****************
		Set LagerCount = server.CreateObject("ADODB.recordset")
		SelectLager = "select * FROM motorcyklar WHERE salestatus = 0 and registerID =" & Rmc("ID")				
		LagerCount.open SelectLager, connect
		Lager = 0
		DO UNTIL LagerCount.EOF
		 Lager = Lager + 1
		 LagerCount.MoveNext
		Loop
		LagerCount.Close
		set lagerCount = nothing
	'*************************************************************************************
	
		%>
		<TR CLASS="<%=BG%>">
		
		 
		  <TD WIDTH="100"><%=Rmc("Model")%></TD>
		  <TD><%=Rmc("Prio")%></TD>
		  <TD ALIGN="CENTER"><%=Lager%></TD>
		 		 <%
		 

		 
		 '=======================================================================
		 'Skriver ut de olika årsmodellerna
		 '=======================================================================
		  Set RY = server.CreateObject("ADODB.recordset")
		  YR = "select * from GridYear WHERE ModelID =" & Rmc("ID")
		  RY.open YR, connect
		  DO UNTIL RY.EOF
						
			%>
			 
			
			 <TD ALIGN="center"><%=RY("Price")%></TD>
			<%
			
		  RY.MoveNext
		  Loop
		  
		  
		  

		  
		  
		  %>
		</TR>
		<%	
		'---------Sätter olika färger på varanan rad------------
		IF BG = "GrayLite" THEN BG = "GrayDark" ELSE BG = "GrayLite" END IF
		'-------------------------------------------------------
		
Rmc.MoveNext
	Loop
	Rmc.Close
	set rmc = nothing

%>
<%

RecSet.MoveNext
Loop	
Recset.Close 
%>

Denna kod skriver nu ut alla modeller under rätt märke, MEN av någon anledning kommer det flera av samma modell ett antal gångerunder varje märke... ex. under suzuki kommer:

SV 650 N
SV 650 S
VL 800 Volusia
VZ 800 Marauder
SV 650 N
SV 650 S
VL 800 Volusia
VZ 800 Marauder
SV 650 N
SV 650 S
VL 800 Volusia
VZ 800 Marauder
SV 650 N
SV 650 S
VL 800 Volusia
VZ 800 Marauder

är det någon som kan se felet? jag känner mig blind just nu, hur mycket jag än går igenom koden hittar jag det inte :/

Medlem sedan juni 20003 076 inlägg
#16

Jag tror du missförstod lite! :)
Tricket med if-satsen i loopen var att du inte behöver hämta modellerna i en separat selectsats utan de hämtas samtidigt. Du behöver heller inte ha en separat selectsats för att räkna cyklarna. Slå ihop alla tre till en gemensam och försök få till det därifrån.
Selecten bör se ut något liknande:

sel = "SELECT *, (SELECT COUNT(*) FROM motorcyklar AS mot WHERE mot.salestatus = 0 AND mot.registerID = rmo.ID) AS Stock FROM RegisterMarken AS rma INNER JOIN RegisterModell AS rmo ON rma.ID = rmo.BrandID WHERE rmo.Prio = 1 And rmo.VisaIGrid = 'ja' ORDER BY rma.Marke ASC, rmo.Modell ASC"

och lite exempelkod:

Dim manufacturer
manufacturer = ""

Response.Write("<tr><th>Märke/Modell</th><th>Lager</th></tr>")

DO UNTIL RecSet.EOF
     If manufacturer <> RecSet("Marke") Then
          Response.Write("<tr><td>" & RecSet("Marke") & "</td></tr>")
     End If
     Response.Write("<tr><td>" & RecSet("Modell") & "</td><td>" &  RecSet("Stock")  & "</td></tr>")
Medlem sedan juli 2009355 inlägg
#17

En till sak

Okej, nu har jag skrivit om och nu får jag motorcyklarna att listas korrekt, men jag har fortfarande ett problem. Jag måste också få ut priset i euro efter varje årsmodell...

kan man kanske göra detta enkelt med en for-loop eller? I tabellen gridyear finns motorcykelns id, årsmodell och pris. det ska skrivas ut ett pris för varje årsmodell, ex.

Suzuki | Prio | Lager | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 00 | 01 | 02 | 03 | 04

och här under ska det stå ett pris för varje årtal m.m.

eller går det att smälla ihop även detta med föregående?

här är ett exempel på hur jag tänker, jag vet att det finns fel då jag inte är så duktig med asp än.

<%
		 '=======================================================================
		 'Skriver ut de olika årsmodellerna
		 '======================================================================= 
			For count = 1990 to 2004
                        
                        YR = "select * FROM GridYear INNER JOIN RegisterModell AS rmo ON GridYear.ModelID = rmo.ID WHERE rmo.Prio = 1 And rmo.VisaIGrid = 'ja' AND GridYear.Year = " & count & " ORDER BY rmo.Marke ASC, rmo.Model ASC"
			%>
			 <TD ALIGN="center"><%=YR("Price")%></TD>
			<%
		 	  Next
		  %>
Medlem sedan juni 20003 076 inlägg
#18

Sanji skrev:

eller går det att smälla ihop även detta med föregående?

Ja, smäll ihop bara! :)
Det blir lite finlir när du ska rita ut det hela bara men det ska du nog få till.

sel = "
SELECT *, (
     SELECT COUNT(*) 
     FROM motorcyklar AS mot 
     WHERE mot.salestatus = 0 AND mot.registerID = rmo.ID) AS Stock 
FROM RegisterMarken AS rma 
INNER JOIN RegisterModell AS rmo ON rma.ID = rmo.BrandID 
INNER JOIN GridYear AS grd ON grd.ModellID = rmo.ID
WHERE rmo.Prio = 1 And rmo.VisaIGrid = 'ja' 
ORDER BY rma.Marke ASC, rmo.Modell ASC"

(jag slog isär raderna bara för att se tydligare)

Dim manufacturer, model, gridYearStart, gridYearEnd
manufacturer = ""
model = ""
gridYearStart = 1990
gridYearEnd = Year(Now())
Response.Write("<tr><th>Märke/Modell</th><th>Lager</th>)
For gridYearStart to gridYearEnd
     Response.Write("<th>" & gridYearStart & "</th>")
Next
Response.Write("</tr>")

DO UNTIL RecSet.EOF
     If manufacturer <> RecSet("Marke") Then
          Response.Write("<tr><td colspan=""" & gridYearEnd-gridYearStart & """>" & RecSet("Marke") & "</td></tr>")
     End If
     Response.Write("<tr><td>" & RecSet("Modell") & "</td><td>" &  RecSet("Stock")  & "</td>")
     
     gridYearStart = 1990
     model = RecSet("Modell")
     For gridYearStart to gridYearEnd
          Response.Write("<td>" & RecSet("Price") & "</td>")
          If RecSet.Eof Then Exit For
          RecSet.MoveNext()
          If model <> RecSet("Modell") Then
               RecSet.MovePrevious()
               Exit For
          End If
     Next

     If gridYearStart < gridYearEnd Then
          For gridYearStart to gridYearEnd
               Response.Write("<td></td>")
          Next
     End If

     Response.Write("</tr>")

Jag har dock semester så vissa fel kan ha smugit sig in i koden men du får nånting att labba med i alla fall! ;)

Medlem sedan juli 2009355 inlägg
#19

Tack så mycket! nu ska det testas :)

Medlem sedan juli 2009355 inlägg
#20

nu är det något problem med min sql-sats. min webläsare klagar på:

[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'rma.ID = rmo.BrandID INNER JOIN GridYear AS grd ON grd.ModellID = rmo.ID'

sel = "SELECT *, (SELECT COUNT(*) FROM motorcyklar AS mot WHERE mot.salestatus = 0 AND mot.registerID = rmo.ID)
 AS Stock FROM RegisterMarken AS rma 
INNER JOIN RegisterModell AS rmo ON rma.ID = rmo.BrandID 
INNER JOIN GridYear AS grd ON grd.ModellID = rmo.ID 
WHERE rmo.Prio = 1 And rmo.VisaIGrid = 'ja' ORDER BY rma.Name ASC, rmo.Model ASC"

Löst detta problem, men fått andra ^^ Jag fick skriva om min select-kod lite innan det funkade:

sel = "SELECT *, (SELECT COUNT(*) FROM motorcyklar AS mot WHERE mot.salestatus = 0 AND mot.registerID = rmo.ID) 
AS Stock FROM RegisterMarken AS rma INNER JOIN (GridYear AS grd INNER JOIN RegisterModell AS rmo ON grd.ModelID = rmo.ID) 
ON rma.ID = rmo.BrandID 
WHERE rmo.Prio = 1 And rmo.VisaIGrid = 'ja' ORDER BY rma.Name ASC, rmo.Model ASC"
297 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
164 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)