Avatar billede sitedev Nybegynder
28. august 2003 - 02:15 Der er 8 kommentarer og
1 løsning

slette alle

har brug for at kunne loope ned igennem
recordsettet
for at finde alle records som hører til toppen af en struktur

ID    parentmenu     
1      1
2      1
3      1
4      1
5      2
6      2
7      2
8      2
9      5
10    5
12    9
13    9
14    10
15    10
16    10
17    10
18    14
19    14
20    14

eks.

slette ID=10

ID 10 har nogle childs som hedder 14,15,16 & 17

disse har så nogle childs, f.eks 14 har childs 18,19 & 20

jeg har brug for at kunne slette alle disse ned i uendeligt mange sublevels.
indtil videre kan jeg kun kode så root og 1 child dvs. 10+14+15+16+17 bliver slettet.
Kan ikke lige lure hvordan jeg looper igen og igen og igen (uendeligt eller til sidste child) indtil alle der hører til den root er slettet. ;-)

pseudokode
<--
do while not rs.eof
delete rs("id")

    do while not rs2.eof
    delete rs2("id")
    rs2.movenext
    loop

rs.movenext
loop
-->

kan nogle hjælpe ????

med venlig hilsen
Bo Petersen.
Avatar billede m_skau Nybegynder
28. august 2003 - 10:59 #1
Hvad med dette forslag

pseudokode - sletter en gren startende med "parentid"
<--
    Sub sletgren(parentid As Integer)
        Dim sletdisse As String

        Do While Not rs.eof
            If rs("id") = parentid Then
                sletdisse = sletdisse & "," & rs("id")
            End If
        If instr(sletdisse, "," & rs("parentmenu") ",") then
                sletdisse = sletdisse & "," & rs("id")
            End If
            rs.movenext()
        Loop
        rs.movefirst()
        Do While Not rs.eof
      if instr(sletdisse, "," & rs("id") ",") then
                rs.delete()
          End If
          rs.movenext()
        Loop
    End Sub
-->

Mvh

Martin Skau
Avatar billede m_skau Nybegynder
28. august 2003 - 11:01 #2
Mangler lige et
  & ","
på slutningen af hver af de linier der begynder med sletdisse =
Avatar billede m_skau Nybegynder
28. august 2003 - 11:36 #3
Min første "kommentar" skulle have været et svar. Derfor dette svar i stedet.
Avatar billede terry Ekspert
31. august 2003 - 11:48 #4
Hi again,
Just put a little example together to give you an idea as how it can be done. Getting this into ASP is really up to you but I doubt that it is a problem.

'Start by calling DeleteMenuListy with level we want to delete from
DeleteMenuList 10
   
Function DeleteMenuList(ThisMenu As Long)
Dim db As Database
Dim rstChild As Recordset

    Set db = CurrentDb
   
    'Now we select all child records under the current level (part)
    Set rstChild = db.OpenRecordset("SELECT ID FROM tblMenu WHERE ParentMenu  = " & ThisMenu)
   
    Else
        'Now we loop through each child to see if they too have children
        Do While Not rstChild.EOF

'Here is the recursive call           
            DeleteMenuList rstChild!ID
           
            rstChild.MoveNext
       
        Loop
    End If
   
    'Now delete the level you are at, SQL for that is>
    ' "DELETE FROM tblMenu WHERE ID = " & ThisMenu
   
    Set rstChild = Nothing
   
    Set db = Nothing

End Function
Avatar billede terry Ekspert
31. august 2003 - 11:50 #5
Oops! Little error there :o)

'Start by calling DeleteMenuListy with level we want to delete from
DeleteMenuList 10
   
Function DeleteMenuList(ThisMenu As Long)
Dim db As Database
Dim rstChild As Recordset

    Set db = CurrentDb
   
    'Now we select all child records under the current level (part)
    Set rstChild = db.OpenRecordset("SELECT ID FROM tblMenu WHERE ParentMenu  = " & ThisMenu)
   
    'Now we loop through each child to see if they too have children
    Do While Not rstChild.EOF
       
        DeleteMenuList rstChild!ID
       
        rstChild.MoveNext
   
    Loop
   
    'Now delete the level you are at, SQL for that is>
    ' "DELETE FROM tblMenu WHERE ID = " & ThisMenu
   
    Set rstChild = Nothing
   
    Set db = Nothing

End Function
Avatar billede terry Ekspert
31. august 2003 - 11:53 #6
You can see that the function DeleteMenuList is actually calling itself to traverse down to the child nodes
Avatar billede terry Ekspert
31. august 2003 - 11:58 #7
The DELETE is actually happening when we start back tracking UP after visiting the bottom of the root
Avatar billede sitedev Nybegynder
31. august 2003 - 12:29 #8
i made this code,
and the error was a simple type error mistake in the code

this works for me

<%
nRootID = request("id")
response.write "<br>before function " & nRootID
' response.write nRootID

    set rs=conn.execute("SELECT * FROM menutree")

FUNCTION deleteRoot(nRootID)

    set rs=conn.execute("SELECT * FROM menutree WHERE parentmenu =  "& nRootID )

    do while not rs.EOF
'        deleteRoot rs("id")
response.write "<br>within function " & rs("id") & nRootID
        rs.MoveNext
    loop

delete =    ("DELETE FROM menutree WHERE id = " & GetID)
' conn.execute(delete)
response.write delete

END FUNCTION
response.write "<br>after function " & nRootID
deleteRoot nRootID
%>
Avatar billede terry Ekspert
31. august 2003 - 12:30 #9
OK :o)
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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