Avatar billede jensb Nybegynder
24. juli 2002 - 21:28 Der er 14 kommentarer og
1 løsning

Loop i Loop

Jeg har i et andet spørgsmål lige ladet mig fortælle at man sagtens kan lave loop i loop...men jeg har nogle problemer med at få det til at virke.

Jeg har to tabeller i en database. Den ene indeholder varegrupper og den anden indeholder selve varerne. Alle varer hører så under en varegruppe.

Jeg kan sagtens få oplsyninger frem enkeltvis, men hvis jeg vil lave en list over alle varer, opdelt efter varegrupper, så har jeg et problem. Jeg vil mene at det burde kunne gøres nemt ved et loop i et loop, men det kan jeg ikke få til at virke.

Hvis jeg laver følgende script, hvor jeg altså først bare lister alle varegrupper, og derefter alle varer, så virker det fint nok :

<%
strGRU = "Select * From grupper"
Set rt = Conn.Execute(strGRU)

Do
Response.Write rt("varegruppenavn") & "<br>"
rt.MoveNext
Loop While Not rt.EOF

strSQL = "Select * From varerne Order by varenummer"
Set rs = Conn.Execute(strSQL)

Response.Write "<table width='1200'><tr>"
Response.Write "<td><strong>Varenummer</strong></td>"
Response.Write "<td><strong>Varenavn</strong></td>"
Response.Write "<td><strong>Leverandør varenummer</strong></td>"
Response.Write "<td><strong>Varebeskrivelse</strong></td>"
Response.Write "<td><strong>Salgspris</strong></td>"
Response.Write "<td><strong>Købspris</strong></td>"
Response.Write "<td><strong>Billede</strong></td>"
Response.Write "<td><strong>Leverandør</strong></td>"
Response.Write "<td><strong>Vægt</strong></td>"
Response.Write "<td><strong>Antal på lager</strong></td>"
Response.Write "<td><strong>Udgået?</strong></td></tr>"

Do
Response.Write "<tr><td>" & rs("varenummer") & "</td>"
Response.Write "<td>" & rs("varenavn") & "</td>"
Response.Write "<td>" & rs("leverandoervarenummer") & "</td>"
Response.Write "<td>" & rs("varebeskrivelse") & "</td>"
Response.Write "<td>" & rs("salgspris") & "</td>"
Response.Write "<td>" & rs("koebspris") & "</td>"
Response.Write "<td>" & rs("billede") & "</td>"
Response.Write "<td>" & rs("leverandoernr") & "</td>"
Response.Write "<td>" & rs("vaegt") & "</td>"
Response.Write "<td>" & rs("lager") & "</td>"
Response.Write "<td>" & rs("status") & "</td></tr>"
rs.MoveNext
Loop While Not rs.EOF

Response.Write "</table>"

%>



Dette virker fint...men kan jo ikke bruges til så meget.

Jeg vil jo gerne have flettet det ind i hinanden så det bliver noget i stil med :

<%
strGRU = "Select * From Varegrupper"
Set rt = Conn.Execute(strGRU)

Do
Response.Write rt("varegruppe") & "<br>"

strSQL = "Select * From varer Order by varenummer"
Set rs = Conn.Execute(strSQL)

Response.Write "<table width='1200'><tr>"
Response.Write "<td><strong>Varenummer</strong></td>"
Response.Write "<td><strong>Varenavn</strong></td>"
Response.Write "<td><strong>Leverandør varenummer</strong></td>"
Response.Write "<td><strong>Varebeskrivelse</strong></td>"
Response.Write "<td><strong>Salgspris</strong></td>"
Response.Write "<td><strong>Købspris</strong></td>"
Response.Write "<td><strong>Billede</strong></td>"
Response.Write "<td><strong>Leverandør</strong></td>"
Response.Write "<td><strong>Vægt</strong></td>"
Response.Write "<td><strong>Antal på lager</strong></td>"
Response.Write "<td><strong>Udgået?</strong></td></tr>"

