webForumDet fria alternativet

iterera för att skriva ut en checkbox

ASP

26 svar · 1 212 visningar · startad av peppar

Medlem sedan dec. 2001873 inlägg
Frågan#1

Jag har två tabeller i relation.

med_kategorier(här finns bara sex poster med usr_KATID 1-6)
---------------
usr_KATID
usr_KATEGORI

med_origin
----------
usr_ORIGINID
usr_USRORIGIN
usr_KATEGORI

Säg att jag har en användare som tillhör kategorierna 1 och 3 t.ex.

Nu vill jag kunna uppdatera denna informationen genom att kolla igenom hela tabellen med_origin och skriva ut en chockbox för varje kategori, om användaren tillhör en kategori redan skall ceckboxen markeras "checked"... min kod nu ser ut såhär och den fungerar inte alls bra... den skriver ut hela settet flera gånger.... Det bör väl finnas bättre sätt?

sql1 =	"SELECT * from med_origin where usr_USRORIGIN = "& thisUsrId 
set rs1 = conndb1.execute(sql1)

do until rs1.eof
	if rs1("usr_KATEGORI") = 1 then
		response.write "<input name=""usr_KATEGORI"" type=""checkbox"" value=""1"" checked/>Odlare<br />"
	else
		response.write "<input name=""usr_KATEGORI"" type=""checkbox"" value=""1"" />Odlare<br />"
	end if

	if rs1("usr_KATEGORI") = 2 then
		response.write "<input name=""usr_KATEGORI"" type=""checkbox"" value=""2"" checked/>Uppf&ouml;dare<br />"
	else
		response.write "<input name=""usr_KATEGORI"" type=""checkbox"" value=""2"" />Uppf&ouml;dare<br />"
	end if

	if rs1("usr_KATEGORI") = 3 then
		response.write "<input name=""usr_KATEGORI"" type=""checkbox"" value=""3"" checked/>F&ouml;r&auml;dlare<br />"
	else
		response.write "<input name=""usr_KATEGORI"" type=""checkbox"" value=""3"" />F&ouml;r&auml;dlare<br />"
	end if

	if rs1("usr_KATEGORI") = 4 then
		response.write "<input name=""usr_KATEGORI"" type=""checkbox"" value=""4"" checked/>Matlagare<br />"
	else
		response.write "<input name=""usr_KATEGORI"" type=""checkbox"" value=""4"" />Matlagare<br />"
	end if	

	if rs1("usr_KATEGORI") = 5 then
		response.write "<input name=""usr_KATEGORI"" type=""checkbox"" value=""5"" checked/>Butik<br />"
	else
		response.write "<input name=""usr_KATEGORI"" type=""checkbox"" value=""5"" />Butik<br />"
	end if		

	if rs1("usr_KATEGORI") = 6 then
		response.write "<input name=""usr_KATEGORI"" type=""checkbox"" value=""6"" checked/>Resurs<br />"
	else
		response.write "<input name=""usr_KATEGORI"" type=""checkbox"" value=""6"" />Resurs<br />"
	end if		
rs1.movenext
loop
Medlem sedan dec. 20003 887 inlägg
#2
strSQL = "SELECT t1.usr_KATID AS t1KatId, t1.usr_KATEGORI AS t1Kat, t2.usr_KATEGORI AS t2KatId" & _
  " FROM med_kategorier t1" & _
  " LEFT JOIN med_origin t2 ON t1.usr_KATID = t2.usr_KATEGORI" & _
  " WHERE t2.usr_ORIGINID = " & thisUserId & _
  " ORDER BY t1.usr_KATEGORI"

 set rs1 = conndb1.execute( strSQL )

