Avatar billede oergaard Nybegynder
13. oktober 2007 - 13:22 Der er 39 kommentarer og
1 løsning

løkke i løkke

Jeg er i gang med at lave en menu, som skal oprettes ud fra en posterne i en database. Et af felterne i databasen hedder "subpage", hvis dette har værdien "false" skal der oprettes et "menupunkt". Hvis værdien er "true" skal der oprettes et "undermenupunkt"

do until rs.eof
  if rs("subpage") = "false" then
    response.write("<div class='menu'>" & rs("text") & "</div>")
    subid = rs("id")
  else
    response.write("<div class='submenu' id='" & subid & ">" & rs("text") & "</div>")
  end if
loop

Ovenstående virker perfekt, hvis hver submenu skulle indsættes i hver sin <div></div>, hvilket de ikke skal. Alle submenuer der kommer efter en menu skal oprettes i samme <div></div>.

Hvis vi forestiller os at databasen indeholder følgende
1. menu 1
2. submenu 1.1
3. submenu 1.2
4. menu 2
5. submenu 2.1
6. submenu 2.2

skal HTML resultatet altså være

<div class='menu'>menu 1</div>
<div class='submenu'>
  submenu 1.1<br>
  submenu 1.2<br>
</div>
<div class='menu'>menu 2</div>
<div class='submenu'>
  submenu 2.1<br>
  submenu 2.2<br>
</div>

Håber der er en der kan hjælpe.
Avatar billede softspot Forsker
13. oktober 2007 - 13:42 #1
do until rs.eof
  if rs("subpage") = "false" then
    response.write("<div class='menu'>" & rs("text") & "</div>")
    subid = rs("id")
    rs.movenext
  else
    response.write("<div class='submenu' id='" & subid & ">"
    do while not rs.eof and rs("subpage") = "true"
      response.write rs("text") & "<br>"
      rs.movenext
    loop
    response.write "</div>"
  end if
loop
Avatar billede oergaard Nybegynder
13. oktober 2007 - 13:58 #2
Det minder meget om mit oprindelige forsøg, som ikke virkede - men jeg afprøver :-)
Avatar billede oergaard Nybegynder
13. oktober 2007 - 14:11 #3
Koden er ikke 100% det samme, men den giver samme fejl.
Menupunkterne kommer fint frem, men teksten til submenupunkterne skrives ikke.
Avatar billede softspot Forsker
13. oktober 2007 - 14:12 #4
Hvordan ser din SQL ud (du skal muligvis have [] omkring feltet text i din SQL-sætning...
Avatar billede oergaard Nybegynder
13. oktober 2007 - 14:27 #5
Det var mig der var fuld jeg opdaterede den forkerte side :-)

Din kode virker til dels.

Dog afsluttes menuen med en fejlmeddelelse.
Avatar billede softspot Forsker
13. oktober 2007 - 14:29 #6
Hjælpe mig med at hjælpe dig: hvad er fejlmeddelsen? ;-)
Avatar billede softspot Forsker
13. oktober 2007 - 14:30 #7
Hov! Der sneg sig vist en sprogspasme ind... :D
Avatar billede softspot Forsker
13. oktober 2007 - 14:31 #8
Aaah OK, prøv lige denne kode i stedet:

do until rs.eof
  if rs("subpage") = "false" then
    response.write("<div class='menu'>" & rs("text") & "</div>")
    subid = rs("id")
    rs.movenext
  else
    response.write "<div class='submenu' id='" & subid & "'>"
    do while not rs.eof and rs("subpage") = "true"
      response.write rs("text") & "<br>"
      rs.movenext
    loop
    response.write "</div>"
  end if
loop
Avatar billede oergaard Nybegynder
13. oktober 2007 - 14:35 #9
Denne kode giver samme fejl. Menuen vises men afslutningvis står der:
"An error occurred on the server when processing the URL. Please contact the system administrator"
Avatar billede softspot Forsker
13. oktober 2007 - 15:00 #10
OK, du skal nok lige have slået de der venlige fejlbeskeder fra i din browser. Under antagelse af at det er Internet Explorer, så kan du vist nok finde denne indstilling i menuen Funktioner / Internetindstillinger og så på "avanceret"-fanen skal du lede efter indstillingen: Vis meddelelser om uskadelige HTTP-fejl - denne mener jeg skal være slået til for at få nogle mere beskrivende fejl...
Avatar billede softspot Forsker
13. oktober 2007 - 15:05 #11
Og hvis den er slået til skal den slås fra :-)
Avatar billede oergaard Nybegynder
13. oktober 2007 - 15:15 #12
Har prøvet begge dele, men får desværre kun den samme fejlbeskrivelse.
Avatar billede oergaard Nybegynder
13. oktober 2007 - 15:17 #13
Ville ellers meget gerne have fejlbeskrivelserne ala ie 6.0
Avatar billede oergaard Nybegynder
13. oktober 2007 - 15:21 #14
Idet sidste post er af typen "subpage" fortsætter den inderste løkke til rs.eof, hvorfor den yderste løkke ikke kan loope - jeg vil tro fejlen er at finde her, men er ikke sikker.
Avatar billede softspot Forsker
13. oktober 2007 - 15:25 #15
Det er svært at fejlfinde hvis vi ikke har en brugbar fejlmeddelelse, så derfor skal du lige prøve at benytte denne kode i stedet for:

on error resume next
do until rs.eof
  if rs("subpage") = "false" then

      if err.number <> 0 then
        response.write("main.subpage: " & err.number & " - " & err.Description & "<br>")
        err.clear
      end if

    response.write("<div class='menu'>" & rs("text") & "</div>")

      if err.number <> 0 then
        response.write("main.text: " & err.number & " - " & err.Description & "<br>")
        err.clear
      end if

    subid = rs("id")

      if err.number <> 0 then
        response.write("main.id: " & err.number & " - " & err.Description & "<br>")
        err.clear
      end if

    rs.movenext
  else
    response.write "<div class='submenu' id='" & subid & "'>"
    do while not rs.eof and rs("subpage") = "true"

      if err.number <> 0 then
        response.write("sub.subpage: " & err.number & " - " & err.Description & "<br>")
        err.clear
      end if

      response.write rs("text") & "<br>"

      if err.number <> 0 then
        response.write("sub.text: " & err.number & " - " & err.Description & "<br>")
        err.clear
      end if

      rs.movenext
    loop
    response.write "</div>"
  end if

  if err.number <> 0 then
    response.write("loop: " & err.number & " - " & err.Description & "<br>")
    err.clear
  end if
loop

on error goto 0
Avatar billede oergaard Nybegynder
13. oktober 2007 - 15:30 #16
Med denne kode er resultatet igen menu, men i stedet
sub.subpage: -2147352567 -
sub.text: -2147352567 -
en halv million gange og derefter
"An error occurred on the server when processing the URL. Please contact the system administrator"
Avatar billede oergaard Nybegynder
13. oktober 2007 - 15:30 #17
igen = ingen
Avatar billede softspot Forsker
13. oktober 2007 - 15:50 #18
Hvordan ser din SQL-sætning ud?

Hvilke data er der rent faktisk i tabellen du læser fra?
Avatar billede oergaard Nybegynder
13. oktober 2007 - 15:59 #19
set rs = conn.execute("SELECT * FROM pages WHERE visible='true' ORDER BY orderid")

Pt. er der ikke så meget ved min tabel. Den består af 5 felter.

Name    Type    Length    Decimals    Allow Null    Key
------------------------------------------------------------
id      int      4          0            no            x
orderid  int      4          0            no
subpage  varchar  5          0            no
text    varchar  50        0            no
visible  varchar  5          0            no
Avatar billede oergaard Nybegynder
13. oktober 2007 - 15:59 #20
Ja det så så ikke så godt ud, men håber du kan forstå :-)
Avatar billede oergaard Nybegynder
13. oktober 2007 - 16:05 #21
Name    Type    Length    Dec    Allow Null    Key
-----------------------------------------------------------
id    int    4    0    no        x
orderid    int    4    0    no
subpage    varchar    5    0    no
text    varchar    50    0    no
visible    varchar    5    0        no
Avatar billede oergaard Nybegynder
13. oktober 2007 - 16:05 #22
ja det blev så ikke bedre :-)
Avatar billede oergaard Nybegynder
13. oktober 2007 - 16:20 #23
Jeg kan løse problemet ved at tilføje en ekstra post i min database med værdien 9999 i orderid.
do until rs.eof
  if rs("subpage") = "false" then
    if rs("orderid") <> "9999" then
      response.write("<div class='menu'>" & rs("text") & "</div>")
      subid = rs("id")
    end if
    rs.movenext
  else
    response.write("<div class='submenu' id='" & subid & "'>")
    do while not rs.eof and rs("subpage") = "true"
      response.write rs("text") & "<br>"
      rs.movenext
      if rs.eof then response.write("</div>")
    loop
    response.write("</div>")
  end if
loop
Avatar billede softspot Forsker
13. oktober 2007 - 16:24 #24
OK, det er fint lige at se tabeldefinitionen, men jeg var også lidt interesseret i at se selve indeholdet, altså data...

Du kan evt. prøve at rette flg. linie (den der definerer starten af den indre løkke for undermenupunkter):

    do while not rs.eof and rs("subpage") = "true"

til:

    do while (not rs.eof) and (rs("subpage") = "true")

ikke fordi det burde have nogen betydning, men på den anden side, så for at være helt sikker på at det ikke er sådan noget der driller... :-)
Avatar billede softspot Forsker
13. oktober 2007 - 16:26 #25
Jeg nåede ikke lige at se din løsning fra indlægget: 13/10-2007 16:20:31, så min kommentar omhandler det der ligger inden det tidspunkt...
Avatar billede oergaard Nybegynder
13. oktober 2007 - 16:27 #26
ja selvfølgelig:
1    5    true    Sub 2.1    true
2    1    false    Side 1    true
3    3    true    Sub 1.2    true
4    4    false    Side 2    true
5    2    true    Sub 1.1    true
6    7    false    Side 3    false
7    6    true    Sub 2.2    true
8    8    false    Side 4    false
Avatar billede oergaard Nybegynder
13. oktober 2007 - 16:29 #27
do while (not rs.eof) and (rs("subpage") = "true") - har ingen betydning
Avatar billede oergaard Nybegynder
13. oktober 2007 - 16:31 #28
jeg ville også helst slippe for at have en ekstra post i min tabel.

