Avatar billede pezzo Nybegynder
16. august 2003 - 10:31 Der er 15 kommentarer og
1 løsning

Uendelige grupper

Hey!

Jeg sidder og er ved at prøve lave så man kan oprette uelende undergrupper af en undergruppe - osv >

Ex:

Mobil
> Nokia
> > U/ Abon
> > M/ Abon
> > > SONOFON
> > > TDC
> Ericsson

Hardware
> Monitor
> > TFT
> > CTR


Hvordan laver man nemmeste det via en Microsoft Access database ??
Avatar billede eagleeye Praktikant
16. august 2003 - 10:53 #1
Du kunne lave en tabel for hver menu, hovedmenu, submenu1, submenu2, submenu3

hovedmenu
ID  navn
1    Mobil
2    Hardware

submenu1
ID1 IDh navn1
1  1  Nokia
2  1  Ericson
3  2  Monitor

submenu2
ID2 ID1 navn2
1  1  U/Abon
2  1  M/Abon
3  3  TFT
3  3  CTR

submenu3
ID3 ID2 navn3
1  2  SONOFON
2  2  TDC



Så kan du lave hele menuen i en SQL ved at JOINe alle tabellerne sammen.:

SQL = "SELECT hovedmenu.navn, submenu1.navn1, submenu2.navn2, submenu3.navn3
FROM hovedmenu LEFT JOIN ((submenu1 LEFT JOIN submenu2 ON submenu1.ID1 = submenu2.ID1) LEFT JOIN submenu3 ON submenu2.ID2 = submenu3.ID2) ON hovedmenu.ID = submenu1.IDh;"
Avatar billede eagleeye Praktikant
16. august 2003 - 10:54 #2
Men det kommer også lidt an på hvad du ønsker det skal kunne??

Skal du fra et givent undermenu kunne gå baglæns og dine ekvis hovedgruppen?
Avatar billede edutasia Nybegynder
16. august 2003 - 11:11 #3
Du kan lave en tabel med felterne id, parentid og name:

id  parentid  name
1      0      Mobil      --> Mobil er et rodelement, dvs. parentid = 0
2      0      Hardware    --> Hardware er også et rodelement
3      1      Nokia      --> Nokias hører under Mobil, dvs. parentid = 1
4      3      U/ Abon    --> U/ Abons hører under Nokia, dvs. parentid = 3
osv.

Parentid er en anden posts id. Hvis en post har parentid = 0 er det et rodelement - og ellers er det altså et element under et andet element.

Så kan du lave en rekursiv procedure, der udskriver alle elementer:

Sub writeElements(pid,level)
  Dim rs, strSql
  strSql = "SELECT * FROM table WHERE parentid=" & pid
  Set rs = Conn.Execute(strSql)
  If Not rs.Eof Then
    Do While Not rs.Eof
      Response.Write "<div style=""margin-left:" & 15 * level & "px"">"
      Response.Write rs("name")
      Response.Write "</div>"
      WriteElements rs("id"), level + 1 'udskriv alle elementer under dette
      rs.MoveNext
    Loop
  End If
  rs.Close
  Set rs = Nothing
End Sub


Kald proceduren sådan her:

<body>
<%
Dim Conn
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sti_til_din_db
writeElements 0,0
Conn.Close
Set Conn = Nothing
%>
</body>
Avatar billede pezzo Nybegynder
16. august 2003 - 11:20 #4
Jaah du kan jo nok se det ikke virker:
http://sys.pezzo.net/test.asp
Avatar billede eagleeye Praktikant
16. august 2003 - 11:23 #5
Hvem var den til??
Avatar billede pezzo Nybegynder
16. august 2003 - 11:24 #6
edutasia > det virker alligevel nu... men jeg ville jo have så man skulle trykke dem frem... er det noget som er svært at gøre ?
Avatar billede edutasia Nybegynder
16. august 2003 - 11:52 #7
Næh, det er skam meget nemmere. Sciptet ovenfor laver et "træ" med alle elementer, men hvis man skal klikke sig igennem, gøres det sådan her:

