webForumDet fria alternativet

Loopa ut värde till checkbox från 2 tabeller

ASP

15 svar · 789 visningar · startad av clacke

Medlem sedan feb. 2003234 inlägg
Frågan#1

Vill loppa ut alla rumsnamn från room tabellen, vilket den övre sqlen gör.
Sedan vill jag att om rum_id från room tabellen finns i rabatter tabellen så sk det bockas för i checkboxen.

sql8 = "SELECT * FROM room order by rumsnamn;"
set rs8 = conn.execute(sql8)

do until rs8.eof

sql5 = "SELECT * FROM rabatter where rum_id = "&rs8("rum_id")&";"
set rs5 = conn.execute(sql5)

do until rs5.eof

<input name="rum_id" type="checkbox" value="<%=rs5("rum_id")%>"<%if not rs5.eof then response.write("checked")%>><%=rs8("rumsnamn")%><br>

rs5.movenext
loop

rs8.movenext
loop

Medlem sedan juni 20019 519 inlägg
#2

Använd Joins istället:

sql = "SELECT r.*, d.rum_id AS checked FROM room AS r LEFT JOIN rabatter AS d ON r.Rum_id = d.rum_id"

Set RecSet = Conn.Execute(sql)
If Not RecSet.EOF Then
	Do Until RecSet.EOF
		Response.Write "<input name=""rum_id"" type=""checkbox"" value=""" & RecSet("rum_id") & """
		If RecSet("checked") <> "" Then Response.Write " checked=""checked"""
		Response.Write ">" & RecSet("Rumsnamn") & "<br>"
		RecSet.MoveNext
	Loop
End If
Medlem sedan feb. 2003234 inlägg
#3

Hej och tack för ditt svar men jag fick inte det att varken välja ut rätt från rabatter tabellen eller att den bockade för.

Med nedan kod så väljer den ut rätt från rabatter tabellen och bockar för checkrutorna som den ska, men jag vill välja allt från room tabellen också. Så finns inte ett rum_id i rabatter tabellen så ska den hämta det från room tabellen istället!
Tack på förhand.

<%
sql5 = "SELECT * FROM room,rabatter where rabatter.rum_id=room.rum_id and rabatter.namn='"&rs("namn")&"' order BY namn;"
set rs5 = conn.execute(sql5)

do until rs5.eof
%>

<input name="rum_id" type="checkbox" value="<%=rs5("rum_id")%>" <%if not rs5.eof then response.write("checked")%>><%=rs5("rumsnamn")%><%=rs5("rum_id")%><br>

<% rs5.movenext
loop
%>

Medlem sedan juni 20019 519 inlägg
#4

Kan ett rum har flera rabatter (enligt vad jag har förstått från din text så kan man inte ha det). Men din tabell namn säger mig att det verkar så att den kan ha fler rabatter?

Du får sätta Alias på rum_id från tabellen room (bygg gärna hellre om din databas med bättre namn).:

sql5 = "SELECT *,room.rum_id as NyttRumId FROM room,rabatter where rabatter.rum_id=room.rum_id and rabatter.namn='"&rs("namn")&"' order BY namn;"
set rs5 = conn.execute(sql5)

och använd rs5("NyttRumId").

Din SQL säger ju att rum_id från rabatter och room.rum_id måste finnas ihop med... så din SQL fråga kommer aldrig visa rabatter som inte finns tabellen rabatter.

Och snälla! Använd [kod] taggen som finns på forumet för att visa vad som är kod och vad som är text i dina trådar.

Medlem sedan feb. 2003234 inlägg
#5

Jo ett rum kan ha flera rabatter. Jag har en tabell "room" med alla rum_id. Sedan har jag en tabell "rabatter" där det kan finnas ett eller flera rum_id:n från room tabellen.

Och jo den visar dom rum_id:n som finns i rabatter tabellen!

Provade men det blir ingen skillnad, den loopar fortfarande ut ut rätt antal rum_id:n från rabatter tabellen?

Medlem sedan juni 20019 519 inlägg
#6

Hur vill du ha det?
Är det liknande:

  • Rum nummer 1

  • Rabatt:

  • Rabatt 1

  • webforum rabatt

  • Rabatt 3

    Rum nummer 2

Rabatt:

Rabatt 1
webforum rabatt
Rabatt 3

Rum nummer 3

Rabatt:

Rabatt 1
webforum rabatt
Rabatt 3

