it.comp.lang.visual-basic | Google Gruppi Page 1 of 5 Guida | Entra it.comp.lang.visualbasic Ricerca codice sorgente esempio distinta basein questo gruppo Distinta base Altre opzioni Cerca nei gruppi Discussioni + nuovo post 11 messaggi - Comprimi tutto Informazioni su questo gruppo Valter Vedi profilo Altre opzioni 5 Dic 2000, 09:00 Sperando di fare cosa gradita posto la risposta data su it.comp.software.database su quanto in oggetto, anche perchè quando ne ho avuto bisogno io (solo per curiosità!) non sono riuscito ad evere risposta. Nel caso più semplice basta una tabella. Es. Hai una distinta così composta: A | \ C D / | \ F G | H / B E Scusa l'indentatura ma meglio di così non ci sono riuscito 8-) Comunque a parole la situazione è questa: Prodotto A composta da B, C e D Il prodotto C è a sua volta composto da E, F e G Il prodotto F è a sua volta composto da H La tabella risultante è la seguente: Padre A A A C C C E Figlio B C D E F G H Per leggerla devi usare una funzione ricorsiva, più o meno come la seguente (Es in VB6 +DAO): Crea un form, inserisci un CommanButton, una casella di testo normale e una casella di testo multiline con scrollbar verticale Iscriviti a questo gruppo Questo è un gruppo Usenet ulteriori informazioni Link sponsorizzati Rivista Diritto Minorile Portale giuridico-sociale. Tutela infanzia e adolescenza. www.dirittominorile.it EDI & XML Mapping Tool Visually Map Any Combo EDI & XML EDIFACT Data Integration. Try Free! www.Altova.com/MapForce Corso: SQL e Database Impara ad utilizzare il linguaggio SQL. Assistenza on-line e attestato www.mrwcorsi.it Visualizza qui il tuo messaggio... Pagine correlate Los Angeles, 09:45 LA SPEARS MOLLATA DAL RAGAZZO PER SUE "CATTIVE ... La Repubblica - 2 hours ago Non e' decisamente un momento felice per Britney Spears: dopo la ... STRAGE ERBA: PER ROSA E OLINDO ANCHE LETTERE CONSENSO ANSA - 17 hours ago ERBA - Ricevono lettere, tante lettere, molte anche di approvazione ... AdWords di Google: Tutorial e Guide adwords.google.it Parole Chiave Parole Chiave www.registrazione-sui-motori.com Benedetta Cambiagio Frassinello, biografia (1791-1858) www.vatican.va Dim db As DAO.Database '15 sec 895 item in una tabella di 11100 record Private Sub Form_Load() Set db = OpenDatabase(App.Path & "\Archivio.mdb") End Sub Private Sub Command1_Click() Screen.MousePointer = vbHourglass LeggiDistinta Text1, 1 Screen.MousePointer = vbDefault End Sub Private Sub LeggiDistinta(strPadre As String, Livello As Long) Dim rec As DAO.Recordset Set rec = db.OpenRecordset("SELECT * FROM tblStrutture WHERE Padre='" & strPadre & "'") If rec.EOF Then Exit Sub Do While Not rec.EOF Text2 = Text2 & vbCrLf & String(Livello - 1, ".") & Livello & " " & strPadre & " " & rec!Figlio LeggiDistinta rec!Figlio, Livello + 1 rec.MoveNext Loop End Sub L'esempio è funzionante ma sicuramente da ottimizzare (sopratutto se http://groups.google.it/group/it.comp.lang.visual-basic/browse_thread/thread/6ab4f68... 08/02/2007 it.comp.lang.visual-basic | Google Gruppi Page 2 of 5 l'archivio è grande) e da completare con altri dati es. descrizione, quantità d'uso, inizio e fine validità del legame, % scarto etc. Per SQL Server invece c'è un'esempio di procedura su MSDN, non mi ricordo il link esatto. (Se non sbaglio usa una tabella temporanea anzichè una ricorsione). Scusa la lungaggine, (la sintesi non è il mio forte), se hai bisogno di altri chiarimenti posta qui o preferibilmente su it.comp.lang.visual-basic dove giro questo trhead (Eventualmente se a qualquno può interessare si può completare l'esempio implementando un rudimentale MRP) Ciao VB "grenzo" <[email protected]> ha scritto nel messaggio news:[email protected]... - Mostra testo tra virgolette - Rispondi all'autore Inoltra Valter Vedi profilo Altre opzioni 8 Dic 2000, 19:19 Come detto ti rispondo sul newsgroup: > Dim db As DAO.Database > Private Sub Form_Load() > Set db = OpenDatabase(App.Path & "\Archivio.mdb") > End Sub Questa routine apre il Database, ricordati di fare riferimento alla libreria Microsoft DAO 3.51 Object library dal menu Progetto->Riferimenti se no non funge > Private Sub Command1_Click() > Screen.MousePointer = vbHourglass > LeggiDistinta Text1, 1 > Screen.MousePointer = vbDefault > End Sub Qui imposto il puntatore a forma di clessidra poi richiamo la sub LeggiDistinta, passandogli come primo parametro il padre, leggendolo dalla casella di testo, e come secondo parametro il livello (essendo il punto di partenza il livello è pari a 1) > Private Sub LeggiDistinta(strPadre As String, Livello As Long) > Dim rec As DAO.Recordset > Set rec = db.OpenRecordset("SELECT * FROM tblStrutture WHERE Padre='" & strPadre & "'") Estraggo tutti i record che hanno padre =strPadre passato come parametro alla routine e li assegno a un recordset > If rec.EOF Then Exit Sub Se il recordset è vuoto, significa che non ha figli, quindi esco dalla procedura, altrimenti continuo ed eseguo un ciclo per controllare se ogni figlio della struttura ha a sua volta altri figli. > Do While Not rec.EOF > Text2 = Text2 & vbCrLf & String(Livello - 1, ".") & Livello & " " & > strPadre & " " & rec!Figlio Qui scrivo nella seconda casella di testo il livello della struttura (passato come parametro alla sub), con un minimo di indentatura, e il figlio > LeggiDistinta rec!Figlio, Livello + 1 Qui richiamo la sub (ecco la ricorsione) passando come parametro il figlio e il livello aumentato di uno in quanto scendo di un livello > rec.MoveNext Qui passo al prossimo record > Loop http://groups.google.it/group/it.comp.lang.visual-basic/browse_thread/thread/6ab4f68... 08/02/2007 it.comp.lang.visual-basic | Google Gruppi Page 3 of 5 > End Sub Qui si conclude la procedura, se hai altri dubbi posta sul news e ti sarà risposto, almeno spero 8-) Ciao VB - Mostra testo tra virgolette - Rispondi all'autore Inoltra Hal1961 8 Dic 2000, 23:03 grenzo 9 Dic 2000, 16:32 Valter Vedi profilo Altre opzioni 9 Dic 2000, 23:34 <CUT> - Mostra testo tra virgolette Nel nostro esempio A ha tre figli, quindi quando apro il recordset con parametro A, ottengo tre record (non esistono e non devono esistere record con figlio=NULL): Padre A A A Figlio B C D B invece non ha figli, Quindi quando apro il Recordset con parametro B ottengo un recordset vuoto, cioè senza record. Forse per rendere più chiare le cose conviene provare a seguire passo passo la procedura. Leggiamo la distinta di A: Io passo A e 1 alla routine La routine estrae tutti i record che hanno Padre=A, nel nostro caso otteniamo: Padre A A A Figlio B C D non essendo un recordset vuoto continuo leggendo riga per riga Prima riga:scrivo nella casella di testo .1 (che rappresenta il livello) e B poi richiamo la stessa procedura passandogli come parametri B e 1+1 per controllare ed eventualmente scrivere la distinta di B, qui estraggo tutti i record che hanno come padre B, il recordset risultante è vuoto (non esistono record con padre=B, quindi esco dalla routine e ritorno alla routine chiamata precedentemente e passo al secondo record (A C), richiamo la routine e otttengo un recordset con 3 Record: Padre C C C Figlio E F G Anche qui esamino record per record Scrivo nella casella di testo ..2 (a questo punto la variabile Livello vale 2) e E , richiamo la procedura Passandogli come parametro E e 2+1 etc..... Quando ho finito di esaminare il record A C ho finito di esaminare (si dice esplodere) la struttura. ps. In effetti si può usare SELECT Figlio al posto di SELECT * (è più corretto e meno impegnativo per il sistema) Ciao VB http://groups.google.it/group/it.comp.lang.visual-basic/browse_thread/thread/6ab4f68... 08/02/2007 it.comp.lang.visual-basic | Google Gruppi Rispondi all'autore Page 4 of 5 Inoltra grenzo Vedi profilo Altre opzioni 10 Dic 2000, 22:12 ..... > poi richiamo la stessa procedura passandogli come parametri B e 1+1 per con l'istruzione: LeggiDistinta rec!Figlio, Livello + 1 ? Ok, ho capito, quindi con il programma ottengo un bel mucchietto di record che compongono i vari livelli della distinta suddivisi per livello, giusto?? da quanto ho capito dal tuo esempio esiste l'articolo A che ha 3 figli B,C,D e poi tu analizzi 3 record che hanno come codice padre A. Ma questi record non possono stare nella tabella articoli ( li' c'e solo 1 record A ) ma in una tabella relazionata dove ad ogni figlio dell' articolo A corrisponde un record con il codice_padre (che e' A)(Foreign Key?) ed il codice_figlio ( che e' diverso per ogni figlio ), giusto? ---ciao, grenzo Rispondi all'autore Inoltra Valter Vedi profilo Altre opzioni 11 Dic 2000, 23:29 Tutta la struttura sta in un'unica tabella come inserito all'inizio, la ripropongo per chiarezza: Padre A A A C C C E Figlio B C D E F G H Come vedi ci sono 3 record con padre A, tu prima estrai questi 3 ,poi controllandoli 1 per volta verifichi nella stessa tabella se esistono figli per B C e D e così via, non servono altre tabelle correlate. Per capire meglio: nel caso di C la procedura chiede di estrarre dalla suddetta tabella tutti i record che hanno come padre C e ti vengono restituiti 3 record. Ciao VB "grenzo" <[email protected]> ha scritto nel messaggio news:[email protected]... - Mostra testo tra virgolette - Rispondi all'autore Inoltra grenzo Vedi profilo Altre opzioni 12 Dic 2000, 04:29 - Mostra testo tra virgolette si' ok, pero' nelle condizoni reali la distinta base viene utilizzata per gestire gli articoli figli che compongono, a vari livelli, un altro articolo padre. Esiste, quindi, la tabella 'articoli' dove il singolo articolo (padre o figlio ) corrisponde ad un record solo. Se voglio avere piu' record ( come nel tuo esempio ) che si riferiscano ad un articolo unico ( esempio codice A )devo avere per forza un'altra tabella correlata. o no? ---ciao, grenzo Rispondi all'autore Valter Vedi profilo Inoltra Altre opzioni 13 Dic 2000, 23:17 L'esempio si riferisce a un caso reale, devi usare una sola tabella, la procedura funziona per qualsiasi "codice" tu gli passi, provare per credere (ti ho mandato in EMail sorgente (VB6) e archivio (.mdb) per farlo), prova ad aggiungere qualsiasi struttura ti possa venire in mente e vedrai che funge con quell'unica tabella, a qualsiasi livello tu voglia arrivare http://groups.google.it/group/it.comp.lang.visual-basic/browse_thread/thread/6ab4f68... 08/02/2007 it.comp.lang.visual-basic | Google Gruppi Page 5 of 5 (sei limitato solo da VB che non è il linguaggio più adatto per procedure ricorsive). Attento a non aggiungere dei loop di strutture (codice X che ha come figlio Y che a sua volta a X come figlio), in un programma per la gestione della distinta prima di aggiornare l'archivio devi controllare queste situazioni. Ciao VB "grenzo" <[email protected]> ha scritto nel messaggio news:[email protected]... - Mostra testo tra virgolette - Rispondi all'autore Inoltra grenzo Vedi profilo Altre opzioni 14 Dic 2000, 09:57 Ok, ma l'allegato non lo ho ricevuto.... -----ciao e grazie, grenzo - Mostra testo tra virgolette - Rispondi all'autore Inoltra Valter Vedi profilo Altre opzioni 16 Dic 2000, 02:02 Non riesco ad inviartelo mi dice semppre che il file è troppo grosso, hai un'altro indirizzo? Ciao VB "grenzo" <[email protected]> ha scritto nel messaggio news:[email protected]... - Mostra testo tra virgolette - Rispondi all'autore Inoltra Fine dei messaggi - torna a Discussioni «Argomento più recente - Cambiare COLORE a una sola riga della DBGRID Una schermata su piu' monitor Argomento meno recente » Crea un gruppo - Google Gruppi - Home page di Google - Termini di servizio - Norme sulla privacy ©2007 Google http://groups.google.it/group/it.comp.lang.visual-basic/browse_thread/thread/6ab4f68... 08/02/2007