Do
Response.Write "<tr><td>" & rs("varenummer") & "</td>"
Response.Write "<td>" & rs("varenavn") & "</td>"
Response.Write "<td>" & rs("leverandoervarenummer") & "</td>"
Response.Write "<td>" & rs("varebeskrivelse") & "</td>"
Response.Write "<td>" & rs("salgspris") & "</td>"
Response.Write "<td>" & rs("koebspris") & "</td>"
Response.Write "<td>" & rs("billede") & "</td>"
Response.Write "<td>" & rs("leverandoernr") & "</td>"
Response.Write "<td>" & rs("vaegt") & "</td>"
Response.Write "<td>" & rs("lager") & "</td>"
Response.Write "<td>" & rs("status") & "</td></tr>"
rs.MoveNext
Loop While Not rs.EOF

rt.MoveNext
Loop While Not rt.EOF

Response.Write "</table>"

%>


Og så skal jeg selvfølgelig lige sætte den til KUN at udvælge de varer der indgår i den enkelte vareguppe i hvert loop... men det er ikke her problemet er, problemet er at jeg slet ikke kan åbne siden n¨år jeg prøver med nummer 2 script.  Nogen der kan se hvad der er galt?
Avatar billede eagleeye Praktikant
24. juli 2002 - 21:42 #1
Hvordan tilknyttes en vare en gruppe det skal du hvade ind i denne SQL, altså den kolonne i Varer som indeholder information omkring varegruppe skal du bruge i WHERE delen som sættes  lige med rt("varegruppeID"):

strSQL = "Select * From varer WHERE varegruppeID = " & rt("varegruppeID") & " Order by varenummer"
Set rs = Conn.Execute(strSQL)
Avatar billede eagleeye Praktikant
24. juli 2002 - 21:42 #2
det skal naturligvis tilpasses dine kolonne navne.
Avatar billede jensb Nybegynder
24. juli 2002 - 21:48 #3
Jep det er jeg klar over.. der skal bare Where varegruppenr = " & rt("gruppenr")

Det ved... Det er kun for at udelukke alle fejlmuligheder, at jeg indtil videre ikke har det med.  Jeg ved godt at den så under alle varegrupper, vil skrive alle varer som det er nu, men jeg prøver altid at fjerne mest muligt fra scriptet når jeg prøver at finde en fejl.

Problemet er at jeg ikke engang kan få det til at virke som det står ovenfor
Avatar billede eagleeye Praktikant
24. juli 2002 - 21:55 #4
Har du mange varegrupper og vare i hver gruppe??

Du har husket rt og rs.movenext
Avatar billede jensb Nybegynder
24. juli 2002 - 21:57 #5
Lavet lige en kortere og mere overskuelig

strGRU = "Select * From Varegrupper"
Set rt = Conn.Execute(strGRU)

Do
Response.Write rt("varegruppe") & "<br>"

strSQL = "Select * From varer Order by varenummer"
Set rs = Conn.Execute(strSQL)
Do
Response.Write rs("varenavn") & "<br>"
rs.MoveNext
Loop While Not rs.EOF

rt.MoveNext
Loop While Not rt.EOF
Avatar billede jensb Nybegynder
24. juli 2002 - 21:58 #6
der er 8 varegrupper og ca 20 varer... så det er ikke så voldsomt
Avatar billede eagleeye Praktikant
24. juli 2002 - 22:03 #7
En god ide er at lave do while ... loop i stedet for do ... loop while

En do ... loop while vil man altid komme ind i og hvis RS er tomt vil man få en fejl når man forsøger at bruger et tomt recordset, eksvis ved udskrivning.
En do while ... loop vil kun komme igenne hvis while er opfyldt på forhånd.

strGRU = "Select * From Varegrupper"
Set rt = Conn.Execute(strGRU)

Do While Not rt.EOF
  Response.Write rt("varegruppe") & "<br>"

  strSQL = "Select * From varer Order by varenummer"
  Set rs = Conn.Execute(strSQL)
  Do While Not rs.EOF
    Response.Write rs("varenavn") & "<br>"
    rs.MoveNext
  Loop
  rt.MoveNext
Loop
Avatar billede jensb Nybegynder
24. juli 2002 - 22:13 #8
Næh det hjalp nu heller ikke.