Som du vill ha (där den tjocka texten är de som är ikryssade?

Medlem sedan feb. 2003234 inlägg
#7

Inte riktigt!
Man väljer först rabatten man vill ändra och det är värdet '"&rs("namn")&"',
när man har valt det kommer alla rummen upp med checkrutor under varandra.
Alla rummen som har just den rabatten man har valt visas ibockade, och dom andra tomma.
Så här:

Rum 1
webforums rummet
Rum 3

Medlem sedan juni 20019 519 inlägg
#8

Som jag ser det så måste du ha tre tabeller:
1. Tabell med alla rum med ett ID namn osv.
2. Rabatt, med ett Id.
3. En tabell som referera till tabell rum och tabell rabatt.
Om du nu inte lagrar alla rabatter i en sträng i tabellen rabatter?

+------------+     +----------+     +----------+
|   rabatt   |     | Rabatter |     | Rum      |
+------------+     +----------+     +----------+
| ID         |-----| RabattId |   /-| RoomId   |
| Rabattnamn |     | Rum_Id   |--/  | RumNamn  |
+------------+     +----------+     +----------+

Där du loopar ut alla från tabellen rabatt
och hämtar alla rum_id ifrån Rabatter Och vidare om du vill få reda mer om rummet (som rumsnamn) får du göra en join på detta. Är det såhär du har det just nu?

Medlem sedan feb. 2003234 inlägg
#9

Tabellerna ser ut så här:

room tabellen:
rum_id
rumsnamn

rabatter tabellen:
rabatt_id
namn
rum_id

Jag måste väl kunna loopa ut alla värden från room tabellen och alla värden från rabatter tabellen där rum_id:et är lika med rum_id:et ifrån room tabellen?

Det som funkar nu är att jag får ut rätt antal rum_id:en från rabatter tabellen, men jag kan inte loopa ut alla ifrån room tabellen!

Medlem sedan juni 20019 519 inlägg
#10

Nej, Om vi säger att rum1 skall ha rabatten: "webforum" och rum2 också skall ha "webforum", då har du helt plötsligt två rabatter med samma namn + två olika rabatt_id:n vilket ID gäller för rabatten "webforum"? Därför skapar man en referenstaball som man kan lagra fler rabatter på flera rum. Det du gör nu kallar man för dubbellagring vilket man i en databas vill undvika, exempelvis: Vi ska byta namn på rabatten webforum: då får vi ändra det x antal gånger beroende på hur många rum som har rabatten webforum.

Medlem sedan feb. 2003234 inlägg
#11

Men rum_id:et blir ju också dubbellagrat i rabatter tabellen i din uppsättning?
Att dom ändrar namnet på själva rabatten händer inte så ofta tror jag, utan mer för vilket rum en rabatt ska gälla för.

Jag har kommit på ett annat sätt, tror jag iallafall.
Som det är nu så letar den ut rätt rum från rabatter tabellen och skriver ut dom som den ska.
Tänkte sen välja alla från room tabellen där rum_id inte är lika med rabatter rum_id.
Får dock inte till det helt!?

sql5 = "SELECT *,room.rum_id as NyttRumId FROM room,rabatter where rabatter.rum_id=room.rum_id and rabatter.namn='"&rs("namn")&"' order BY namn;"
set rs5 = conn.execute(sql5)
					
do until rs5.eof
dim testet,rs8,sql8
testet=rs5("rum_id")%>
			

<input name="rum_id" type="checkbox" value="<%=rs5("NyttRumId")%>" <%if not rs5.eof then response.write("checked")%>><%=rs5("rumsnamn")%><%=rs5("rum_id")%><br>
       
<% 
sql8 = "SELECT * FROM room where rum_id!= "& testet &" group by rum_id;"
set rs8 = conn.execute(sql8) 
					
do until rs8.eof
response.write rs8("rum_id") &"<br>"	
rs8.movenext
loop 

rs5.movenext
loop

Den skriver ut rum_id:et rätt, dvs för varje loop tar den inte med rabatter rum_id:et(som det ska vara) men den gör det ju för varje rum_id i rabatter tabellen?
Så finns det 2st rum_id i rabatter så skriver den ut room rum_id:ena 2 gånger.
Hur gör man för att den bara ska hämta ut värdena 1 gång från room tabellen och lagra alla dom i "testet"?

Medlem sedan juni 20019 519 inlägg
#12

Tyvärr kan jag inte hålla med dig på din nya idé det är inte "bra" att lagra rum idn (fler än 1) i ett fält.

Men rum_id:et blir ju också dubbellagrat i rabatter tabellen i din uppsättning?

Det är det inte, det är en referens. + ett tal (id) är inte en data som du har påverkat utan det är databasen som har skapat ett unikt id för just den posten som man kan referera till.
Just nu så kommer din kod också inte vara den snabbaste om du har exempelvis 100 rum du ska loopa ut, då kommer du få skapar ett Recordset 100 gånger för att få ut rum_id. Det måste finnas ett bättre sätt i mina ögon att lösa detta på.

Medlem sedan feb. 2003234 inlägg
#13

Finns det något sätt att konvertera

for each rum_id in request.form("rum_id")
response.write rs5("rum_id")
next

så att den hämtar ut värdet från tabellen och lägger det i rum_id, istället
för från request.form("rum_id") som denna koden gör?

Typ så här:

for each rum_id in testet
sql8 = "SELECT * FROM room where rum_id!="&testet&" group by rum_id;"
set rs8 = conn.execute(sql8)
next
Medlem sedan juni 20019 519 inlägg
#14

Du kan splitar Texten.. din testet är en text sträng... finns inga "each" i den. Men splitar den och gör den till en array så kan du få ut det... annars kan du köra IN i din SQL kanske?

Medlem sedan feb. 2003234 inlägg
#15

Hur skulle en IN se ut i sql:en?

Medlem sedan juni 20019 519 inlägg
#16

Where something IN(" & textes & ")

där textest ser ut: "1,2,3,4" ungefär.

285 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
140 ms — deklarationer (db)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)
142 ms — ändringar (db)