Newsgroup: it.comp.lang.visual-basic
Titolo: Aiuto! LUNGOOO

Sto lavorando su un database che NON posso modificare e devo creare un
programma per estrazione di alcuni dati.
Ho una tabella anagrafica e una componenti
Esempio
In "anagrafica" ho i dati di un oggetto i cui componenti sono salvati
nella tabella "componenti"
L'oggetto in questione è identificato da un id univoco e i relativi
componenti sono legati all'oggetto tramite un campo "rifanagrafica"
anagrafica.id
 --> componenti.rifanagrafica
E fin qua tutto ok.
Il problema è che i componenti possono essere formati da altri
componenti che sono salvati anch'essi in anagrafica (per ogni
componente ho un campo con  un riferimento che me lo identifica in
anagrafica) e che possono essere a loro volta formati da altri oggetti
che trovo in componenti e cosi via....
Esempio
ITEM A formato da ITEM B e ITEM C
                   ITEMB formato da ITEM D e ITEM E
                         ITEM E formato da ITEM F
Come risultato da mettere in una listview devo avere
ITEM A
ITEM B
ITEM C
ITEM D
ITEM E
ITEM F
Ho provato con dei loop sul recordset di rara bruttezza e di rara
lentezza e alla fine non sono neanche riuscito ad ottenere il risultato
voluto
Vi prego aiuto!!!!
Sapete darmi qualche dritta??
Grazie a chi vorrà aiutarmi
Peloso

 voluto
Il tuo problema è il classico 'distinta base'.
Lato vb, normalmente lo si risolve con una normale navigazione ad 
albero, che sia in un array o in una collection cambia poco, attraverso 
Function ricorsive (ossia che invocano se stesse passando alcuni 
parametri byref ed altri byval).
Lato Sql, è un filino più complesso.
non ci sono problemi se si impone un numero massimo di livelli, per cui 
basta concatenare insieme N query in una unica StoredProcedure.
Se i livelli possibili sono invece infiniti, lato sql non conosco 
soluzione (se non usando soluzioni non set-based, ad esempio i cursori, 
che poi alla fine diventa come la soluzione in vb).
Presta attenzione al loop infinito se un articolo fosse erroneamente 
composto da se stesso.
Ciao
Alberto
-- 
Ho spiegato a mio nipote cos'è il compromesso: se per le vacanze tua 
madre vuole andare al mare e tuo padre invece in montagna, il 
compromesso è che si va al mare, ma il papà può portarsi gli sci.


Ho risolto con una funzione ricorsiva.
Richiamo al click una funzione passandogli l'id del componente ed il
livello...
tipo private sub distinta(riferimento as long, livello as long)
Senza settare il numero massimo di iterazioni, sperando in DIO!
Molto interessante invece il caso di un articolo composto da se'
stesso...
Tra l'altro ho provato a farlo con il programma che l'azienda utilizza
ora...
E' crashato!!!! EHEHEEHEHEHEHEHEH!!!
Ne terrò conto...
Come sempre i tuoi interventi sono tecnicamente ineccepibili...
Grazie
Peloso

 Ne terrò conto...
Non è complesso. O lo fermi con un numero massimo di iterazioni, oppure 
(più oneroso ma più corretto) ogni volta che un elemento viene 
raggiunto dalla navigazione nell'albero, si risale fino al padre 
supremo lungo il ramo più breve, e l'elemento 'nuovo' non deve 
apparire.
Se appare si segnala l'errore e si termina l'approfondimento.
Ciao
Alberto
-- 
Konrad Adenauer: All'intelligenza Dio ha posto limiti, alla stupidità 
no.

 Se appare si segnala l'errore e si termina l'approfondimento.
Non puoi semplicemente fare una collection con tutti i nodi che incontri e 
se quello che tenti di inserire è già presente allora ti fermi?
Ciao 

Fabio ha spiegato il 10/11/2006 :

Beh, no, perchè non è detto che l'elemento che incontri sia 'sopra' a 
quello che stai per inserire. Potrebbe essere su un altro ramo.
Immagina un bullone. Appare mille volte, in una distinta, come figlio 
di cento cose e come padre di 1 Vite + 1 Dado.
Ma il fatto che in altri cento rami ci sia un bullone non significa che 
ci sia un riferimento circolare.
Oltretutto, un elemento può essere padre diretto di n elementi 
identici. Ad esempio, se un motore contiene 10 bulloni, non è detto che 
lo schema sia:
1 Motore -> 10 Bulloni
Può benissimo essere
1 Motore -> 2 Bulloni
1 Motore -> 6 Bulloni
1 Motore -> 2 Bulloni
perchè per ogni associazione padre figlio possono essere specificate 
mille cose, come istruzioni di montaggio, attrezzo da utilizzare, 
coppia di serraggio del bullone, attesa prima o dopo il montaggio, 
ecc...
Occorre risalire lungo il ramo più breve verso il padre.
Ciao
Alberto
-- 
Karl Marx: Le circostanze fanno l'uomo non meno di quanto l'uomo faccia 
le circostanze.