while ( not rs1.eof )

  response.write "<input name=""usr_kategori"" type=""checkbox"" value=""" & rs1( "t1KatId" ) & """"

  if ( rs1( "t1KatId" ) = rs1( "t2KatId" ) ) then
    response.write " checked>" & rs1( "t1Kat" ) & "<br />"
  else
    response.write ">" & rs1( "t1Kat" ) & "<br />"
  end if

  call rs1.movenext()

wend

Nu lovar jag inte att den här koden fungerar speciellt bra, men såhär skulle jag förmodligen försökt lösa det hela.

Medlem sedan jan. 20022 440 inlägg
#3

Vet inte om det stämmer precis men det borde ge dig en idé om hur man kan gå till väga. Har absolut inte testat koden men om du knåpar lite får du nog ihop det :)

sql1 =	"SELECT * from med_origin where usr_USRORIGIN = "& thisUsrId 
set rs1 = conndb1.execute(sql1)
dim intUsrCat, funcTitel

	
do while not rs1.eof
	intUsrCat = CInt(rs1("usr_KATEGORI"))
	for i = 1 to 6
		response.write "<input name=""usr_KATEGORI"" type=""checkbox"" value=""" & i & """ "
			If i = intUsrCat Then 
				response.write " selected" 
			end if
		response.write "/>" & funcTitel & "<br />"
	i = i + 1
	next
rs1.movenext
loop
Medlem sedan dec. 2001873 inlägg
#4

Engine^ skrev:

Nu lovar jag inte att den här koden fungerar speciellt bra, men såhär skulle jag förmodligen försökt lösa det hela.

Den skriver inte ut någonting... Inget felmeddelande.

Medlem sedan dec. 2001873 inlägg
#5

CatZ skrev:

Vet inte om det stämmer precis men det borde ge dig en idé om hur man kan gå till väga. Har absolut inte testat koden men om du knåpar lite får du nog ihop det :)

Det fungerar ju så långt att den skriver ut alla checkboxarna, men att sedan få in rätt värde från med_kategorier.usr_KATEGORI till funcTitel är en annan femma... Jag har provat att sätta ihop några olika JOIN baserade frågor men ofta får jag undantag inträffade fel

Medlem sedan dec. 20003 887 inlägg
#6

peppar skrev:

Den skriver inte ut någonting... Inget felmeddelande.

Det kan bero på två saker.

Antingen matchar inte sql-uttrycket något - vilket är väldigt enkelt att testa.
Eller så jämförs inte rätt saker i if-satsen - vilket också är enkelt för dig att kolla, eftersom det är din databas kan du ju se vad som ska testas.

Det blir inget felmeddelande, eftersom inga fel orsakas. :OO

Medlem sedan dec. 2001873 inlägg
#7

om jag innan whileloppen försöker skriva ut t.ex rs1( "t1Kat" ) så för jag bof eller eof är satt till True ... osv.
Då matchas inget, eller hur?!

Medlem sedan dec. 2001873 inlägg
#8

Dang! Ett fel hittade jag i frågan

strSQL = "SELECT t1.usr_KATID AS t1KatId, t1.usr_KATEGORI AS t1Kat, t2.usr_KATEGORI AS t2KatId" & _
  " FROM med_kategorier t1" & _
  " LEFT JOIN med_origin t2 ON t1.usr_KATID = t2.usr_KATEGORI" & _
  " WHERE t2.[b]usr_USRORIGIN[/b] = " & thisUserId & _
  " ORDER BY t1.usr_KATEGORI"

Den var tidigare usr_ORIGINID. Som du sade lite att jämföra fel saker...

Nu skriver den endast ut dom kategorier man redan tillhör.... inte dom som skall lämnas tomma...

Medlem sedan dec. 20003 887 inlägg
#9

Ok. Testa kör frågan direkt i ditt DBMS. Jag chansade lite på dina kolumner när jag skrev ihop det och du kanske kan se om det är någon missmatch på join-villkoret eller om möjligen användarid:t är galet.

Medlem sedan dec. 2001873 inlägg
#10

Om jag skickar in 39 i thisUsrId så får jag ut två poster, i både Access och Visual Studios QUERYhanterare. Det är ju det jag skall ha ut också. Men jag vill också få ut dom som inte matchar för att kunna skriva ut dom också... Går det att åstadkomma med samma fråga?

Jag skickar med en liten bild av hur tabellerna ser ut...

joint.jpg
Medlem sedan dec. 20003 887 inlägg
#11

Tja... det är ju typiskt det du använder left join till.

Left join innebär lite löst: ta med allt från vänstra tabellen och det som matchar från den högra tabellen. Det som matchar är vad du anger i ON-villkoret.

Men här verkar ju något gå snett av någon anledning och just nu kommer jag inte på varför... följande ska fungera helt enkelt

SELECT med_kategorier.usr_KATEGORI, med_origin.usr_USRORIGIN
FROM med_kategorier
LEFT JOIN med_origin ON med_kategorier.usr_KATID = med_origin.usr_KATEGORI
WHERE med_origin.usr_USRORIGIN = 39
ORDER BY med_kategorier.usr_KATID

Här bör det komma följande resultat

odlare      null
uppfödare   null
förädlare   null
matlagare   39
butik       null
resurs      39

Efter detta ska det räcka att ändra i if-satsen i min kod till

if ( not isnull( rs1( "usr_USRORIGIN" ) ) ) then

Tycker jag...

Medlem sedan dec. 2001873 inlägg
#12

Ja, jag har stirrat på det här ett tag nu, jag skall ta en promenad och försöka få lite luft... såhär ser koden ut nu

strSQL = "SELECT med_kategorier.*, med_origin.*"&_
	  " FROM med_kategorier"&_
	  " LEFT JOIN med_origin ON med_kategorier.usr_KATID = med_origin.usr_KATEGORI"&_
	  " WHERE med_origin.usr_USRORIGIN = " & thisUsrId & _ [b] värdet är 39[/b]
	  " ORDER BY med_kategorier.usr_KATID"

 set rs1 = conndb1.execute( strSQL )

while ( not rs1.eof )

  response.write "<input name=""usr_kategori"" type=""checkbox"" value=""" & rs1("usr_KATID") & """"

  if ( not isnull( rs1( "usr_USRORIGIN" ) ) ) then
    response.write " checked>" & rs1("usr_KATID") & "<br />"
  else
    response.write ">" & rs1("usr_KATID") & "<br />"
  end if

  call rs1.movenext()

och den genererar:

matlagare 39
resurs 39

Medlem sedan dec. 20003 887 inlägg
#13

Hoppsan Kerstin! :r

Det är ju inget fel i det resultatet... det är jag som är helt ute och cyklar i mina sql-kunskaper :D

Frågan bör nog se lite annorlunda ut

SELECT usr_KATEGORI, (SELECT 1 FROM med_origin
WHERE usr_usrorigin=39 AND usr_kategori = t2.usr_katid)
FROM med_kategorier t2
ORDER BY usr_katid
Medlem sedan juni 200032 967 inlägg
#14

Flytta villkoret från WHERE till JOIN-instruktionen, annars blir det en INNER JOIN av det hela.

"LEFT JOIN med_origin ON med_kategorier.usr_KATID = med_origin.usr_KATEGORI"&_
	  " AND med_origin.usr_USRORIGIN = 39"
Medlem sedan dec. 2001873 inlägg
#15

@nders skrev:

Flytta villkoret från WHERE till JOIN-instruktionen, annars blir det en INNER JOIN av det hela.

"LEFT JOIN med_origin ON med_kategorier.usr_KATID = med_origin.usr_KATEGORI"&_
	  " AND med_origin.usr_USRORIGIN = 39"

Då stöds inte kopllingsuttrycket längre...

Medlem sedan juni 200032 967 inlägg
#16

Jävla Access. :(

Mvh

Medlem sedan dec. 20003 887 inlägg
#17

Spana på min förra post så ska du se att det fungerar bättre... :)

Medlem sedan dec. 2001873 inlägg
#18

Dang! ;) Nu fungerar det i Access...

Medlem sedan jan. 20022 440 inlägg
#19

Glom inte markera traden som lost! djavla engelska tangentbord!! Mwhahahah

Medlem sedan dec. 2001873 inlägg
#20

CatZ skrev:

Glom inte markera traden som lost! djavla engelska tangentbord!! Mwhahahah

Nejdå! Jag brukar vara duktigt på det, men jag tänkte att när jag fått hela utskriften att fungera så kan jag posta läsningen här och då när jag fått det att fungera markera tråden... :)

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