Sub writeElements(pid)
  Dim rs, strSql
  strSql = "SELECT * FROM table WHERE parentid=" & pid
  Set rs = Conn.Execute(strSql)
  If Not rs.Eof Then
    Do While Not rs.Eof
      Response.Write "<a href=""denne_sides_navn.asp?showsub=" & rs("id") & """>"
      Response.Write rs("name") & "</a><br>"
      rs.MoveNext
    Loop
  End If
  rs.Close
  Set rs = Nothing
End Sub


Kald proceduren sådan her:

<body>
<%
Dim Conn, intSub
If IsEmpty(Request("showsub")) Then
  intSub = 0
Else
  intSub = Request("showsub")
End If
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sti_til_din_db
writeElements intSub
Conn.Close
Set Conn = Nothing
%>
</body>
Avatar billede pezzo Nybegynder
16. august 2003 - 12:04 #8
edutasia> Altså det var tæt på, men det jeg ville have vare man som standard ser alle 0 grupper.

Når man så trykker på dem kommer næste undergrupper, og trykker man så en af dem kommer dens undergrupper osv osv osv... så man hele tiden kan se hvor man er henne af i grupperne.

Altså et tælletræ eller hvad man kalder det ? :)

Kan du lave det i stedet for ?
Avatar billede edutasia Nybegynder
16. august 2003 - 12:38 #9
Ja, det vil jeg da tro. Men det kommer lige til at tage lidt tid, for jeg bliver nødt til at lave en db, jeg kan teste med...
Avatar billede pezzo Nybegynder
16. august 2003 - 12:43 #10
edutasia > altså jeg kan da godt sende din en MS DB hvis deter ?
Avatar billede edutasia Nybegynder
16. august 2003 - 13:13 #11
Så ikke lige din kommentar - men skidt, det tog heller ikke så lang tid. Her er et komplet eksempel. Det eneste, du skal ændre, er de to konstanter STR_DB og STR_TB, som er hhv. navnet på databasen og navnet på tabellen.

Håber, det er noget i denne dur, du efterspørger:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%
Const STR_DB = "db.mdb"
Const STR_TB = "tbElements"

Sub writeElements(pid,level)
  Dim rs, rs2, intCount, strSql, boolHasChildren
  strSql = "SELECT * FROM " & STR_TB & " WHERE parentid=" & pid
  Set rs = Conn.Execute(strSql)
  If Not rs.Eof Then
    Do While Not rs.Eof
        boolHasChildren = False
        strSql = "SELECT Count(*) AS intCount FROM " & STR_TB & " WHERE parentId=" & rs("id")
        Set rs2 = Conn.Execute(strSql)
        If rs2("intCount") > 0 Then boolHasChildren = True
        rs2.Close
        Set rs2 = Nothing
        If boolHasChildren Then
          Response.Write "<a href=""#"" onclick=""toggleNode(" & rs("id") & ")"">" & rs("name") & "</a><br>"
          Response.Write "<div id=""cont" & rs("id") & """ style=""margin-left:" & 15 * (level+1) & "px; display:none"">"
          WriteElements rs("id"), level + 1 'udskriv alle elementer under dette
          Response.Write "</div>"
        Else
          Response.Write rs("name") & "<br>"
        End If
      rs.MoveNext
    Loop
  End If
  rs.Close
  Set rs = Nothing
End Sub
%>
<HTML>
<HEAD>
<TITLE>Tælletræ</TITLE>
<SCRIPT LANGUAGE="JavaScript">
function toggleNode(intNd) {
    var srcElm = event.srcElement;
    var coll = document.getElementsByTagName('a');
    for (var i=0; i<coll.length;i++) {
        if (coll[i] == srcElm) srcElm.style.fontWeight = 'bold';
        else coll[i].style.fontWeight = 'normal';
        }
    var elm = document.getElementById('cont' + intNd);
    elm.style.display = (elm.style.display == 'none') ? 'block' : 'none';
}
</SCRIPT>
</HEAD>
<BODY>
<%
Dim Conn
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(".") & "\" & STR_DB
writeElements 0,0
Conn.Close
Set Conn = Nothing
%>
</HTML>
Avatar billede edutasia Nybegynder
16. august 2003 - 13:32 #12
Og så en forklaring:

Eksemplet indlæser alle elementer på siden, men alle andre end rodelementerne lægges i skjulte <div>'er, så de ikke umiddelbart kan ses.

Hvis et element har underelementer, vises det som et link, der ved klik kalder JavaScript-funktionen toggleNode(). Denne gør følgende:

1. Viser (eller skjuler) <div>'en med underelementer.
2. Formaterer det valgte element med <b>fed</b> skrift.

Hvis et element ikke har underelementer, skrives det bare ud som normal tekst.

NB: Virker pt. kun i MSIE, men skulle relativt nemt kunne skrives om til at være helt generel (brugen af event.srcElement i toggleNode er IE-specifik)
Avatar billede pezzo Nybegynder
17. august 2003 - 17:37 #13
jeg vil have en løsning som ikke indeholder javascript, men hvor det sker via ren HTML og ASP styring!
Avatar billede edutasia Nybegynder
17. august 2003 - 19:46 #14
Nu gik dit spørgsmål sådan set på, hvordan man laver uendelige grupper i en MS Access database - og det fik du svar på. Hvad der i øvrigt skal være af funktionalitet i løsningen, før den kan accepteres, bør du fremover sørge for at beskrive allerede i dit spørgsmål - ellers spilder du folks tid :@
Avatar billede pezzo Nybegynder
22. august 2003 - 18:11 #15
Lukker - kunne ikke bruge noget af det.

Og beklager edutasia !
Avatar billede bobbedude Nybegynder
07. juli 2004 - 14:02 #16
edutasia >> Jeg kan godt bruge overstående script, dog men en enkelt rettelse.

Se http://www.eksperten.dk/spm/517707
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
Kurser inden for grundlæggende programmering

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