/ 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
liste emner og underemner fra database
Fra : Bjarne Jensen


Dato : 13-01-03 18:56

Hej
Fra en Access-database vil jeg gerne opliste en række emner fordelt under
nogle hovedemner.
Jeg har forgæves forsøgt forskelligt med GROUP BY, men måske skal jeg gøre
det via to løkker - den ene inden i den anden. Men det driller også.
[Emner] er knyttet til [hovedemner] via feltet [hovedemne_id] og dataene
hentes fra en forespørgsel i Access.
Kan nogen hjælpe med en sådan dobbelt løkke - evt. et eksempel fra en anden
sammenhæng?
Mvh Bjarne



 
 
Jakob Andersen (13-01-2003)
Kommentar
Fra : Jakob Andersen


Dato : 13-01-03 20:04

"Bjarne Jensen" <bjj@dr.dk> wrote
> Fra en Access-database vil jeg gerne opliste en række emner fordelt under
> nogle hovedemner.

Jeg går udfra at det du ønsker er en slags træstruktur, har jeg ret?

Altså f.eks.

hovedemne1
- emne1
hovedemne2
- emne1
- emne2
- emne3
hovedemne3
- emne1
- emne2



Hvis det er tilfældet kunne jeg forestille mig to metoder:

1. To løkker eller evt. en rekursiv funktion
2. Ét sorteret udtræk der blot løbes igenne og tager højde for indrykning

Den mest optimale vil være nr. 2, men den kan godt blive lidt indviklet. Så
lad os starte med løsning 1:

Jeg forestiller mig at du har en tabel kaldet emner, hvor du har følgende
kolonner:

emneid
navn
hovedemneid (refererer til et emneid i samme tabel er NULL hvis posten er
et hovedemne)

For at gøre det lidt mere overskueligt laver vi to funktioner, en til at
hente hovedemner og en til at hente emner under et specielt hovedemne:

