/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Recursiv funktion eller....?
Fra : Kasper Katzmann


Dato : 12-11-03 22:12

Jeg skal lave en dropdown liste der skal vise alle sider i databasen
(MSSQL). Det er jo intet problem, men jeg skal have dem sorteret således at
man kan se hvilke sider der hører til hvor i forhold til hinanden. Altså en
heirakisk opdelt liste. Jeg tror det må være en såkaldt rekursiv funktion
jeg skal have fat i, men jeg kan bare ikke lige gennemskue hvordan jeg gør.

Er der nogen der kan hjællpe med den her?

Eksempel på den visuelle fremstilling af listen:
Forsiden
Om firmaet
Ledige stillinger
Kurser
Webkurser
ASP
ASP og databaser
HTML
CSS
Officekurser
Word
PowerPoint

De relevante felter i databasen er:
PK_PageID | PK_ParentID | Title
---------------------------------------------------
1 0 Forsiden
2 1 Om firmaet
3 1 Ledige stillinger
4 0 Kurser
5 4 Webkurser
6 5 ASP

osv. osv......

PK_ParentID er så referencen til den overliggende side og 0 refererer til
Root-level
Al hjælp er mere end velkommen

--
Mvh
Kasper Katzmann
http://www.katzmann.dk



 
 
Morten R. Rasmussen (13-11-2003)
Kommentar
Fra : Morten R. Rasmussen


Dato : 13-11-03 01:02

"Kasper Katzmann" <kasper@fjerndettekatzmann.dk> wrote in message
news:bou7jo$l52$1@sunsite.dk...
> Jeg skal lave en dropdown liste der skal vise alle sider i databasen
> (MSSQL). Det er jo intet problem, men jeg skal have dem sorteret således
at
> man kan se hvilke sider der hører til hvor i forhold til hinanden. Altså
en
> heirakisk opdelt liste. Jeg tror det må være en såkaldt rekursiv funktion
> jeg skal have fat i, men jeg kan bare ikke lige gennemskue hvordan jeg
gør.
>

Er det selve det at lave den rekursive procedure, eller det at få fat i data
på en fornuftig måde?

Du kunne læse hele dit recordset ud i et array, og gennemgå det med en
rekursiv procedure.
Kald funktionen med parent for de menupunkter den skal vise (start med 0),
og for hvert menupunkt du viser kalder du funktionen med det nuværende
menupunkts id

sån lidt a la

sub vismenu(nuvParent)
for i=lbound(rsArray,2) to ubound(rsArray,2)
if rsArray(1,i)=nuvParent then
Response.Write rsArray(2,i)
vismenu rsArray(0,i)
end if
next
end sub

Set rs=Conn.Execute("SELECT PK_PageID, PK_ParentID, Title FROM tabellen")
if not rs.EOF then
rsArray=rs.GetRows()
vismenu(0)
end if


Hvis det er en meget belastet server, så kan det anbefales at bruge triggers
til at opretholde en fast sortering på tabellen (og en angivelse af "niveau"
for menupunkterne), så du bare skal hente alle records sorteret på dette
felt.

- Morten



Kasper Katzmann (16-11-2003)
Kommentar
Fra : Kasper Katzmann


Dato : 16-11-03 00:08

Morten R. Rasmussen skrev:
> "Kasper Katzmann" <kasper@fjerndettekatzmann.dk> wrote in message
> news:bou7jo$l52$1@sunsite.dk...
>> Jeg skal lave en dropdown liste der skal vise alle sider i databasen
>> (MSSQL). Det er jo intet problem, men jeg skal have dem sorteret
>> således at man kan se hvilke sider der hører til hvor i forhold til
>> hinanden. Altså en heirakisk opdelt liste. Jeg tror det må være en
>> såkaldt rekursiv funktion jeg skal have fat i, men jeg kan bare ikke
>> lige gennemskue hvordan jeg gør.
>>
>
> Du kunne læse hele dit recordset ud i et array, og gennemgå det med en
> rekursiv procedure.
> Kald funktionen med parent for de menupunkter den skal vise (start
> med 0), og for hvert menupunkt du viser kalder du funktionen med det
> nuværende menupunkts id

Det er jo mildest talt genialt. Jeg har nu gennemtrævlet nettet for emnet.
Hver gang jeg fandt noget der bare lignede, var det uhyre kompliceret og
endnu mere resurcekrævende. Det du har beskrevet er jo hverken kompliceret
eller resurcekrævende, sååå genialt er det

Tak for det.

PS. Kan man også indsætte mellemrum (&nbsp;) for hvert niveau man kommer ned
i strukturen?
A'la det her:
Root
Level 1
Level 1
Level 2
Level 1
Level 2
Level 3


--
Mvh
Kasper Katzmann
http://www.katzmann.dk



Morten R. Rasmussen (17-11-2003)
Kommentar
Fra : Morten R. Rasmussen


Dato : 17-11-03 09:35

>
> Tak for det.
Selv tak

