Avatar billede lklingenberg Nybegynder
14. juli 2005 - 16:01 Der er 6 kommentarer og
1 løsning

SQL der fanger menuer i menusystem

Hi E,

Jeg har et menusystem, hvor hvert menupunkt relaterer sig til den ovenoverliggend menu via et parent id:

punkt 1 [id=1,parentid=NULL]
  punkt 1.1 [id=2,parentid=1]
  punkt 1.2 [id=3,parentid=1]
punkt 2 [id=4,parentid=NULL]
  punkt 2.1 [id=5,parentid=4]
    punkt 2.1.1 [id=6,parentid=5]
  punkt 2.2 [id=7,parentid=4]
punkt 3 [id=8,parentid=NULL]
...
...

Hvordan konstruerer jeg en stykke SQL, der fx kan fange punkt 2 og alle underliggende punkter? Kan jeg bruge en form for en løkke der tjekker om et givent punkts id anvendes som parentid af andre punkter?
Avatar billede ldanielsen Nybegynder
15. juli 2005 - 09:19 #1
Jeg har præcis samme konstruktion, men ingen løsning.

Lytter spændt ...
Avatar billede mnoer Nybegynder
15. juli 2005 - 13:10 #2
Du kan lave en cursor hvor du kører dem igennem hvor parentid er NULL, for hver af dem henter du så dem der har parentid = det id du er nået til i cursoren.
Avatar billede arne_v Ekspert
15. juli 2005 - 18:17 #3
en mulighed er at lave en ekstra tabel:

id descendentinclself
1  1
1  2
1  3
2  2
3  3
4  4
4  5
4  6
4  7
5  5
5  6
6  6
7  7
8  8
Avatar billede arne_v Ekspert
03. september 2005 - 19:11 #4
klingenberg>

kommet videre ?
Avatar billede lklingenberg Nybegynder
05. september 2005 - 10:16 #5
nej, faktisk ikke. jeg har dog også haft andre ting at tage mig til ;-)
vil afprøve din løsning en af dagene, så jeg venter lige lidt med at slutte spørgsmålet
Avatar billede lklingenberg Nybegynder
03. oktober 2005 - 14:37 #6
Løsningen er her (@sort bruges til at kalde en anden sp hvor sortindex på menuern allokeres):


CREATE PROCEDURE dbo.procDeleteMenu
(
    @menu        INTEGER,
    @sort        INTEGER
)

AS

-- Createing the temporary table in which the menus for deletion is placed.
CREATE TABLE #menu_table (menu INT PRIMARY KEY)

-- Inserting the initial menu: MenuUI = @menu
INSERT INTO #menu_table (menu) VALUES(@menu)

-- Declare the variables to store the values returned by FETCH.
DECLARE @menutodelete INTEGER, @parent INTEGER, @menutolookup INTEGER, @rowsadded INTEGER

-- Declare the cursor for the initial SELECT (child element for ParentUI=@menu)
DECLARE menu_cursor CURSOR FOR
    SELECT MenuUI FROM tblMenu WHERE ParentUI=@menu

OPEN menu_cursor

-- Going to first row and asigning value to variable
FETCH NEXT FROM menu_cursor
INTO @menutodelete

-- Inserting child menus into temporary table for later use
WHILE @@FETCH_STATUS = 0
BEGIN
   
    INSERT INTO #menu_table (menu)
        VALUES(@menutodelete)
    FETCH NEXT FROM menu_cursor   
    INTO @menutodelete
END

CLOSE menu_cursor
DEALLOCATE menu_cursor

-- Looping through temporary table and declaring cursor for child elements (discarting existing child elements)

DECLARE table_cursor CURSOR FOR
    SELECT menu FROM #menu_table WHERE menu<>@menu

OPEN table_cursor
FETCH NEXT FROM table_cursor
INTO @menutolookup

WHILE @@FETCH_STATUS = 0
BEGIN

    -- Declare the second cursor for the children
    DECLARE menu_cursor2 CURSOR FOR
    SELECT MenuUI FROM tblMenu WHERE ParentUI=@menutolookup AND MenuUI<>@menutolookup

    OPEN menu_cursor2

    -- Going to first row and asigning value to variable
    FETCH NEXT FROM menu_cursor2
    INTO @menutodelete   
   
    -- Looping through cursor and inserting new menus where ParentUI = MenuUI for child elemens (from temporary table)
    WHILE @@FETCH_STATUS = 0
    BEGIN
       
        INSERT INTO #menu_table (menu)
            VALUES(@menutodelete)
        FETCH NEXT FROM menu_cursor2
        INTO @menutodelete   
   
    END
   
    CLOSE menu_cursor2
    DEALLOCATE menu_cursor2
   
    FETCH NEXT FROM table_cursor
    INTO @menutolookup

END

CLOSE table_cursor
DEALLOCATE table_cursor

-- Creating cursor for deletion
DECLARE menu_cursor3 CURSOR FOR
    SELECT * FROM #menu_table

OPEN menu_cursor3
FETCH NEXT FROM menu_cursor3
INTO @menutodelete

WHILE @@FETCH_STATUS = 0
BEGIN
    DELETE FROM tblMenu WHERE MenuUI=@menutodelete
    FETCH NEXT FROM menu_cursor3
    INTO @menutodelete
END

CLOSE menu_cursor3
DEALLOCATE menu_cursor3

DROP TABLE #menu_table
Avatar billede lklingenberg Nybegynder
03. oktober 2005 - 14:39 #7
Hvis der er nogen, der kan optimere sætningen, er jeg lutter øre (fx kunne man sætte NOCOUNT for at spare lidt servertid).
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
Computerworld tilbyder specialiserede kurser i database-management

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



Seneste spørgsmål Seneste aktivitet
I dag 10:28 PDFEngine Af barth i Andet software
I går 22:40 Butte indhold i celler Af lurup i Excel
I går 15:24 Power Query Af djsimonsen i Excel
I går 14:43 Hvis ikke på liste, tilføj værdier til liste Af TheLibrarian i Excel
I går 11:33 Windows 11 Af ranni i Windows