Avatar billede jensen363 Forsker
14. september 2007 - 21:59 Der er 8 kommentarer og
1 løsning

Generér navigerbart hierarki

Fra en tekstfil har jeg udtrukket et hierarki, som ikke umiddelbart er navigérbart .... eller er det ??

Hierarkiet der således ud :

(1)
(1.1)
(1.1.1)
(1.1.2)
(1.2)
(1.2.1)
(1.2.2)
o.s.v... ( ialt ca. 15.000 linier )

Denne struktur skulle gerne kunne anvendes til at navigere rundt imellem en lang række data, således at jeg ved hjælp af dropdown bokse kan udvælge en hierarki-knude, og efterfølgende kun vælge blandt de underlagte emner/hierarkiknuder.

Min egen umiddelbare løsning var at oprette en række ekstra kolonner, og her kronologisk opgøre hvilke linier der hører til hvilket sted i hierarkiet, dvs :

H1  H2  OPRINDELIGT
1        (1)
1  1.1  (1.1)
1  1.1  (1.1.1)
1  1.1  (1.1.2)
1  1.1  (1.2)
1  1.2  (1.2.1)
1  1.2  (1.2.2)

Det vil bare tege nogen tid med 15.000 poster, med mindre der er en metode til at gøre dette automatisk ...

Det skal bemærkes, at der er 4 niveauer i hierarkier, dvs. laveste niveau er : (1.1.1.1) og det er her alle data allokeres til/fremsøges fra ...

How to do ???
Avatar billede terry Ekspert
15. september 2007 - 10:08 #1
Havent looked too closely at this but isnt it possible to make a select using the current node to find the ones directly under

for example lets say you are on node 1.1 an dyou want those directly under.

SELECT * FROM YouTable WHERE Left(SomeField, Len(CurrentNodeGoesHere)) =  CurrentNodeGoesHere
Avatar billede terry Ekspert
15. september 2007 - 10:14 #2
Thats obviously not going to work, it will also return some at lower levels :o(
Avatar billede terry Ekspert
15. september 2007 - 10:16 #3
But you could alos make a function which you could us to find the level, or even have it in the record.

To find the level in a function you need to to 1 to the number of . there are in the string
Avatar billede terry Ekspert
15. september 2007 - 11:15 #4
this function returns a node level, for exampel "1" would return 1

and "1.1" = 2

So from this table example

ID    Node
1    1
2    1.1
3    1.2
4    1.3
5    1.1.1
6    1.1.2
7    1.2.1
8    1.2.2
9    1.2.3

this SQL
SELECT tblNodes.ID, tblNodes.Node
FROM tblNodes
WHERE (((NodeLevel([Node])-1)=NodeLevel("1.2")) AND ((Left([Node],Len("1.2")))="1.2"));

returns

ID    Node
7    1.2.1
8    1.2.2
9    1.2.3
Avatar billede terry Ekspert
15. september 2007 - 12:35 #5
This function =

Function NodeLevel(node As String) As Integer
Dim i As Integer

NodeLevel = 1

For i = 1 To Len(node)
   
   
    If Mid(node, i, 1) = "." Then
        NodeLevel = NodeLevel + 1
    End If
   
Next i

End Function
Avatar billede terry Ekspert
26. september 2007 - 08:43 #6
Are we back off our holidays Lasse?
Avatar billede jensen363 Forsker
26. september 2007 - 08:57 #7
Hi Terry :-)

Sorry, but I haven´t had the time to look ( new job ) at your proposal :-( ... but I am sure that it works perfectly ...
Avatar billede terry Ekspert
26. september 2007 - 09:01 #8
" ... at your proposal :-( "?
Avatar billede jensen363 Forsker
26. september 2007 - 09:19 #9
Meaning ... the application that I am working on has been put aside for later user
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