Avatar billede nadster Nybegynder
19. maj 2004 - 09:56 Der er 16 kommentarer og
1 løsning

Problem med Do While og EOF

Hey

Jeg er ved at kigge lave en lille hurtig rettighedsudelling, men jeg har problemer med at få vist informationerne rigtigt. Selve tilføjelse og fjerningen af rettigheder for folk fungere fint nok. Det kan jeg se inde i databasen, at det gør. Men problemet ligger i selve visningen af det. Den skriver den første Tournament, men stopper så derefter.

Her er koden der mobber mig...

if data1.eof then
  do while not data.eof
    bg = false
  do while not data2.eof
    bg = not bg
  %>
  <tr class="bg<%=bg%>">
    <td width="65%"><%=data2("tm_Tournament")%></td>
    <td width="20%">Har ikke rettighed</td>
    <td width="15%"><a href="userTourLst.asp?action=add&rdid=<%=data2("tm_Tournament")%>&usid=<%=data("us_ID")%>">Tildel</a></td>
  </tr>
  <%
    data2.movenext
  loop
  data.movenext
loop
else
do while not data1.eof
  bg = false
  %>
    <tr class="bg<%=bg%>">
    <td width="65%"><%=data2("tm_Tournament")%></td>
<%   
  if not data2.eof then
  'do while not data2.eof
    bg = not bg
  %>
    <%if data1("proamAdmin") = 1 then%>
        <td width="20%">Har rettighed</td>
        <td width="15%">N/A</td>
        <%data2.movenext()%>
    <%end if%>
    <%if data1("tm_tournament") = data2("tm_tournament") then%>
        <td width="20%">Har rettighed</td>
        <td width="15%"><a href="userTourLst.asp?action=remove&rdid=<%=data2("tm_Tournament")%>&usid=<%=data1("ta.us_ID")%>">Fjern</a></td>
        <%data2.movenext()%>
    <%end if%>
  <%else%>
    <td width="20%">Har ikke rettighed</td>
    <td width="15%"><a href="userTourLst.asp?action=add&rdid=<%=data2("tm_Tournament")%>&usid=<%=data1("ta.us_ID")%>">Tildel</a></td>
  <%end if%>
    </tr>
  <%
  'data2.movenext
  'loop
data1.movenext
loop
'next
 
  set data2 = nothing
  set data1 = nothing
  set data = nothing
end if


Jeg har udkommenteret noget af det kan i se, en mislykket for-løkke. Derudover kan det siges, at den første del af den store if-sætning, fungerer fint nok. Det er faktisk kun efter else, den brokker sig. Det den gør, er at skrive Tournament, og så stoppe den. Den skriver altså ikke hvorvidt man har rettighed eller ej.

Håber der nogen der kan hjælpe...
Avatar billede fennec Nybegynder
19. maj 2004 - 10:00 #1
det er fordi kører data2 til slut første gang du kommer i loopet. Alle efterfølgende gange er den derfor eof.
Avatar billede fennec Nybegynder
19. maj 2004 - 10:02 #2
den rigtige syntax burde være noget i denne stil:

set data1 = ....
do while not data1.eof
  set data2 = ....
  do while not data2.eof
    ....
    data2.MoveNext
  loop
  data1.MoveNext
loop
Avatar billede nadster Nybegynder
19. maj 2004 - 10:48 #3
okay, nu sker der da fremskridt. Ved at putte "set data2=..." ind i do while data1.eof, så får jeg nu vist alle tournaments og deres rettighed. Problemet jeg nu er stødt ind i, er når jeg tildeler rettighed til mere end en tour, så bliver alle tournaments vist en gang til. Det virker som om at den kører loop'et igennem for hver gang der er tildelt rettighed til en tour.

Den nye kode ser sådan ud:

if data1.eof then
  do while not data.eof
    bg = false
      mySQL2 = "SELECT DISTINCT tm_Tournament FROM Tilmeldinger " &_
          "ORDER BY tm_Tournament"
    'response.Write(mysql2)
    'response.End
    set data2 = dbc.execute(mySQL2)
    do while not data2.eof
    bg = not bg
    %>
    <tr class="bg<%=bg%>">
        <td width="65%"><%=data2("tm_Tournament")%></td>
        <td width="20%">Har ikke rettighed</td>
        <td width="15%"><a href="userTourLst.asp?action=add&rdid=<%=data2("tm_Tournament")%>&usid=<%=data("us_ID")%>">Tildel</a></td>
    </tr>
    <%
    data2.movenext
    loop
  data.movenext
loop
else
    do while not data1.eof
    bg = false
    mySQL2 =  "SELECT DISTINCT tm_Tournament FROM Tilmeldinger " &_
                "ORDER BY tm_Tournament"
    'response.Write(mysql2)
    'response.End
    set data2 = dbc.execute(mySQL2)
    %>
    <%   
        'if data2.eof then
        do while not data2.eof
        bg = not bg
        %>
        <%if data1("proamAdmin") = 1 then%>
                <tr class="bg<%=bg%>">
                    <td width="65%"><%=data2("tm_Tournament")%></td>
                    <td width="20%">Har rettighed</td>
                    <td width="15%">N/A</td>
                <%'data2.movenext()%>
                <%'end if%>
            <%else%>
                <%if data1("tm_tournament") = data2("tm_tournament") then%>
                    <tr class="bg<%=bg%>">
                        <td width="65%"><%=data2("tm_Tournament")%></td>
                        <td width="20%">Har rettighed</td>
                        <td width="15%"><a href="userTourLst.asp?action=remove&rdid=<%=data2("tm_Tournament")%>&usid=<%=data1("ta.us_ID")%>">Fjern</a></td>
                    <%'data2.movenext()%>
                    <%'end if%>
                <%elseif data1("tm_tournament") <> data2("tm_tournament") then%>
                      <tr class="bg<%=bg%>">
                        <td width="65%"><%=data2("tm_Tournament")%></td>
                        <td width="20%">Har ikke rettighed</td>
                        <td width="15%"><a href="userTourLst.asp?action=add&rdid=<%=data2("tm_Tournament")%>&usid=<%=data1("ta.us_ID")%>">Tildel</a></td>
                <%end if%>
            </tr>
            <%end if%>
        <%
        data2.movenext
        loop
    data1.movenext
    loop
    'next
     
    set data2 = nothing
    set data1 = nothing
    set data = nothing
end if
Avatar billede fennec Nybegynder
19. maj 2004 - 10:54 #4
du skal have din relation med på data2. Et eks.

set rs1 = conn.execute("select id, vej, husnr from MineHuse")
do while not rs1.eof
  response.write rs1("vej") & " " & rs1("husnr")
  set rs2 = conn.Execute("select name from personer where husID="& rs1("id")) '<---------
  do while not rs2.eof
    response.write rs2("name")
    rs2.MoveNext
  loop
  rs1.MoveNext
loop
Avatar billede nadster Nybegynder
19. maj 2004 - 14:00 #5
hmm, tror ikke det er der problemet ligger. Altså : set rs2 = conn.Execute("select name from personer where husID="& rs1("id")) '<---------

Hvis jeg sætter et = på, så for jeg kun vist de tournaments, som personen har rettighed til. Jeg skulle jo gerne have vist alle tours, og så skal muligheden for at ændre rettighed så være der for hver tournament.
Avatar billede fennec Nybegynder
19. maj 2004 - 14:08 #6
vis mig lige data1 og data2 sql sætningerne.....
Avatar billede nadster Nybegynder
19. maj 2004 - 14:31 #7
mySQL1 = "SELECT * FROM tblUser u " &_
      "INNER JOIN Touradmin ta ON u.us_ID = ta.us_ID " &_
      "WHERE u.us_ID = " & request.QueryString("usid") & " " &_
      "ORDER BY ta.tm_Tournament"

  mySQL2 = "SELECT DISTINCT tm_Tournament FROM Tilmeldinger " &_
      "ORDER BY tm_Tournament"
