Newsgroup: it.comp.www.asp
Titolo: Menu Gerarchici...

Salve a tutti,
aiuto mi sono "looppato"!!!
Giorni fa si parlava di menu gerarchici... bene ho un problemino.
Obiettivo: generare un file .js (menu ad albero) prelevando le info da una
tabella access (MenuID, MenuDescrizione, MenuPadre... dove per la root
utilizzo come valore per il Menu Padre "99999")
Problema riscontrato: Il file .js, nelle specifiche, pretende che una volta
terminato un sottomenu, venga inserito un numeretto relativo alla posizione
nel menu, del menu padre(considerando [0] il primo menu).
Premesso che tutto il menu di root (/) viene realizzato da un ciclo "do
while" all'interno di una pagina asp. Tutti gli altri sottomenu vengono
generati richiamando una funzione (SUB) in ciclo. Nel senso che se venisse
trovato un menu in un sottomenu la funzione richiama se stessa dandomi
l'opportunità di generarmi tutto l'albero gerarchico in maniera automatica
ed infinita.
Il problema mi nasce quando devo incrementare questo benedetto numeretto
ogni volta che la sub comincia il ciclo di un nuovo sottomenu. Se usassi le
stesse variabili per passare i valori alla sub stessa mi resetta il valore
precedente (elementare!!! ;-). Avevo pensato ad un array ma sono un po' in
loop con il cervello... help me...thanx!
Nella speranza di essere stato felice nella spiegazione ringrazio chiunque
possa aiutarmi...
loop...
loop...
loop...
;-D
thanx!



Hemmm... non e' estremamente chiaro ma vediamo un attimo se ho
capito...
Tu hai un database con una tabella del tipo 
IDPADRE
IDFIGLIO
DESCRIZIONE
Dove IDFIGLIO puo' fare riferimento ad un IDPADRE in modo da
costruire una gerarchia.
Ora, tu vorresti leggere il database "scendendo" la gerarchia
e "contando" ogni livello ed ogni elemento del livello
(almeno, cosi' ho capito io). Ok, niente di piu' facile...
questo e' un lavoro per una FUNZIONE RICORSIVA
(musica di Mission Impossible)...
La seguente funzione fa' il giochetto:
<html>
<body>
<%
	Dim conn
	Dim rs
	Dim level
 
	level = 0
 
	Sub CiclaCicla( rs )
		Dim counter
		Dim rs1
		Dim indent
 
		counter = 0
		Do While Not rs.EOF
			indent = Left( "-----------------------", level * 3 )
 
			Response.Write indent & counter & " - " & rs.Fields( "padre"
) & "/" & rs.Fields( "figlio" ) & " " & rs.Fields( "descr" ) & "<br>"
			counter = counter + 1
 
			Set rs1 = conn.Execute("SELECT * FROM CICLI WHERE PADRE=" &
rs.Fields("figlio"))
			If Not (rs1.EOF And rs1.BOF) Then
 
				level = level + 1
 
				' ciclo sui figli
				CiclaCicla rs1
 
			End If
			rs1.Close
			Set rs1=Nothing
			' prossimo padre
			rs.MoveNext
 
		Loop
 
		level = level - 1
 
	End Sub
	Set conn = Server.CreateObject("ADODB.Connection")
	conn.Open "Driver={Microsoft ODBC for
Oracle};SERVER=ALPA;UID=DEMO;PWD=DEMO"
 
	Set rs = conn.Execute( "SELECT * FROM CICLI WHERE PADRE=0" )
 
	' inizio il ciclo
	CiclaCicla  rs
 
%>
</body>
</html>
Io ho usato come test un database (Oracle) fatto cosi':
CREATE TABLE CICLI (
	PADRE	NUMBER(5,0)	NOT NULL,
	FIGLIO NUMBER(5,0) NOT NULL,
	DESCR	 VARCHAR(20) NOT NULL,
	CONSTRAINT PK_CICLI PRIMARY KEY (PADRE,FIGLIO)
);
Il processo di lettura legge tutti i "padri", per ogni
"padre" verifica che esistano dei "figli" e se si' li
legge, e via cosi' ricorsivamente finche' non finisce la
tabella.
Il risultato e' questo:
0 - 0/90 prima
---0 - 90/94 1/prima
---1 - 90/95 2/prima
1 - 0/91 seconda
---0 - 91/95 1/seconda
---1 - 91/96 2/seconda
------0 - 96/104 1/2/seconda
------1 - 96/105 2/2/seconda
------2 - 96/106 3/2/seconda
------3 - 96/107 4/2/seconda
---------0 - 107/108 1/4/2/seconda
---------1 - 107/109 2/4/2/seconda
---2 - 91/97 3/seconda
2 - 0/92 terza
---0 - 92/98 1/terza
------0 - 98/110 1/1/terza
------1 - 98/111 2/1/terza
------2 - 98/112 3/1/terza
---1 - 92/99 2/terza
3 - 0/93 quarta
---0 - 93/100 1/quarta
---1 - 93/101 2/quarta
---2 - 93/102 3/quarta
---3 - 93/103 4/quarta
Il Livello di "indentazione" identifica
il sottomenu', i numeri sono progressivi
nel singolo livello.
Se non ho capito spiegati un po' meglio....
Scusate la prolissita'...
Davide