Newsgroup: it.comp.appl.access
Titolo: ricorsione su albero n-ario (difficile)

ricorsione su albero n-ario (difficile)
Uso le notazioni matematiche y = f(x,y, ...) e il linguaggio per
sbrigarmi.
Un record puo' essere "collegato" ad altri n record, e qualcuno di
questi
con altri m e cosi' via all' infinito.
Collegato come ? Cosi' :
ogni record R della tabella T ha la sua kiave K(R), ed ho fatto in
modo che le kiavi siano tutte DIVERSE  anche se di tabelle diverse
e cioe' :
dato il record R1 della tabella T1 e il record R2 della tabella T2,
allora (se K1 = K2) => (R1 = R2) e (T1 = T2).
Esiste poi una tabella C (Collegamenti) che ha C_in e C_out come
campi.
Quando "collego" un R1 di T1 con un R2 di T2 aggiungo un
record a C scrivendo : C_in = k1 ; C_out = K2
Se collego invece R2 di T2 a R1 di T1, allora aggiungo un
record a C scrivendo : C_in = k2 ; C_out = K1.
(la "direzione" ha un senso).
Obiettivo : data una kiave K di un certo record R, individuare
tutti i record collegati a R e i collegati dei collegati, fino alla
fine.
Ho fatto cosi' :
public proc SEGNA(K)
     ' K e' data (la prima volta) dall' esterno
    ' evito di allupparmi su collegamenti circolari
    ' controllando se l' ho gia' segnata :
     if GIA_SEGNATA(K) then exit sub
   ' aggiunge la kiave K in una tabella dei risultati
     AGGIUNGI_KIAVE(K)
     dim R as new adodb.recordset
     R.open  _
        "select * from collegamenti where " _ &
        "kiave = ' " & K & " ' ;",   Connessione
     do while not R.eof
         Kiave = R("C_out").value
         SEGNA (K)  ' qui chiama "se stessa" (diciamo)
         R.movenext
     loop
     SEGNA = true
end function
Salvo errori ed omissioni dovrebbe funzionare.
Che ne pensate ?

> Che ne pensate ?
Il concetto basilare è :
ID_Record
Cmp_Descrizione
ID_Collegamento (che richiama il valore ID_Record a cui fa riferimento)
non ti serve null'altro...
la ricorsione la fai su ID_Collegamento... che sia di una tab. o di un 
altra.
Ovvio che ce ne deve essere una di partenza di Tabella per i nodi di primo 
livello il cui campo ID_Collegamento sarà ovviamente = a ID_Record.
anche se ti dirò, già fare una ricorsione sulla stessa tab. risulta 
dispendioso in termini di tempo, credo che farlo (perchè non l'ho mai fatto 
non essendomi mai servito) su "n" tabelle, sarebbe da svenarsi (figurati se 
i records da sbolognare poi son tanti)...
perchè ti serve sta cosa? 

 perchè ti serve sta cosa?
Perche' gli utenti collegano record con sub - record ...
Gli serve a loro per esplorare le dipendenze di elementi di costo
e c* vari.

 dai, dagli unì altra letta ...  Sii buono
A proposito,
sai per caso quante chiamate regge lo stack di una macchina
windows XP professional ?
Comunque con quel tipo di ricorsione che mi sono inventato,
(hai  visto che "torna" appena finisce di visitare un nodo?
[ che mediamente non ha piu' di 3/4 collegamenti ad altri
nodi ] )  dovrebbe farcela e molto velocemente, pure.
Ma molto molto.
... Sempre salvo errori ed omissioni, si intende. :D

 Che ne pensate ?
Uhmmmm.... provalo su un migliaio di kiavi e poi comunica i tempi di 
risposta e attiva un programma di monitor utilizzo memoria.

 risposta e attiva un programma di monitor utilizzo memoria.
Ok.
Pero' considera che *una* kiave in pratica tra collegamenti e sub
collegamenti
arrivera' al massimo a ... Diciamo ... un 15.
Venti al MASSIMO ma proprio a voler fare i matti ...

 risposta e attiva un programma di monitor utilizzo memoria.
...e io che ho detto? :D 


La stessa cosa. Ma il mio "uhmmmmm......" era dovuto ad un motivo 
diverso da quello che hai indicato. Il problema non e' quante tabelle 
usa o quanti record ci sono sulla tabella/e ma il numero di recordset 
che attiva (numero di open) per fare cio'. Se non ricordo male un po' di 
tempo fa (1/2 anni) anche tu ti eri impelagato nella medesima cosa.
--
ac

 
[cut]
vediamo se ho capito la tua esigenza:
tu hai N tabelle e devi consentire agli utenti di collegare qualsiasi 
record di una qualsiasi di queste tabelle con altri record di altre di 
queste N tabelle senza limiti o vincoli; devi solo registrare il 
collegamento che l'utente ha deciso di creare.
corretto?
-- 
Paolo opg
BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

 corretto?
Perfetto, sei un grande. Correttissimo.
Ma stamattina ho provato la routine (leggermente
diversa da quella che ho scritto qui, era errata)
ed e' un BOMBA.
L' ho messa in un 3D dedicato, come puoi vedere,
nel caso servisse a qualcuno, sai com' e' : se non
ci si aiuta tra di noi ...
Ciao ! E grazie per l' attenzione.

 (1/2 anni) anche tu ti eri impelagato nella medesima cosa.
sine...
per questo consigliavo con cognizione di causa ;)
l'apertura di recordset ricorsivi alla "n" mi incartava decisamente la 
memoria rallentando un pò di tutto... infatti poi, lasciai perdere... non 
era una buona soluzione...