Avatar billede fennec Nybegynder
19. maj 2004 - 15:05 #8
Jeg skal lige være sikker på, hvad det er du vil vise. For der skal laves lidt om på sql'erne. Og hvad bruges de 3 tabeller til (tblUser, Touradmin, Tilmeldinger)
Avatar billede nadster Nybegynder
19. maj 2004 - 15:17 #9
tblUser --> har info om brugeren i
Touradmin --> har info om hvilke tours som brugeren har rettighed til
tilmeldminger --> indeholdende en masse tilmeldinger til de forsk. tours. Men det er også herfra at tournavnet bliver hentet (mySQL2). Det er ikke mig der har bygget databasen op, så jeg ved ikke lige hvorfor det ligger derinde.

Det jeg skal have vist. Lad os sige at vi har tour1, tour2 og tour3. Brugeren Bent har rettighed til at redigere i tour1 og tour3. Så skal jeg have vist en liste der ser sådan her ud:

TourNavn: - Rettighed:          - Ændringsmulighed
tour1    - Har rettighed      - Fjern
tour2    - Har ikke rettihged  - Tildel
tour3    - Har rettighed      - Fjern

Fjern og tildel er så links der indsætter eller sletter en ny entry i tabellen touradmin...

Så det den gør med ovenstående kode, er at vise det sådan her:
TourNavn: - Rettighed:          - Ændringsmulighed
tour1    - Har rettighed      - Fjern
tour2    - Har ikke rettihged  - Tildel
tour3    - Har rettighed      - Tildel
tour1    - Har rettighed      - Tildel
tour2    - Har ikke rettihged  - Tildel
tour3    - Har rettighed      - Fjern

Altså den viser alle tours to gange, en for hver tour der er rettighed til. Hvis jeg sletter den ene, så står det fint, men går altså galt når jeg tildeler flere rettigheder til en person.
Avatar billede fennec Nybegynder
19. maj 2004 - 15:40 #10
Det virker som om du mangler en tabel. Som jeg kan se det skal det være sådan:

users tabel:
id, navn, osv....

tour tabel (mangler):
id, tournavn, osv.....

user2tourAdmin:
userID, tourID

nu ved jeg ikke hvordan tilmelding fungerer. Om det er alle mennesker, eller kun de users i databasen, der kan tilmelde sig.

tilmelding tabel 1 (kun dem fra database):
id, tourID, userID

tilmelding tabel 2 (alle):
id, tourID, username, osv....
Avatar billede nadster Nybegynder
19. maj 2004 - 15:42 #11
der mangler tabeller, det har jeg også konkluderet. Men som det er, så kan jeg ikke lave nye tabeller. Det er den her udgave jeg har at gå ud fra... Lidt træls, men sådan er det desværre...
Avatar billede fennec Nybegynder
19. maj 2004 - 15:48 #12
pis......

hvordan oprette du så en tour??? Der skal jo være en tilmelding, da navnet står heri.
Avatar billede nadster Nybegynder
19. maj 2004 - 15:55 #13
Det kommer et andet sted fra, fra et andet site. Det er også derfor det er lidt mystisk at hente et tournavn ud. Jeg havde nu også lavet det på en anden måde, hvis det havde været mig der havde fået lov til at bestemme fra starten af...

Men jeg har fået snævret mit problem ind nu. Jeg kører en do while igennem alle de gange der er "hits" i touradmin tabellen. Og når der så er rettigheder til 2 tours for en bruger, så er det jo klart at den skriver det hele 2 gange. Men hvordan dælen for jeg den så krejlet, det er lige det...
Avatar billede fennec Nybegynder
19. maj 2004 - 16:00 #14
kikker lige på det senere....
Avatar billede fennec Nybegynder
21. maj 2004 - 08:25 #15
jeg bliver nok nød til at skrive det som seudo kode, for jeg kan ikke helt forstå opbygningen.

set rs = conn.execute("select alle tour (kun en gang)")
do while not rs.eof
  set rs1 = conn.execute("select * from Touradmin where userid=DinUser and tourID="& rs("tourID"))
  if not rs1.eof then
    'Har adgang
  else
    'Har ikke adgang
  end if
  rs.MoveNext
loop

Noget i denne stil.
Avatar billede nadster Nybegynder
21. maj 2004 - 08:43 #16
Jeg havde en kammerat til at kigge på det også, og det var også den løsning han kom med igår. Og det virker. Så smid et svar og du får point.

Tak for hjælpen!
Avatar billede fennec Nybegynder
21. maj 2004 - 08:44 #17
ok.
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