Funcion Hovedemner
'Lav connectionobjekt med navnet objConn
Dim objRS
Set objRS = objConn.Execute( "SELECT emneid, navn FROM emner WHERE
hovedemneid = NULL" )
Do while Not objRS.EOF
Response.Write( objRS( "navn" ) & "<br />" )
Underemner( objRS( "emneid" ) )
objRS.Movenext
Loop
'Ryd op
End Function

Function Underemner( hovedemneid )
'Lav connectionobjekt med navnet objConn
Set objRS = objConn.Execute( "SELECT emneid, navn FROM emner WHERE
hovedemneid = " & hovedemneid )
Do while Not objRS.EOF
Response.Write( "----" & objRS( "navn" ) & "<br />" )
objRS.Movenext
Loop
'Ryd op
End Function

Hvis du så blot kalder Hovedemner der hvor du vil have din menu, så skulle
det virke. Ovenstående kan selvfølgelig laves dynamisk til flere niveauer
hvis underemner funktionen tilføjes en linie så den kalder sig selv.

Men som du kan se sviner ovenstående metode noget med connections og
recordsets, hvis vi laver en lille ændring i tabellen kan vi ændre på dette,
lad os istedet for referencefeltet til et hovedemne sørge for at
vedligeholde en streng med tal der fortæller hvor i træet emnet befinder
f.eks.: hvis vi er i starten af den første "gren" i trået skriver vi 1 hvis
vi er i et underemne til denne skriver vi 11 og vores anden tråd hedder 2 og
punkter herunder hedder 21, det er vigtigt at feltet er et tekstfelt eller
vil sorteringen fejle. På denne måde kan du blot lave et udtræk hvor i du
sorterer efter "indexfeltet" og herefter printe og lave indryk afhængig af
længden af strengen i indexfeltet.

Sig til hvis du vil have et lille eksemple på løsning 2 da det er lidt svært
at forklare.

--
Jakob Andersen



Jens Gyldenkærne Cla~ (13-01-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 13-01-03 23:08

Jakob Andersen skrev:

> Jeg går udfra at det du ønsker er en slags træstruktur, har
> jeg ret?

Som jeg læser spørgsmålet er der kun to niveauer - præcis som din
eksempelopstilling herunder.


> hovedemne1
> - emne1
> hovedemne2
> - emne1
> - emne2
[snip]


> 2. Ét sorteret udtræk der blot løbes igenne og tager højde for
> indrykning
>
> Den mest optimale vil være nr. 2, men den kan godt blive lidt
> indviklet.

Hvis den skal fungere som en ægte træstruktur med mange niveauer er
den nok lidt indviklet. Men en simpel udgave der blot arbejder i to
niveauer er nem at lave.

Jeg antager at der er en tabel til hovedemner og en tabel til
underemner. Et select (inner join) på de to tabeller kunne fx give
følgende uddata:

hovedID | underID | hovedemne | underemne
1 1 Biler Ny kassevogn fra Ford
1 4 Biler Test af Volvo V70
1 5 Biler Bilstereotest
2 7 Både Flying vinbjergsnegl fra Team K
3 12 Huse Nyt køkken for 25.000
3 15 Huse Designerbolig i hvidt


Postsættet skal sorteres så alle underemner inden for samme
hovedemner står sammen - fx som ovenfor sorteret efter hovedID,
underID.

For ikke at gentage hovedoverskrifterne i udskriften skal man blot
gemme den sidst udskrevne værdi for hovedoverskriften.

Eksempel:

Dim oldHovedID
oldHovedID = 0    ' Hvis hovedID er et autonummer vil 0 ikke    
               ' forekomme

Do While Not rs.EOF
   If rs("hovedID") <> oldHovedID Then
       ' Udskriv overskriften
       Response.write rs("hovedemne")

       ' Udskift værdien i oldHovedID
       oldHovedID = rs("hovedID")
   End If

   ' Udskriv underemnet
   Response.write "- " & rs("underemne")

   ' Fortsæt løkken
   rs.movenext
Loop

Selve formateringen af indrykket kan naturligvis tilpasses.
Ovenstående metode kan godt modificeres til at virke på mere end 2
niveauer - men jo flere niveauer man tager med desto sværere bliver
det at overskue de indlejrede løkker.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Jakob Andersen (14-01-2003)
Kommentar
Fra : Jakob Andersen


Dato : 14-01-03 00:18

"Jens Gyldenkærne Clausen" <jens@gyros.invalid> wrote
> Hvis den skal fungere som en ægte træstruktur med mange niveauer er
> den nok lidt indviklet. Men en simpel udgave der blot arbejder i to
> niveauer er nem at lave.

Ja, selvfølgelig. Jeg har haft hovedet under armen.

--
Jakob Andersen



Bjarne Jensen (14-01-2003)
Kommentar
Fra : Bjarne Jensen


Dato : 14-01-03 00:43


"Jakob Andersen" <jakob@effectus.dk> skrev i en meddelelse
news:avv2im$s65$1@news.cybercity.dk...

> Jeg går udfra at det du ønsker er en slags træstruktur, har jeg ret?
>
> Altså f.eks.
>
> hovedemne1
> - emne1
> hovedemne2
> - emne1
> - emne2
> - emne3
> hovedemne3
> - emne1
> - emne2
>
> Hvis det er tilfældet kunne jeg forestille mig to metoder:
>
> 1. To løkker eller evt. en rekursiv funktion
> 2. Ét sorteret udtræk der blot løbes igenne og tager højde for indrykning
>
> Den mest optimale vil være nr. 2, men den kan godt blive lidt indviklet.

> lad os starte med løsning 1:
>
Jo, du havde ret mht til at det var sådan en træstruktur, jeg ønskede!
Og ydermere har jeg nu fået det til at virke helt tilfredsstillende efter
dine anvisninger for metode 1.
Tusinde tak for det!
Jeg troede egentlig ikke at man kunne have flere recordset i gang på een
gang, men det har man så vidt jeg se med den metode.
Mvh Bjarne Jensen



Jakob Andersen (14-01-2003)
Kommentar
Fra : Jakob Andersen


Dato : 14-01-03 01:30

"Bjarne Jensen" <bjj@dr.dk> wrote
> Jo, du havde ret mht til at det var sådan en træstruktur, jeg ønskede!
> Og ydermere har jeg nu fået det til at virke helt tilfredsstillende efter
> dine anvisninger for metode 1.

Bid lige hage i at det ikke er en særlig pæn måde i og med at der åbnes
mange forbindelser til databsen, brug istedet Jens forslag.

> Jeg troede egentlig ikke at man kunne have flere recordset i gang på een
> gang, men det har man så vidt jeg se med den metode.

I Løsning 1 er Recordsets/Conncetions lokale variabler i funktionerne det er
derfor de kan optræde flere gange.

--
Jakob Andersen




Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408937
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste