Avatar billede entracore Nybegynder
06. marts 2003 - 09:36 Der er 12 kommentarer og
1 løsning

Rekursiv rutine

Hey

Jeg har en lavet en rekursiv rutine der har til formål at hente et givent antal menu punkter og børn og børnebørn til disse fra en tabel.

Men af en eller anden uforklarlig årsag får jeg en fejl der lyder: "Eeither BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record."

Min kode ser således ud:

<%
    Dim aStrConn
    Dim aStrSql
    Dim aStrRec
    Dim aStrNode
   
    Set aStrConn = Server.CreateObject("Adodb.Connection")
    aStrConn.Open "Driver=Sql Server; Server=Slayer-Station; Database=Transport_Screen; Uid=sa; PWD=sa;"
   
    Public Sub GetNode(ByVal ParentID)
   
        Select Parent_ID, Child_ID, Text From TblMenu Where Child_ID = " & ParentID
        Set aStrRec = aStrConn.Execute(aStrSql)
       
        Do While Not aStrRec.Eof
           
                        aStrNode = aStrNode & aStrRec("Child_ID") & ":" & aStrRec("Parent_ID") & ":" & aStrRec("Text") & ","
           
            Call GetNode (aStrRec("Parent_ID"))
           
            aStrRec.MoveNext
       
        Loop
       
    End Sub
   
    GetNode(2)
   
    Set aStrRec = Nothing
    Set aStrConn = Nothing
   
%>

Håber at der er nogle der kan hjælpe :-)
Avatar billede keysersoze Ekspert
06. marts 2003 - 09:43 #1
HUSK - gem dit password til db'en!! har før haft en herinde der blev "hacket"...

prøv følgende;

Select Parent_ID, Child_ID, Text From TblMenu Where Child_ID = " & ParentID
Set aStrRec = aStrConn.Execute(aStrSql)

If aStrRec.EOF then
    response.write "resultat er tomt"
else       
    Do While Not aStrRec.Eof
        aStrNode = aStrNode & aStrRec("Child_ID") & ":" & aStrRec("Parent_ID") & ":" & aStrRec("Text") & ","
        Call GetNode (aStrRec("Parent_ID"))
    aStrRec.MoveNext
    Loop
end if
Avatar billede eagleeye Praktikant
06. marts 2003 - 09:45 #2
Du er nød til at definere dit recordset inde i functionen og ikke som en global. Eller overskriver du dine gamle data for hver gang du kalder dunctionen og så det vil virkede ned til den sidste. På vej tilbage vil dit recordet så være tomt og den vil fejle i  aStrRec.MoveNext  Så lav koden sådan her:  Din Connection skulle gerne kunne være global da det er samme database.



<%
    Dim aStrConn
    Dim aStrSql
   
    Dim aStrNode
   
   
    aStrConn.Open "Driver=Sql Server; Server=Slayer-Station; Database=Transport_Screen; Uid=sa; PWD=sa;"
   
    Public Sub GetNode(ByVal ParentID)
        Dim aStrRec
        Set aStrConn = Server.CreateObject("Adodb.Connection")

        Select Parent_ID, Child_ID, Text From TblMenu Where Child_ID = " & ParentID
        Set aStrRec = aStrConn.Execute(aStrSql)
       
        Do While Not aStrRec.Eof
           
                        aStrNode = aStrNode & aStrRec("Child_ID") & ":" & aStrRec("Parent_ID") & ":" & aStrRec("Text") & ","
           
            Call GetNode (aStrRec("Parent_ID"))
           
            aStrRec.MoveNext
       
        Loop
       
    End Sub
   
    GetNode(2)
   
    Set aStrRec = Nothing
    Set aStrConn = Nothing
   
%>
Avatar billede entracore Nybegynder
06. marts 2003 - 09:45 #3
keysersoze >> Desværre - jeg får stadigvæk den samme fejl.
Avatar billede eagleeye Praktikant
06. marts 2003 - 09:46 #4
Hov jeg fik flyttet Connection
Avatar billede eagleeye Praktikant
06. marts 2003 - 09:47 #5
<%
    Dim aStrConn
    Dim aStrSql
   
    Dim aStrNode
   
    Set aStrConn = Server.CreateObject("Adodb.Connection")
    aStrConn.Open "Driver=Sql Server; Server=Slayer-Station; Database=Transport_Screen; Uid=sa; PWD=sa;"
   
    Public Sub GetNode(ByVal ParentID)
        Dim aStrRec

        Set aStrRec = Server.CreateObject("ADODB.Recordset")

        Select Parent_ID, Child_ID, Text From TblMenu Where Child_ID = " & ParentID
        Set aStrRec = aStrConn.Execute(aStrSql)
       
        Do While Not aStrRec.Eof
           
                        aStrNode = aStrNode & aStrRec("Child_ID") & ":" & aStrRec("Parent_ID") & ":" & aStrRec("Text") & ","
           
            Call GetNode (aStrRec("Parent_ID"))
           
            aStrRec.MoveNext
       
        Loop
       
    End Sub
   
    GetNode(2)
   
    Set aStrRec = Nothing
    Set aStrConn = Nothing
   
%>
Avatar billede eagleeye Praktikant
06. marts 2003 - 09:50 #6
Prøv den sidste jeg har vist. Som før skrevet jeg fik flyttet den forkerte linje.
Avatar billede entracore Nybegynder
06. marts 2003 - 09:54 #7
eagleeye >> Dit eksempel generede en ny fejl som lyder "Out of memory: Server.CreateObject i den linie hvor du deklarere aStrRec

Set aStrRec = Server.CreateObject("ADODB.Recordset")
Avatar billede eagleeye Praktikant
06. marts 2003 - 09:56 #8
Efter Loop bør tilføjes:


        Loop
        aStrRec.Close
        Set aStrRec = Nothing
Avatar billede entracore Nybegynder
06. marts 2003 - 09:57 #9
eagleeye >> Stadigvæk den samme fejl med Out of memory ;-)
Avatar billede eagleeye Praktikant
06. marts 2003 - 09:58 #10
Ja det er et problem med rekursive rutiner det gælder om at optimere data forbruget og et recordset fylder meget. Hvor mange levels har du??
Avatar billede entracore Nybegynder
06. marts 2003 - 09:59 #11
eagleeye >> Jeg har 5 levels.
Avatar billede eagleeye Praktikant
06. marts 2003 - 10:03 #12
hmm det lyder jo ikke af meget.

Prøv at fjerne denne linie jeg ved ikke om den giver noget overhead:


      Set aStrRec = Server.CreateObject("ADODB.Recordset")
Avatar billede entracore Nybegynder
06. marts 2003 - 10:07 #13
eagleeye >> Nej det var min fejl - jeg byttede rundt på Parent og Child id i min forspørgsel. Det virker fint nu. Mange tak :-)
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