Newsgroup: it.comp.appl.access
Titolo: Alberi etc.

Ciao a tutti!
Ormai sono andato in tilt!
Qualcuno ha per caso avuto a che fare con un db che simula un albero?
Come č possibile realizzarlo utilizzando appunto un db? Ovvero tabelle?
In sostanza per esempio quello che mi occorre č riuscire a gestire un albero
come se si trattasse di una directory contenente altre directory che a loro
volta ne contengono altre e cosě via...
Se qualcuno puň darmi una mano, lo ringrazio molto!
Ciao
Alex

 wrote in message
93faav$4uk$1...@fe1.cs.interbusiness.it...

Cosa devi memorizzare e a che scopo nei nodi dell'albero?
L'albero deve essere bilanciato? (stesso numero di nodi a sx e a dx)?
deve essere un albero binario? (ogni nodo ha due nodi figli)
devi gestire la rimozione/inserimento di nuovi nodi mantenendo la stuttura
dell'albero sempre bilanciata?
Fammi capire bene cosa ti serve, poi ti dirň quale soluzione ti conviene
adottare
Bobbit

 adottare
Ok, grazie, hai ragione: dunque quello che mi serve è gestire proprio una
simulazione di cartelle... quindi una root e come figli delle
sottocartelle... non deve essere binario, nemmeno bilanciato, insomma almeno
non posso saperlo a priori.
Infine non devo poter cancellare nodi se contengono altri nodi...
Grazie ancora, aspetto notizie e spero di essermi spiegato...
Magari mi andrebbe bene anche un esempio semplice in modo almeno da
cominciare a inserirmi su una strada visto che ormai ne ho provate troppe e
ho perduto bussola e sestante!!


Ma se ti serve solo a livello grafico, usa il controllo treview
Bobbit

Se ti serve una gestione grafica di una struttura ad albero, puoi
usare il controllo treeview.
Se ti serve una gestione per implementare un db gerarchico, il mio
suggerimento è il seguente.
Prendiamo come esempio una tabella destinata a contenere info
"anagrafiche" su corsi d'acqua (lunghezza, coordinate della sorgente,
coordinate della foce/confluenza, tipologia ecc.) che consenta anche
di conoscere il percorso dell'acqua di un corso d'acqua selezionato
fino al mare.
Prima di tutto, trattandosi di una gestione che richiede chiamate
ricorsive di funzioni, è importante stabilire a priori il livello
massimo di ricursione, ovvero "l'altezza" dell'albero.
Nel caso specifico, bisogna stabilire qual è il num. max di tributari
che un fiume può avere.
Posto che ogni record della tabella rappresenta un nodo dell'albero, 
di ciascuno di essi è necessario conoscere il livello a cui si trova
nella gerarchia e un puntatore al tributario.
Quindi su ogni record bisogna prevedere due campi per gestire la
"navigazione" all'interno dell'albero: un campo per contenere il
livello del record  ed uno per contenere il puntatore al tributario.
Quindi per esempio:
Se il corso A si getta in B che a sua volta si getta in C il quale
sfocia in mare, mentre D sfocia in C ed infine E sfocia direttamente
in mare, avremo:
Codice 	Corso	Livello	Cod. tributario
1	A	3	2
2	B	2	3
3	C	1	7
4	D	2	3
5	E	1	7	
7	Mare	0	0
Con questa struttura, per conoscere il percorso dell'acqua a partire
da un record con livello n, è sufficiente selezionare tutti i record
con livello < n e cercare tra loro quello con codice uguale a quello
del tributario del record corrente e ripetere poi ricorsivamente la
ricerca fino a raggiungere il livello 0 o quello intermedio
desiderato.
In maniera simmetrica è possibile "risalire" gli affluenti di un corso
a livello n, selezionando prima di tutto i record di livello > n che
hanno codice tributario uguale a quello del corso selezionato; quindi
per ciascuno di essi, ripetere ricorsivamente la selezione fino a
quando si raggiunge un record senza affluenti o il livello desiderato.
Ovviamente tutto questo è solo uno spunto da adattare alle tue
esigenze specifiche.
HTH
Vincenzo Turturro
---------------------------------------------------------
Se no diventiamo tutti **** dai portatili o peggio ancora 
provetti poeti fiorentini come vturturro.
(Così disse 
ivan....@tiscalinet.it
 Ven 25 Aug 2000 09:34:52 +0200)


No... purtroppo mi serve tutto tranne che il trattamento grafico... ovvero
l'implementazione delle tabelle nel db...

 ha scritto nel messaggio
news:93faav$4uk$1...@fe1.cs.interbusiness.it...

Un modo che io ho testato e sembra funzionare e' il seguente:
attribuire ad ogni oggetto dell'albero un codice che ne identifica la
posizione nell'albero cioe' il suo livello.
Es.
01 pippo
0101 paperino
010101 topolino
0102 minni
0103 pluto
010301 zio paperone
02 tizio
0201 caio
020101 sempronio
Questo codice e molto facile da interrogare.
Se voglio tutti quelli della radice 01 basta fare una select sui primi due
caratteri
Se voglio tutti i figli di un certo codice basta dare un parametro alla
query del tipo
like 0101* e otterrei paperino e topolino
Ciao Pietro