Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    339

    Ciclare un albero di dati.

    Ciao a tutti, spero che qualcuno di vuoi mi posso dare una mano.

    Allora vediamo di capirici io

    IDPadre e IDFiglio




    quello che devo fare io è:

    Ricavarmi IDPadre, e cercare se questo esiste nella Colonna IDFiglio
    se questo esiste vuol dire che ho dei figli.

    Però a sua volta devo vedere se i figli hanno a figli.
    Per cui faccio la stessa procedura di sopra, però cambiando IDPadre con quello del Figlio trovato.

    In pratica devo ricavarmi tutti i figli che stanno sotto al IDPadre. iniziale


    un albero di esempio sarebbe cosi

    P
    / \
    F F
    / \
    F F
    / \
    F F

    quello che devo fare è sapere tutti gli di che stanno sotto al Padre.
    sto pensado che ciclci fare..ma nn ne esco fuori perchè ogni padre può avere n figli e i figli avere a loro volta n figli.
    Ci sono 10 categorie di persone al mondo: quelle che capiscono
    il sistema binario e quelle che non lo capiscono.

  2. #2
    Potresti utilizzare una funzione ricorsiva.

    La tua situazione se ho capito bene è questa?

    IDFiglio | IDPadre |
    1
    2 1
    3 2
    4 1
    5 2

    In questo caso ti cerchi tutti gli ID che non hanno padri, sai quindi che quelli sono i primi dell'albero.
    Poi ciclando gli id trovi per ciascuno i propri figli.

    1* query : "Select * from tabella where IDPadre is null"

    2* query : "Select * from tabella where IDPadre = IdFiglio"
    ...NO ONE IS INNOCENT ANYMORE...

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    339
    Non è detto che il padre sia il primo.
    Nel senso che io devo partire da un padre che magari a sua volta a un altro padre.

    Io prendo un padre..che sta nel albero e devo ricavarmi tutto ciò che sta sotto di lui

    Figli nipoti ecc..
    Ci sono 10 categorie di persone al mondo: quelle che capiscono
    il sistema binario e quelle che non lo capiscono.

  4. #4
    ok, ci sono! ma come fai ad iniziare l'albero? necessariamente il primo sarà quello senza nessun padre penso...
    ...NO ONE IS INNOCENT ANYMORE...

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    339
    si c'è ne uno , però io nn devo partire da quello ma da un determinato IDPadre, che è dinamico. e che nn sta sopra.
    Ci sono 10 categorie di persone al mondo: quelle che capiscono
    il sistema binario e quelle che non lo capiscono.

  6. #6
    ok allora puoi fare una cosa del genere :

    codice:
    public int function CercaPadre(int ID)
    {
        // cerco l'eventuale padre del mio ID passato alla funzione
        SQL = "Select * from tabella where IDFiglio = " + ID.ToString() + " AND WHERE IDPadre not is null";
        // operazioni per leggere il DB
        // se il datareader ha dei risultati, ovvero il mio ID selezionato ha un padre, richiamo nuovamente la funzione CercaPadre col nuovo ID, altrimenti esco dalla funzione.
        if (dr.read())
        {
            int IdPadre = dr["IDPadre"];
        }else{
            return ID;
        }
        // chiudo il datareader
        // richiamo nuovamente la funzione CercaPadre
        CercaPadre(IdPadre);
    }
    
    //  chiamo la funzione CercaPadre per il mio ID in questione
        int PrimoIDPadre = CercaPadre(ID);
    A questo punto PrimoIDPadre sarà il primo padre che hai, potrai così cercarti tutti i figli, tra i quali sarà presente anche quello da cui tu sei partito.
    Spero di essere stato chiaro nella spiegazione, se hai bisogno chiedi pure.
    Ciao!
    ...NO ONE IS INNOCENT ANYMORE...

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    339
    ho delle domande.

    1.Come faccio a sapere che sono arrivato alla foglia finale?

    2. ma questo ciclo non è che mi trova solo i figli del Primo padre?
    Ci sono 10 categorie di persone al mondo: quelle che capiscono
    il sistema binario e quelle che non lo capiscono.

  8. #8
    2. ma questo ciclo non è che mi trova solo i figli del Primo padre?
    Quella funzione, chiamata in maniera ricorsiva ti permette di trovare il Padre Principale partendo dal tuo ID che come mi hai detto è dato.

    1.Come faccio a sapere che sono arrivato alla foglia finale?
    La funzione, in presenza di padri, viene richiamata nuovamente e gli viene dato in pasto il nuovo padre che hai trovato, altrimenti vedi che ritorna l'ID che è specificato come argomento della funzione stessa?
    Mettiamo che tu abbia dieci padri del tuo ID, la funzione viene richiamata 10 volte mediante la ricorsione, all'ultimo padre effettua il "Return ID".


    A questo punto, capito qual'è il primo dell'albero, ti puoi cercare i figli in maniera inversa a come abbiamo cercato il padre.
    ...NO ONE IS INNOCENT ANYMORE...

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    339
    aspetta, però io nn devo andare in su.
    Devo andare in già dal mio IDPadre dato.

    diventa troppo elaboriosa partire dal basso.
    Ci sono 10 categorie di persone al mondo: quelle che capiscono
    il sistema binario e quelle che non lo capiscono.

  10. #10
    ok ora ho capito

    Allora prendi il tuo ID e fai la cosa inversa a quanto sopra.

    codice:
    public string AlberoFigli = "";
    
    public void CercaFigli(int ID)
    {
        AlberoFigli = ID.ToString();
        // cerco l'eventuale Figlio del mio ID passato alla funzione
        SQL = "Select * from tabella where IDPadre = " + ID.ToString();
        // operazioni per leggere il DB
        // se il datareader ha dei risultati, ovvero il mio ID selezionato ha un figlio, richiamo nuovamente la funzione CercaFiglio col nuovo ID, altrimenti esco dalla funzione.
        if (dr.read())
        {
            // Concateno il figlio trovato
            AlberoFigli += ", " + dr["IDFiglio"].ToString();
            // vedo se ha a sua volta dei figli.
            CercaFigli(int.Parse(dr["IDFiglio"].ToString()));
        }
    }
    USCITO DALLA FUNZIONE AVRAI LA TUA VARIABILE AlberoFigli = "1, 4, 7, 8, 10".
    ...NO ONE IS INNOCENT ANYMORE...

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 © 2025 vBulletin Solutions, Inc. All rights reserved.