Jeg tror det har noget at gøre med det jeg skrev 15:21:51
Avatar billede softspot Forsker
13. oktober 2007 - 16:34 #29
Det jeg foreslår er altså at du ændrer koden til at se således ud:

do until rs.eof
  if rs("subpage") = "false" then
    response.write("<div class='menu'>" & rs("text") & "</div>")
    subid = rs("id")
    rs.movenext
  else
    response.write "<div class='submenu' id='" & subid & "'>"
    do while (not rs.eof) and (rs("subpage") = "true")
      response.write rs("text") & "<br>"
      rs.movenext
    loop
    response.write "</div>"
  end if
loop

Din egen løsning, vil jeg mene, giver et </div> for meget i slutningen af den sidste undermenu (hvis det er den sidste række i resultatet af udtrækket). Min løsning vil altid sørge for at lukke undermenuerne med et </div>, så det er ikke nødvendigt at tilføje den betingede indsættelse.
Avatar billede oergaard Nybegynder
13. oktober 2007 - 16:38 #30
Men din kode blive HTML kildekoden
<div class='menu'>Side 1</div>
<div class='submenu' id='2'>Sub 1.1<br>Sub 1.2<br></div>
<div class='menu'>Side 2</div>
<div class='submenu' id='4'>Sub 2.1<br>Sub 2.2<br>
An error occurred on the server when processing the URL. Please contact the system administrator
Avatar billede oergaard Nybegynder
13. oktober 2007 - 16:39 #31
Hvor for jeg ændrede lidt på kode. Hvorfor jeg tilføjede: if rs.eof then response.write("</div>").
HTML kildekoden bliver så
<div class='menu'>Side 1</div>
<div class='submenu' id='2'>Sub 1.1<br>Sub 1.2<br></div>
<div class='menu'>Side 2</div>
<div class='submenu' id='4'>Sub 2.1<br>Sub 2.2<br></div>
An error occurred on the server when processing the URL. Please contact the system administrator
Avatar billede softspot Forsker
13. oktober 2007 - 16:43 #32
Ad 13/10-2007 16:39:57: Ja, men det er fordi der opstår en fejl på det tidspunkt, så menuen ikke bliver genereret færdig. Så vi skal nok lige have luset fejlen på serveren ud inden vi afluser fejl i outputtet... :-)

Ad 13/10-2007 16:31:05: Nej, det tror jeg ike, da der ikke er nogen flytning af cursoren i resultatet, mellen det sidste kald til rs.movenext og det loop som bevirker at do until rs.eof terminerer løkken, så det synes jeg er ret usandsynligt at det har noget med det at gøre...
Avatar billede softspot Forsker
13. oktober 2007 - 16:46 #33
Jeg kunne godt tænke mig at du lige prøvede at ændre din SQL til:

set rs = conn.execute("SELECT id, subpage, [text] FROM pages WHERE visible='true' ORDER BY orderid")
Avatar billede softspot Forsker
13. oktober 2007 - 16:52 #34
NÆH! Man kan jo ikke checke på et felt i en tom række! Dumme mig! :'(

Prøv lige denne rettelse:

do until rs.eof
  if rs("subpage") = "false" then
    response.write("<div class='menu'>" & rs("text") & "</div>")
    subid = rs("id")
    rs.movenext
  else
    response.write "<div class='submenu' id='" & subid & "'>"
    do while not rs.eof
      if rs("subpage") = "true" then
        response.write rs("text") & "<br>"
        rs.movenext
      else
        exit loop
      end if
    loop
    response.write "</div>"
  end if
loop
Avatar billede oergaard Nybegynder
13. oktober 2007 - 16:52 #35
hvis jeg ændre min SQL sætning får jeg kun fejlmeddelelsen.
Avatar billede softspot Forsker
13. oktober 2007 - 16:53 #36
Sludder, det hedder da exit do!

do until rs.eof
  if rs("subpage") = "false" then
    response.write("<div class='menu'>" & rs("text") & "</div>")
    subid = rs("id")
    rs.movenext
  else
    response.write "<div class='submenu' id='" & subid & "'>"
    do while not rs.eof
      if rs("subpage") = "true" then
        response.write rs("text") & "<br>"
        rs.movenext
      else
        exit do
      end if
    loop
    response.write "</div>"
  end if
loop
Avatar billede oergaard Nybegynder
13. oktober 2007 - 20:47 #37
min børn havde lige brug for noget opmærksomhed. :-)

16:53:17 virker perfekt. :-)

Smider du et svar?
Avatar billede softspot Forsker
13. oktober 2007 - 22:26 #38
Sådan er det med børn ;-)
Avatar billede oergaard Nybegynder
14. oktober 2007 - 07:24 #39
Tak for hjælpen :-)
Avatar billede softspot Forsker
14. oktober 2007 - 10:36 #40
Tak for point :)
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