Nu har jeg prøvet at sætte den til at den kun skal hente varen med varenummer 3... bare for at sikre mig at det ikke er antallet af poster der skulle betyde noget.  Så resultatet burde nu være at den bare skrev alle varegrupperne, og derunder skrev navnet på vare nummer 3 i hver gruppe.  Dvs alt i alt kun 16 ting den skal skrive, men det hjælper ikke.

Det er noget med det loop i loop den ikke kan lide, for hvis jeg lige deaktivere nummer to loop med '  så virker det... som f.eks. her

strGRU = "Select * From Varegrupper"
Set rt = Conn.Execute(strGRU)

Do While Not rt.EOF
Response.Write rt("varegruppe") & "<br>"
strSQL = "Select * From varer Where varenummer = 3"
Set rs = Conn.Execute(strSQL)
'Do While Not rs.EOF
  Response.Write rs("varenavn") & "<br>"
  'rs.MoveNext
'Loop
rt.MoveNext
Loop


Så det er altså det loop i loop der på en eller anden måde fucker op.  Jeg har også prøvet at ændre så den første (varegruppen) er en Do while, nummer to loop er en Loop While...men det hjalp heller ikke
Avatar billede eagleeye Praktikant
24. juli 2002 - 22:29 #9
Jeg kan nu ikke rigtig se noget galt i de to loops...hvad hvis du bruger while wend:

While Not rt.EOF
Response.Write rt("varegruppe") & "<br>"
strSQL = "Select * From varer Where varenummer = 3"
Set rs = Conn.Execute(strSQL)
While Not rs.EOF
  Response.Write rs("varenavn") & "<br>"
  rs.MoveNext
wend
rt.MoveNext
wend
Avatar billede jensb Nybegynder
24. juli 2002 - 22:39 #10
Næh det hjælper heller ikke.  Jeg har også prøvet at blande dem, så jeg bruger wend i den første og loop i den næste, men uden held.

Mystisk
Avatar billede eagleeye Praktikant
24. juli 2002 - 22:42 #11
Får du en fejl?? eller hvad sker der.
Avatar billede jensb Nybegynder
24. juli 2002 - 22:46 #12
Der sker intet.  Det vil sige den står bare og arbejder (vil jeg tro, siden ligger på et webhotel, så jeg kan ikke høre om serveren knokler, men statusindikatoren i bunden bevæger sig meget langsomt. Jeg har prøvet at vente ca et minut, men der sker ikke noget.

Men lige så snart jeg fjerne nummer 2 loop sætning, så kommer indholdet med det samme
Avatar billede eagleeye Praktikant
24. juli 2002 - 23:01 #13
Det forstår jeg ikke.... nuu har jeg også prøvet at paste koden ind på en side og det virker fint.
Avatar billede jensb Nybegynder
24. juli 2002 - 23:09 #14
Jeg fatter det heller ikke, jeg synes det virker ret logisk at det burde virke....

Nå men jeg har ikke rigtig mere tid idag. Du skal nok få point for din indsats, men jeg lader lige spørgsmålet stå åbent lidt endnu.

Men mange tak for hjælpen alligevel
Avatar billede jensb Nybegynder
26. juli 2002 - 23:22 #15
Jeg har prøvet alt muligt forskelligt, og også prøvet at hente data fra nogle andre tabeller istedet, men jeg kunne bare ikke få det til at virke.

Men så fik jeg den idé at sætte noget af det ind i en funktion, så mit script nu ser således ud :

Function Varer
strSQL = "Select * From varer Where varegruppenr =" & gruppe
Set rs = Conn.Execute(strSQL) 
Do 
Response.Write rs("varenavn") & "<br>"
rs.MoveNext
Loop While Not rs.EOF
End Function


strGRU = "Select * From Varegrupper"
Set rt = Conn.Execute(strGRU)
Do
Response.Write "<strong>" & rt("varegruppe") & "</strong><br>"
gruppe = rt("gruppenr")
Response.Write Varer
rt.MoveNext
Loop While Not rt.EOF

Og nu virker det :-) JUBII.  Jeg fatter stadig ikke hvorfor det første ikke virker, men pyt med det, nu har jeg fået den til at gøre som jeg gerne vil.

Men mange tak for hjælpen alligevel, og du får selvfølgelig pointene alligevel for din indsats
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester