Avatar billede guro.not Nybegynder
18. marts 2001 - 03:05 Der er 26 kommentarer og
1 løsning

recursive Sub???? HJÆLP

Hejsa..

En af mine venner har lavet en smart sub i vb6. denne sub har jeg prøvet at lave i ASP.. men...

Asp siden ser således ud:

<!--#include file=\"adovbs.asp\"-->
<html>
<head>
    <title>Menu</title>
</head>

<body>
<%
Sub FindSubC(byval rs, byval Parent, byval u)
    Dim rsWhere
    rs.MoveFirst
        While Not rs.EOF
            If (rs(\"Parent\") = Parent) Then
                rsWhere = rs.AbsolutePosition
                response.write \"ID: \" & rs(\"ID\") & \" - Parent: \" & Parent & \" - u: \" & u & \"<br>\"
                Call FindSubC(rs, rs(\"ID\"), u+1)
                i = rsWhere - 1
                rs.Move i, 1
            End If
            rs.MoveNext
        Wend
End Sub

StrCon = \"DRIVER={Microsoft Access Driver (*.mdb)};DBQ=\"&Server.MapPath(\"shop.mdb\")

Set rs = Server.CreateObject(\"ADODB.Recordset\")
rs.Open \"Categories\", StrCon, adOpenKeyset, adLockBatchOptimistic, adCmdTable
 
rs.Movefirst
Call FindSubC(rs, 0, 0)

rs.close
Conn.Close
Set rs = Nothing
Set Conn = Nothing
%>
</body>
</html>

problemet er at man aldrig kommer vider men der i mod får lavet et eviheds loop..

databaser ser sådan ud:

Categories (ID, Name, Parent)

1,Link1,0 (0 = top level)
2,Link2,0
3,Link1_1,1 (under punkt til Link1)

Men i udskriften bliver kun den første række skrevet en milion gange..

HELP!!!

Guro.not
Avatar billede runesoft Nybegynder
18. marts 2001 - 15:11 #1
Jeg er endnu ikke helt med på hvad du egentligt foretager dig i scriptet. Så vidt jeg ved kan man ikke overføre recordset byval. Derfor vil du hver gang du kalder funktionen sætte pointeren til den første position. prøv at fjerne rs.movefirst.  Hvad sker der så?
Avatar billede runesoft Nybegynder
18. marts 2001 - 15:26 #2
Jeg mangler forresten også lige en forklaring på hvad det er du prøver på. Jeg kan umiddelbart ikke se hvorfor funktionen er recursiv.
Avatar billede guro.not Nybegynder
18. marts 2001 - 15:33 #3
subben skal bruges til at laven en menu med under menuer til.. Til hver under menu kan der også være andre under menuer.

Tabellen:
ID, Name, Parent

Parent bruges til at se hvilken menu som ID høre til under..

Prøblemet er at recordsettet skal løbes i gennem mere end en gang.. derfor kaller subben sig selv med rs og ID for den menu som den er nået til.

u er baren en tælder som jeg brugte til at checke om der blev lagt en til u.. men det gør der ikke???

Jeg håbet at det er en bedre forklaring..

Hilsen Guro.not
Avatar billede soerens Nybegynder
18. marts 2001 - 22:09 #4
Prøv at lave en Response.Flush lige efter Response.Write\'n i den sub, og Copy\'n\'Paste så en 5-10 linier her på Eksperten. Det gør det lidt nemmere at dekode hvad den gør ;-)

/SørenS.
Avatar billede guro.not Nybegynder
19. marts 2001 - 08:05 #5
Hej igen..

Her er hvad jeg får af udtræk:

ID: 2 - Parent: 0
ID: 3 - Parent: 0
ID: 3 - Parent: 0
ID: 3 - Parent: 0
ID: 3 - Parent: 0
ID: 3 - Parent: 0
osv.

udtrækket skulle have set sådan ud.
ID: 2 - Parent: 0
ID: 20 - Parent: 2
ID: 21 - Parent: 2
ID: 22 - Parent: 2
ID: 23 - Parent: 2
ID: 3 - Parent: 0
ID: 6 - Parent: 3
ID: 7 - Parent: 3
ID: 8 - Parent: 3
ID: 25 - Parent: 3
ID: 4 - Parent: 0
ID: 12 - Parent: 4
ID: 26 - Parent: 12
ID: 13 - Parent: 4

Hilsen Guro.not
Avatar billede soerens Nybegynder
19. marts 2001 - 09:23 #6
Vildt gæt: Fjern rs.MoveFirst inde i sub\'en.

Jeg kan ikke lige blive enig med mig selv om den linie skal fjernes, eller om der mangler en anden linie et sted.

Prøv det, prøv det. Alt efter resultatet skal jeg nok hjælpe dig lidt mere ;-)

/SørenS.
Avatar billede guro.not Nybegynder
19. marts 2001 - 09:26 #7
Hej igen..

Det hjælper intet (ØV)

Udtrækket:
ID: 2 - Parent: 0
ID: 3 - Parent: 0
ID: 3 - Parent: 0
ID: 3 - Parent: 0
ID: 3 - Parent: 0
ID: 3 - Parent: 0
ID: 3 - Parent: 0
ID: 3 - Parent: 0
ID: 3 - Parent: 0
osv..

Det er det samme som før..
Avatar billede soerens Nybegynder
19. marts 2001 - 09:57 #8
Hmmm, ok, jeg tog fejl, MoveFirst linien SKAL være der ;-)

Prøv at fjerne følgende:

  i = rsWhere - 1
  rs.Move i, 1

Og sæt den her ind istedet:

  rs.Move rsWhere, 1
Avatar billede guro.not Nybegynder
19. marts 2001 - 09:59 #9
så blev udtrækket:

ID: 2 - Parent: 0
ID: 2 - Parent: 0
ID: 2 - Parent: 0
ID: 2 - Parent: 0
ID: 2 - Parent: 0
ID: 2 - Parent: 0
ID: 2 - Parent: 0
osv..

Håber ikke at du giver op...
Avatar billede soerens Nybegynder
19. marts 2001 - 11:54 #10
Øh.... hvad med \"u\" ?

Kommer den ikke med i outputtet??

Det burde den.....

(glor lige lidt mere på sub\'en, jeg skal nok få den løst ;-)

/SørenS.
Avatar billede guro.not Nybegynder
19. marts 2001 - 12:08 #11
hejsa..

Jeg har sat tælleren u ind igen..

ID: 2 - Parent: 0 - u: 0
ID: 2 - Parent: 0 - u: 0
ID: 2 - Parent: 0 - u: 0
ID: 2 - Parent: 0 - u: 0
ID: 2 - Parent: 0 - u: 0
ID: 2 - Parent: 0 - u: 0
ID: 2 - Parent: 0 - u: 0
ID: 2 - Parent: 0 - u: 0

Der burte blive lagt en til u, men det gør der ikke.

Guro.not
Avatar billede soerens Nybegynder
19. marts 2001 - 12:19 #12
I know, den opfører sig underligt.....

Jeg har lige fået dit kode op at køre her hos mig, så forvent et *ordentligt* svar i løbet af en time eller to (ska\' li\' ha\' no\'et at æde først ;-)

/SørenS.
Avatar billede guro.not Nybegynder
19. marts 2001 - 12:35 #13
helt ok.. velbekomme *S*

Jeg har zippet scriptet og db\'en hvis du vil have have det at kigge på..

www.brisans.dk/subben.zip
Avatar billede soerens Nybegynder
19. marts 2001 - 13:21 #14
Ok, nedenunder er den kode der fungerer.

Problemet var at AbsolutePosition ikke kunne bestemme hvor i Recordset\'et den stod (blev ved med at returnere -1) og jeg har derfor lavet positionsbestemmelsen manuel istedet.

<%
Function FindSubC(rs, Parent, u)
    Dim rsWhere
    Dim intPos
   
    rs.MoveFirst
    intPos = 1
   
    Do While Not rs.EOF
        If CInt(rs(\"Parent\")) = Parent Then
            response.write \"ID: \" & rs(\"ID\") & \" - Parent: \" & Parent & \" - u: \" & u & \"<br>\"
            Response.Flush
               
            FindSubC rs, CInt(rs(\"ID\")), u+1
           
            rs.Move intPos-1, 1
        End If
       
        intPos = intPos +1   
        rs.MoveNext
    Loop
End Function

\'Create database connection
Set cnnGuroNot = Server.CreateObject(\"ADODB.Connection\")
cnnGuroNot.Open Application(\"strDSN\")

Set rs = Server.CreateObject(\"ADODB.Recordset\")
rs.Open \"tblGuroNot\", cnnGuroNot, adOpenKeyset, adLockOptimistic
 
FindSubC rs, 0, 0
%>


/SørenS
Avatar billede guro.not Nybegynder
19. marts 2001 - 14:07 #15
Hej igen..

Den virker ikke helt.. (ØV)

Jeg har lagt det online så du kan se hvordan det ter sig..(jeg har fjernet u igen)
www.brisans.dk/menu/sub.asp
og www.brisans.dk/menu/menu.zip

udtrækket:
ID: 2 - Parent: 0
ID: 20 - Parent: 2

Der mangler en masse rækker

Håber at du stadig gider hjælpe..
Avatar billede soerens Nybegynder
19. marts 2001 - 14:10 #16
Kan du ikk\' lige gi\' mig dine data også, ala det du har i aller første indlæg?

/SørenS
Avatar billede guro.not Nybegynder
19. marts 2001 - 14:12 #17
Her er hele asp filen
(hvis du vil have det hele med db. så download zip filen)

<html>
<head>
    <title>Menu</title>
</head>

<body>
<%
on error resume next

Function FindSubC(rs, Parent)
    Dim rsWhere
    Dim intPos

    rs.MoveFirst
    intPos = 1

    Do While Not rs.EOF
        If CInt(rs(\"Parent\")) = Parent Then
            response.write \"ID: \" & rs(\"ID\") & \" - Parent: \" & Parent & \"<br>\"
            Response.Flush

            FindSubC rs, CInt(rs(\"ID\"))

            rs.Move intPos-1, 1
        End If

        intPos = intPos +1
        rs.MoveNext
    Loop
End Function

\'Create database connection
Set Conn = Server.CreateObject(\"ADODB.Connection\")
strDSN = \"DRIVER={Microsoft Access Driver (*.mdb)};DBQ=\"&Server.MapPath(\"shop.mdb\")
Conn.Open strDSN
strSQL = \"SELECT * FROM Categories\"
Set rs = Conn.Execute(strSQL)

FindSubC rs, 0

\'rs.movefirst

\'While Not rs.EOF
\'    response.write \"ID: \" & rs(\"ID\") & \" - Parent: \" & rs(\"Parent\") & \"<br>\"
\'    Response.Flush
\'    rs.Movenext
\'WEnd

rs.close
Conn.Close
Set rs = Nothing
Set Conn = Nothing
%>
</body>
</html>



Guro.not
Avatar billede guro.not Nybegynder
19. marts 2001 - 14:14 #18
Her er tabelen som text..


\"ID\";\"Name\";\"Description\";\"Parent\"
2;\"Videofilm\";\"Mangler du en god film til en kold regnvejrsaften? Så kig her og find lige netop den film du gerne vil se.\";0
3;\"Computerspil\";\"Alle som interesserer sig for computerspil kan ganske sikkert finde noget interessant her.\";0
4;\"Bøger\";\"Hvis du godt kan lide at læse bøger er dette måske lige stedet for dig.\";0
6;\"Bilspil\";\"\";3
7;\"Strategispil\";;3
8;\"Sportsspil\";;3
12;\"Bøger om mad og drikke\";\"\";4
13;\"Computerbøger\";\"\";4
14;\"Ordbøger\";\"\";4
15;\"Bøger om programmering\";\"\";13
16;\"Computerbøger for begyndere\";\"\";13
17;\"Bøger om Active Server Pages\";\"\";15
18;\"Bøger om C++\";\"\";15
19;\"Bøger om HTML / JavaScript\";\"\";15
20;\"Actionfilm\";\"\";2
21;\"Dramafilm\";\"\";2
22;\"Komediefilm\";\"\";2
23;\"Dokumentarfilm\";\"\";2
25;\"Action GameZ\";\"GameZ, GameZ and more GameZ\";3
26;\"1321321\";\"13621651\";12
Avatar billede soerens Nybegynder
19. marts 2001 - 15:01 #19
Hmmmm, virker umiddelbart fint hos mig...

Fjern lige den der \"on error resume next\" og se om den ikke spytter en fejlmeddelelse ud så.

\"u\"\'eren er faktisk også meget rar, du kan bruge den til at indente dine menuer vha. fx. følgende kode:
response.write String(u,\"+\") & \" ID: \" & rs(\"ID\") & \" - Parent: \" & Parent & \" - u: \" & u & \"<br>\"

/SørenS.
Avatar billede guro.not Nybegynder
19. marts 2001 - 15:05 #20
Hej igen.. Tak for at du ikke har givet op endnu..

ID: 2 - Parent: 0 - u: 0
+ ID: 20 - Parent: 2 - u: 1

ADODB.Recordset error \'800a0cb3\'

Current Recordset does not support bookmarks. This may be a limitation of the provider or of the selected cursortype.

/menu/sub.asp, line 22


Guro.not
Avatar billede soerens Nybegynder
19. marts 2001 - 15:18 #21
Aaaaah, du har ændret i den måde du åbner dit recordset på ;-)

Lav det om til det her:
\'Create database connection
Set Conn = Server.CreateObject(\"ADODB.Connection\")
strDSN = \"DRIVER={Microsoft Access Driver (*.mdb)};DBQ=\"&Server.MapPath(\"shop.mdb\")
Conn.Open strDSN
strSQL = \"SELECT * FROM Categories\"
Set rs = Server.CreateObject(\"ADODB.Recordset\")
rs.Open strSQL, Conn, 1
Avatar billede guro.not Nybegynder
19. marts 2001 - 15:21 #22
Hej igen..

<%
Function FindSubC(rs, Parent, u)
    Dim rsWhere
    Dim intPos

    rs.MoveFirst
    intPos = 1

    Do While Not rs.EOF
        If CInt(rs(\"Parent\")) = Parent Then
            response.write String(u,\"+\") & \" ID: \" & rs(\"ID\") & \" - Parent: \" & Parent & \" - u: \" & u & \"<br>\"
            Response.Flush

            FindSubC rs, CInt(rs(\"ID\")), u+1

            rs.Move intPos-1, 1
        End If

        intPos = intPos +1
        rs.MoveNext
    Loop
End Function

\'Create database connection

Set Conn = Server.CreateObject(\"ADODB.Connection\")
strDSN = \"DRIVER={Microsoft Access Driver (*.mdb)};DBQ=\"&Server.MapPath(\"shop.mdb\")
Conn.Open strDSN
strSQL = \"SELECT * FROM Categories\"
Set rs = Server.CreateObject(\"ADODB.Recordset\")
rs.Open strSQL, Conn, 1

FindSubC rs, 0, 0

rs.close
Conn.Close
Set rs = Nothing
Set Conn = Nothing
%>

men det giver stadig en fejl..

ID: 2 - Parent: 0 - u: 0
+ ID: 20 - Parent: 2 - u: 1

ADODB.Recordset error \'800a0cb3\'

Current Recordset does not support bookmarks. This may be a limitation of the provider or of the selected cursortype.

/menu/sub.asp, line 22


Guro.not
Avatar billede soerens Nybegynder
19. marts 2001 - 15:22 #23
....den \", 1\" eller \", adOpenKeyset\" er ret vigtig, den specificerer det der hedder en \"cursor\".

Uden parametren vil du få åbnet et recordset med en såkaldt \"adForwardOnly\"-cursor - altså et recordset hvor man kun kan bevæge sig fremad - og det er derfor du får en fejl i rs.Move linien.

En adOpenKeyset cursor (adOpenKeyset er en konstant defineret i adovbs.inc, den er lig med 1) derimod vil tillade dig at hoppe frem og tilbage i et recordset lige så tosset som du vil, den er så tilgengæld langsommere at benytte.

/SørenS.
Avatar billede guro.not Nybegynder
19. marts 2001 - 15:38 #24
Hej igen..

Jeg har fundet ud af at man også skulle angive en LockType..
rs.Open strSQL, Conn, 1, 1
det sidste 1 er adLockReadOnly
Jeg har ikke prøvet om der er andre locks der virker..

Guro.not
Avatar billede soerens Nybegynder
19. marts 2001 - 15:43 #25
Ah, ok, sad og blev helt nervøs, det virker nemlig fint her hos mig ;-)

Held & Lykke med det, og tak for point!

/SørenS
Avatar billede guro.not Nybegynder
19. marts 2001 - 15:44 #26
Det er mig der takker..

Guro.not
Avatar billede nil.dk Nybegynder
20. marts 2001 - 10:12 #27
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