it.comp.lang.visual

annuncio pubblicitario
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
Scarica