24. juli 2002 - 21:28Der 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)
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?
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)
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
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
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
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
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
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
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
Synes godt om
Ny brugerNybegynder
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.