Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

[ASP+SQL] Disegnare un albero (es: TREE del DOS)

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Triumph Of Steel, archimede

[ASP+SQL] Disegnare un albero (es: TREE del DOS)

Postdi Ribonix » 20/06/07 21:52

Sto gestendo un forum aziendale senza passare da forum precompilati scritti in php o in altro linguaggio "webbico".

Ho un database chiamato messaggi_forum composti essenzialmente (in questo post sto semplificando ai soli primi 2 campi ovviamente numerici) da:
campo1=messaggio_ID
campo2=messaggio_risposto

Ovviamente in messaggio_ID metto il numero sequenziale del messaggio che ho inserito, messaggio_risposto=zero se è un nuovo messaggio altrimenti riporta il numero del messaggio al quale si è risposto.

E qui viene il bello...

Io voglio "disegnare" nel vero senso della parola l'albero completo di un messaggio ipotetico n. 7 sapendo che la struttura dell'albero di quel messaggio è così composta (questo è il disegno che il mio output dovrebbe creare - un po' come il comando TREE del vecchio DOS):
Codice: Seleziona tutto
[1]
 |
 +-[2]
 |
 +-[3]
 |  |
 |  +-[5]
 |  |  |
 |  |  +-[7]
 |  |     |
 |  |     +-[8]
 |  |
 |  +-[6]
 |
 +-[4]

Il DB è composto quindi da questi valori:
Codice: Seleziona tutto
messaggio_ID Messaggio_risposto
------------ ------------------
1            0
2            1
3            1
4            1
5            3
6            3
7            5
8            7

Premetto che so come arrivare alla radice (cioè arrivare al messaggio n.1) tramite una procedura ricorsiva (leggo nel "figlio" il valore contenuto in Messaggio_risposto e risalgo finche trovo una "madre" con valore di Messaggio_risposto=zero).
La mia difficoltà è riprodurre il disegno con i "+", i "-", e i "|"...

Ovviamente tutto questo lo vorrei fare in ASP+SQL...

Grazie a chi saprà aiutarmi.
Allah Akhbar! Allah Akhbar! Allah Akhbar!
Avatar utente
Ribonix
Utente Senior
 
Post: 346
Iscritto il: 12/02/03 22:41
Località: 3GYPT

Sponsor
 

Postdi archimede » 21/06/07 11:58

Secondo me ti serve una soluzione tipo questa.

Se il tuo db supporta i trigger hai la vita notevolmente semplificata.

Io l'avevo implementata anni fa proprio per un forum, non ricordo se avevo "disegnato" l'albero o se era il CSS che renderizzava adeguatamente i vari nodi.

HTH.

Alessandro
archimede
Moderatore
 
Post: 2755
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi Ribonix » 21/06/07 16:14

Non ho capito a cosa serve ma diciamo che anche l'mdb si avvicina vagamento a ciò che desidero...

Al momento ho ideato una funzione che si autochiama e crea dei nodi
Codice: Seleziona tutto
<%
 function CalcolaMsgDipendenti(lngIDMsg)
  strSqlCalcolo = "SELECT * FROM Forum_Messaggi WHERE messaggio_risposto = " & lngIDMsg
  set rsCalcolo = Server.CreateObject("ADODB.Recordset")
  rsCalcolo.Open strSqlCalcolo, db, 3, 2
  CalcolaMsgDipendenti = CalcolaMsgDipendenti + rsCalcolo.RecordCount
  if rsCalcolo.RecordCount > 0 then
   do
    session("albero")=session("albero") & lngIDMsg & "-" & rsCalcolo("messaggio_ID") & "<br>"
    CalcolaMsgDipendenti = CalcolaMsgDipendenti + CalcolaMsgDipendenti(rsCalcolo("messaggio_ID"))
    rsCalcolo.MoveNext
   loop until rsCalcolo.EOF
  end if
  rsCalcolo.Close
  set rsCalcolo = nothing
 end function
%>

L'output è una tabella che produce questo risultato:
1-2
1-3
3-5
5-7
7-8
3-6
1-4
totale 7 nodi. A questo punto la mia difficoltà è rielaborare questo ouput e disegnare un albero esattamente come quello d'esempio del mio precedente post.
Allah Akhbar! Allah Akhbar! Allah Akhbar!
Avatar utente
Ribonix
Utente Senior
 
Post: 346
Iscritto il: 12/02/03 22:41
Località: 3GYPT

Postdi archimede » 22/06/07 14:04

Ribonix ha scritto:Non ho capito a cosa serve
Forse questo serve a chiarire.

Non è molto complesso, una volta capito il meccanismo; in ogni caso su google puoi trovare molte informazioni utili sull'argomento.

HTH.

Alessandro
archimede
Moderatore
 
Post: 2755
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi Ribonix » 24/06/07 20:17

Diciamo che c'entra vagamente l'argomento. Rimane sempre il fatto che non espone i nodi come lo fa il comando TREE del DOS.
Sto sviluppando una mia soluzione che spero di postare al più presto salvo che non riesca a trovare nel frattempo ulteriori info a riguardo che attualmente sembrano piuttosto inesistenti.
Grazie comunque.
Allah Akhbar! Allah Akhbar! Allah Akhbar!
Avatar utente
Ribonix
Utente Senior
 
Post: 346
Iscritto il: 12/02/03 22:41
Località: 3GYPT

Postdi Ribonix » 25/06/07 16:29

Non sono molto bravo a spiegare ma cercherò di esporre brevemente come ieri ho risolto il problema.
L'algoritmo l'ho già testato parecchio e mi sembra pienamente funzionante.
Codice: Seleziona tutto
1     [1]           1
                    |
1-2   [1 2]         +--2
                    |
1-3   [1 3]         +--3
                    |  |
3-5    1[3 5]       |  +--5
                    |  |  |
5-7    1 3[5 7]     |  |  +--7
                    |  |     |
7-8    1 3 5[7 8]   |  |     +--8
                    |  |
3-6    1[3 6]       |  +--6
                    |
1-4   [1 4]         +--4
Creo un array dove dove il primo valore corrisponde al primo valore della prima coppia ( 1-2 ). Dal secondo valore in poi inserisco negli array le coppie ( che chiamerò anche nodi ). Il primo valore di ogni nodo ( evidenziato tra parentesi quadre ) va incolonnato con l'unico valore corrispondente nella precedente. Le colonne vuote di sinistra vanno sostituite con i valori corrispondenti alla riga precedente stessa colonna ( vedi ad esempio la quarta riga nodo 3-5 ).
In questo modo ho ottenuto il primo abbozzo di albero dove i nodi sono sempre gli ultimi 2 valori a destra di ogni riga ( evidenziati tra parentesi quadre ). Ora bisogna solo leggere partendo dall'ultima riga alla prima e disegnare graficamente l'albero delle risposte.
Gli ultimi due caratteri a destra di una riga si disegnano sempre come '+--secondo_numero_della_coppia'. Per quanto riguarda il resto della riga invece là dove nella riga sottostante e nella medesima colonna c'è lo stesso valore si inserisce il carattere "|" di congiunzione ( 1-2, 1-3 e 1-4 ) altrimenti al suo posto ci sarà sempre un carattere spazio ( vedere zona tra 3-6 e 7-8 ).
Allah Akhbar! Allah Akhbar! Allah Akhbar!
Avatar utente
Ribonix
Utente Senior
 
Post: 346
Iscritto il: 12/02/03 22:41
Località: 3GYPT


Torna a Programmazione


Topic correlati a "[ASP+SQL] Disegnare un albero (es: TREE del DOS)":

albero di natale desktop
Autore: aliante
Forum: Discussioni
Risposte: 2

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti