Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Albero genealogico... HELP!

    Ho questo problema: ho una db con una tabella che ha i campi

    -padre
    -codice_padre
    -figlio
    -codice_figlio

    Tutti discendono da un unico avo.

    Ci sono figli che a loro volta sono padri e così via...

    Come faccio a creare un albero genealocico? Non pretendo la struttura grafica ad albero, mi basterebbe una cosa del tipo

    AVO
    --FIGLIO AVO 1
    ----FIGLIO FIGLIO AVO 1
    ----FIGLIO FIGLIO AVO 2
    ------FIGLIO FIGLIO FIGLIO AVO 2
    ----FIGLIO FIGLIO AVO 3
    ------FIGLIO FIGLIO FIGLIO AVO 3
    ------FIGLIO FIGLIO FIGLIO AVO 3
    --FIGLIO AVO 2

    E COSì VIA. Qualcunoi ha qualche suggerimento?

    Grazie
    Giulio Ferri
    giulioferri.it

    Anche un orologio fermo ha ragione due volte al giorno (Giorgio Faletti)

  2. #2
    devi fare una tabella autoreferenziata e usare la ricorsione per creare l'albero. pensaci un po' su e vedrai che non è difficile.
    "0 è tutto finito. 1 è solo l'inizio"
    HO IL CERTIFICATO DI RESISTENZA.

  3. #3

    autoche???

    Come si fa una tabella autoreferenziata?
    Giulio Ferri
    giulioferri.it

    Anche un orologio fermo ha ragione due volte al giorno (Giorgio Faletti)

  4. #4
    forse è meglio la tabella

    -id padre
    -individuo
    -id


  5. #5
    codice:
    id  |  Nome  |  id_figlio (indica di chi è figlio)
    id_figlio è una chiave esterna che si riferisce all'id (quindi alla tabella stessa).

    per recuperare la struttura dell'albero devi farti PER FORZA una FUNZIONE ricorsiva, es.:

    codice:
    ' la funzione recupera (l'argomento è un'id) tutti i figli 
    'di quell'id e a sua volta discendenti dei discendenti, 
    'dato che è ricorsiva (provare per capire)
    
    Function getTree(id)
      rsGetTree.Open("select * from tabella WHERE id_figlio =" & id)
      while NOT rsGetTree.EOF
        getTree(rsGetTree.("id"))
      wend
      rsGetTree.close
    End Function
    
    ' ciclo tutti i capostipiti
    rs.Open("select * from tabella WHERE id_figlio = 0")
      while NOT rs.EOF
        getTree(rs.("id"))
      wend
    rs.Close
    i capistipite, cioè coloro che non sono figli di nessuno (non perchè siano figli di mignotta, ma perchè non è possibile stabilire la discendenza, DEVONO avere id_figlio = 0)

    spero che il codice sia grossomodo giusto, se decidi di provare e hai problemi sono qui.
    "0 è tutto finito. 1 è solo l'inizio"
    HO IL CERTIFICATO DI RESISTENZA.

  6. #6

    Grazie

    La provo subito, grazie 1000
    Giulio Ferri
    giulioferri.it

    Anche un orologio fermo ha ragione due volte al giorno (Giorgio Faletti)

  7. #7
    Girando nel FORUM ho trovato quello che dovrei fare io

    sto provando ad adattare questo codice

    ' la funzione recupera (l'argomento è un'id) tutti i figli
    'di quell'id e a sua volta discendenti dei discendenti,
    'dato che è ricorsiva (provare per capire)

    Function getTree(id)
    rsGetTree.Open("select * from tabella WHERE id_figlio =" & id)
    while NOT rsGetTree.EOF
    getTree(rsGetTree.("id"))
    wend
    rsGetTree.close
    End Function

    ' ciclo tutti i capostipiti
    rs.Open("select * from tabella WHERE id_figlio = 0")
    while NOT rs.EOF
    getTree(rs.("id"))
    wend
    rs.Close


    però mi dice

    Previsto identificatore
    getTree(rsGetTree.("id"))

    cosa devo identificare

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.