>
> PS. Kan man også indsætte mellemrum (&nbsp;) for hvert niveau man kommer
ned
> i strukturen?
> A'la det her:
> Root
> Level 1
> Level 1
> Level 2
> Level 1
> Level 2
> Level 3

Du skal bare tilføje en variabel, som angiver hvor langt ind du er kommet i
kaldet. den skal ganske enkelt tælles op hver gang du "dykker".

sub rekursivfunktion(Level)
if etellerandet then
rekursivfunktion Level+1
end if
end sub

rekursivFunktion 1

Du skal så bare udskrive "Level" antal &nbsp; med fx en for løkke.

- Morten




Martin Hintzmann And~ (13-11-2003)
Kommentar
Fra : Martin Hintzmann And~


Dato : 13-11-03 09:29

Kasper Katzmann wrote:

> Jeg skal lave en dropdown liste der skal vise alle sider i databasen
> (MSSQL). Det er jo intet problem, men jeg skal have dem sorteret således at
> man kan se hvilke sider der hører til hvor i forhold til hinanden. Altså en
> heirakisk opdelt liste. Jeg tror det må være en såkaldt rekursiv funktion
> jeg skal have fat i, men jeg kan bare ikke lige gennemskue hvordan jeg gør.
>

[snip hirakisk data]

>
> PK_ParentID er så referencen til den overliggende side og 0 refererer til
> Root-level
> Al hjælp er mere end velkommen
>

Relations databaser har det ikke performance mæssigt så godt med rekursive kald og hirakiske
strukture. Det er meget hurtigere og lettere at benytte sig af XML.

Men du kan stadig godt have data for strukturen i relations databasen, du skal så blot cache
strukturen som XML.
Hver gang du laver en ændring i tabellen med strukturen skal du så bare også kalde en
ASP-funktion der opbygger XML'en.

XML'en kan du ligge i en applications variabel, det er lynhurtigt at hente og smide gennem et
stylesheet.
På den måde kan du få din hirakiske struktur vist på alle mulige måder, f.eks. sitemap, menu,
dropdown-boks o.s.v.

Hvordan du så får et Recordset lavet om til en XML-dokument ?
Ja, jeg ser følgende 2 muligheder:

Du kan vælge at benytte rs.getRows() som ligger et recordset direkte over i et array. Array'et
kan du så løbe igennem og genere et XML-dokumet

.... eller du kan benytte rs.save XMLdom, adPersistXML på et ADO-connection som opbygger
recordset'et som en flad XML-struktur (d.v.s ikke hirakisk)

Jeg vil nok anbefale at benytte rs.save, og køre XML igennem en transformation, så resultatet
bliver en hirakisk XML-struktur.

Held og lykke

Hintzmann c",)


Kasper Katzmann (14-11-2003)
Kommentar
Fra : Kasper Katzmann


Dato : 14-11-03 12:52


Kasper Katzmann skrev:
> Jeg skal lave en dropdown liste der skal vise alle sider i databasen
> (MSSQL). Det er jo intet problem, men jeg skal have dem sorteret
> således at man kan se hvilke sider der hører til hvor i forhold til
> hinanden. Altså en heirakisk opdelt liste. Jeg tror det må være en
> såkaldt rekursiv funktion jeg skal have fat i, men jeg kan bare ikke
> lige gennemskue hvordan jeg gør.
>
> Er der nogen der kan hjællpe med den her?

Jeg fandt det her på MSDN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/acdata/ac_8_qd_14_5yk3.asp

Jeg har omskevet den lidt, så den ser sådan ud:
CREATE PROCEDURE expand (@current char(20)) AS
SET NOCOUNT ON
DECLARE @lvl int, @line char(20)
CREATE TABLE #stack (item char(20), lvl int)
INSERT INTO #stack VALUES (@current, 1)
SELECT @lvl = 1
WHILE @lvl > 0
BEGIN
IF EXISTS (SELECT * FROM #stack WHERE lvl = @lvl)
BEGIN
SELECT @current = item
FROM #stack
WHERE lvl = @lvl
SELECT @line = space(@lvl - 1) + @current
PRINT @line
DELETE FROM #stack
WHERE lvl = @lvl
AND item = @current
INSERT #stack
SELECT PK_PageID, @lvl + 1
FROM PageContent
WHERE ParentID = @current
IF @@ROWCOUNT > 0
SELECT @lvl = @lvl + 1
END
ELSE
SELECT @lvl = @lvl - 1
END -- WHILE

Jeg fyrer den så af med:
EXEC expand ''

Resultat:
21
14
12
4
6
9
8
11
10

5
1
22
20
13
3
2

Det er som sådan rigtigt, hierakiet holder.
Nu er spørgsmålet så bare, hvordan får jeg lavet et output i ASP, der viser
feltet [Title] fra tabellen [PageContent] istedet for feltet [PK_PageID].

Nogen der kan hjælpe?

--
Mvh
Kasper Katzmann
Katzmann Consulting
http://www.katzmann.dk



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408527
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste