Avatar billede proboss Nybegynder
19. december 2000 - 13:08 Der er 25 kommentarer og
1 løsning

Forum

Jeg er ved at lave et forum, der minder lidt om det på activserverpages.
Er det muligt i ASP og lave rekursive kald til en funktion ?
Jeg skal kalde en funktion, som har et ResultSet der fortæller hvilke svar der er til et andet svar. (Alle spm og alle svar skal være på samme side)
Problemet er at mit ResultSet bliver overskrevet, så funktionen ikke ved hvor langt den er nået i rækken.

Er det derfor muligt at lave et nyt instance af funktionen, eller er der en anden måde at gøre dette på ?

Avatar billede kasseper Nybegynder
19. december 2000 - 13:09 #1
Yeps det er klart muligt, men et godt råd er at bruge JScript da VBScript er lidt \'nolder\' at bruge når du skal bruge noget rekursivitet....
Avatar billede sone Nybegynder
19. december 2000 - 13:10 #2
Du kan sagtens lave en lokal instans.

DIM localRS
SET localRS = Conn.Execute(SQL)
...
\'rekursivt kald
Avatar billede proboss Nybegynder
19. december 2000 - 13:11 #3
hvordan gør man det
Avatar billede sone Nybegynder
19. december 2000 - 13:15 #4
FUNCTION showDocumentStructure(parentid)
  DIM isFolder, localRS
  Set localRS = Server.CreateObject(\"ADODB.RecordSet\")

  SQL=\"SELECT docid, name, title, isfolder FROM documents WHERE parentid=\" & parentid & \" ORDER BY title\"
  Set localRS = Conn.Execute(SQL)

  IF NOT localRS.EOF THEN
    WHILE NOT localRS.EOF
        WriteLn \"<A HREF=\"\"\" & localRS(1) & \"\"\">\" & localRS(2) & \"</A><BR>\"
        isFolder = localRS(3)
        IF isFolder=\"1\" THEN call showDocumentStructure(localRS(0))
        localRS.MoveNext
    WEND
  END IF
END FUNCTION
Avatar billede proboss Nybegynder
19. december 2000 - 13:19 #5
Den går desværre ikke....

Hvis du laver det således :

Function Reply(child)

    Dim RS
    SQL=\"select * from forum where id=\" & child
    set rs=conn.execute(sql)
    do while rs.eof=false
        response.write \"<br>\" & rs(\"subject\")
        reply rs(\"id\")
        rs.movenext
    loop

end function

Når du gør således bliver dit resultset (rs) slettet hver gang og derved kommer der en EOF fejl.
Functionen skal lave instances af sig selv, og afslutte dem, når der ikke er flere tråde...
Jeg ønsker altså at kalde funktionen inde i sig selv...

Avatar billede proboss Nybegynder
19. december 2000 - 13:43 #6
Er i gået i sort Drenge
Avatar billede sone Nybegynder
19. december 2000 - 14:39 #7
Du mangler

  Set RS = Server.CreateObject(\"ADODB.RecordSet\")

som instansierer dit lokale objekt.
Avatar billede tdaugaard Nybegynder
19. december 2000 - 14:42 #8
sone:> At sætte en reference til ADODB.RecordSet ER faktisk ikke nødvendigt, da du ved at skrive

Set Rs = Conn.Execute ...

sætter en ny reference, der vil slette den foregående.
Den eneste fordel ved at sætte en reference til .recordset er hvis man bruger InterDev for der kan du få context sensitive hjælp/intellisense\'n til at hjælpe dig hvis du f.eks. skrive Rs. (så kommer der en liste med mulige \"medlemmer\" af et RecordSet)
Avatar billede proboss Nybegynder
19. december 2000 - 14:55 #9
hej tdaugaard 
har du en løsning
Avatar billede sone Nybegynder
19. december 2000 - 14:55 #10
ok.

\"Medlemmer\"... som man kunne kalde funktioner eller metoder :)
Avatar billede tdaugaard Nybegynder
19. december 2000 - 14:57 #11
sone:> det var for langt at skrive ;o)
Og det hedder faktisk \"medlemmer\" af et objekt.
Avatar billede tdaugaard Nybegynder
19. december 2000 - 14:57 #12
Det påstår VB/InterDev da i hvert fald...
Avatar billede sone Nybegynder
19. december 2000 - 14:57 #13
Det kode jeg har indsat kører, så jeg ved ikke hvad du gør galt...
Avatar billede sone Nybegynder
19. december 2000 - 15:01 #14
tdaugaard:> Ikke hvis man har læst OO
Avatar billede tdaugaard Nybegynder
19. december 2000 - 15:04 #15
sone:> OO ? (hvad er det nu det står for ?)
Avatar billede tdaugaard Nybegynder
19. december 2000 - 15:06 #16
proboss:> Desværre ikke lige på stående fod (yeah right .. som om jeg stod op *G*)
Du du skulle bruge er måske et array af RecordSets hvor du bruger \"child\" som index.

Dim Rs(MAX_CHILD_NO)

Function Reply(child)
    SQL=\"select * from forum where id=\" & child
    set rs(child)=conn.execute(sql)
    do while rs(child).eof=false
        response.write \"<br>\" & rs(child)(\"subject\")
        reply rs(child)(\"id\")
        rs(child).movenext
    loop

end function


tror du ikke det ville virke !? (er ikke testet og i have no idea if it works, just a theory)
Avatar billede tdaugaard Nybegynder
19. december 2000 - 15:09 #17
hmm... men på den måde her vil du da aldrig komme ud af loopet der vil opstå ved rekursion af funktionen !? Den vil blive ved med at neste sig selv
Avatar billede sone Nybegynder
19. december 2000 - 16:31 #18
OO: Objekt Orienteret (Programmering)
Avatar billede tdaugaard Nybegynder
19. december 2000 - 16:41 #19
Jeg tænkte det nok .. men normalt siger man da OOP .. oder was !?
Avatar billede sone Nybegynder
20. december 2000 - 08:44 #20
Ja, eller OOA & OOD
Avatar billede tdaugaard Nybegynder
20. december 2000 - 13:54 #21
ja ja ... du\' prof ;o) ej .. WTF er OOA & OOD ?
Avatar billede sone Nybegynder
20. december 2000 - 13:56 #22
Analyse & Design
Avatar billede smiley2 Nybegynder
21. december 2000 - 06:41 #23
det kan jo blive ndvændigt at læse sit recordsæt ned i et array, og lave den rekursive funktion på arrayet.... så er man jo ude over alle database-fnidder-fnadder problemerne, ikke?
Avatar billede smiley2 Nybegynder
21. december 2000 - 06:43 #24
måske en lidt imperlativ løsning (nu vi leger med ord) :o)
Avatar billede tdaugaard Nybegynder
21. december 2000 - 11:55 #25
smiley2:> læs min kommentar af \"19/12 2000 15:06:29\"
Avatar billede proboss Nybegynder
29. april 2001 - 20:16 #26
lukker dette spørgsmål
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