Entra

View Full Version : [VB6]Agenda telefonica con file sequenziale


motogpdesmo16
12-10-2004, 21:35
Avrei da sottoporre alla vostra attenzione alcune cose che non riesco a risolvere.

Ho un file sequenziale in cui memorizzo i vari campi del record: persona.nominativo, persona.indirizzo e così via.
Vorrei effettuare la visualizzazione per lettera. Ho pensato quindi di confrontare la lettera che mi interessa visualizzare con la prima lettera del campo record persona.nominativo. Poi non appena si verifica la condizione, valorizzo un record ausiliario omogeneo e memorizzo in un file di supporto. Per provare ho utilizzato la lettera a inserendo il seguente codice:



Do While Not EOF(1)
Input #1, persona.nominativo
car = Left(persona.nominativo, 1)
If (car = "A") Or (car = "a") Then
cont = cont + 1
Input #1, persona.id
aux.id = persona.id
Input #1, persona.nominativo
aux.nominativo = persona.nominativo
Input #1, persona.indirizzo
aux.indirizzo = persona.indirizzo
Input #1, persona.datanascita
aux.datanascita = persona.datanascita
Input #1, persona.telefono
aux.telefono = persona.telefono
Input #1, persona.città
aux.città = persona.città
Input #1, persona.cap
aux.cap = persona.cap
supportoscrivi
Write #2, aux.id
Write #2, aux.nominativo
Write #2, aux.indirizzo
Write #2, aux.datanascita
Write #2, aux.telefono
Write #2, aux.città
Write #2, aux.cap

Close #2
End If
Loop
Close #1


nb1:la variabile cont, che si autoincrementa ogni volta che viene rispettata la condizione l'ho inserita per poi effettuare la visualizzazione in una flexgrid. Imposto pertanto il numero delle righe a cont+1 (perchè c'è la riga di intestazione, quella grigia).

nb2: a supportoscrivi corrisponde una sub, dichiarata nel modulo, che provvede ad aprire in append un file di supporto.

spero che il codice sia abbastanza chiaro e che mi sia spiegato in altrettanta maniera.

se volete posso allegare il progetto.

grazie dell'attenzione.

matpez
13-10-2004, 00:46
Io nn ho capito molto bene... vuoi visualizzare in ordina alfabetico i nominativi?

stripes
13-10-2004, 08:24
se mi alleghi (o mi invio in privato ) il progetto posso provare
ad aiutarti....(spero!!)

motogpdesmo16
13-10-2004, 12:42
Originariamente inviato da matpez
Io nn ho capito molto bene... vuoi visualizzare in ordina alfabetico i nominativi?


diciamo che dovrei fare diversi ordinamenti:;
*in ordine alfabetico
*per lettera (questo ordinamento è associato a una scroll bar che, ad ogni pressione mi deve visualizzare le lettere successive e precedenti)
*per data di nascita
*per indirizzo
*per città

ma basta che riesco a farne uno e poi di riuscire a fare anche gli altri abbastanza agevolmente.

mitch82
13-10-2004, 12:46
Ciao, forse posso aiutarti, ma prima vediamo se ho capito bene, i vari ordinamenti li vuoi per forza su file o ti basta solo visualizzarli?

:confused:

matpez
13-10-2004, 12:47
Bhe ma per fare gli ordinamenti nn si lavora mai sul file, è troppo lungo!!

Devi leggere tutto il tuo record e memorizzarlo dentro ad un vettore di record e da li in poi elabori tutto con i vari ordinamenti, per esempio il bouble sort!

motogpdesmo16
13-10-2004, 12:51
Originariamente inviato da mitch82
Ciao, forse posso aiutarti, ma prima vediamo se ho capito bene, i vari ordinamenti li vuoi per forza su file o ti basta solo visualizzarli?

:confused:

mi serve solo la visualizzazione in una flexgrid. Non necessariamente su file.

grazie della risposta.

motogpdesmo16
13-10-2004, 12:52
Originariamente inviato da matpez
Bhe ma per fare gli ordinamenti nn si lavora mai sul file, è troppo lungo!!

Devi leggere tutto il tuo record e memorizzarlo dentro ad un vettore di record e da li in poi elabori tutto con i vari ordinamenti, per esempio il bouble sort!

il bubble sort in 3 anni non ci è mai stato presentato.
Non vorrei che però fosse l'algoritmo dello scambio dei valori usando una qualsiasi variabile ausiliaria.

esempio: a=7; b=5 e voglio ottenere a=5 e b=7:

aux=a
a=b
b=aux

matpez
13-10-2004, 12:54
Bhe si certo, però devi metterlo dentro due cicli annidati!!

Ma studi informatica alle superiori? com'è possibile che nn aveta fatto il bouble sort!!

motogpdesmo16
13-10-2004, 12:55
Originariamente inviato da matpez
Bhe si certo, però devi metterlo dentro due cicli annidati!!

Ma studi informatica alle superiori? com'è possibile che nn aveta fatto il bouble sort!!
sono al 5° itis informatico

magari il bubble sort l'abbiamo fatto (appunto quell'algoritmo dello scambio) ma non ci è mai stato definito come tale.....

matpez
13-10-2004, 12:57
No, lo scambio è lo scambio, il bubble sort è proprio un ordinamento di vettori!!

Teoria:
http://www.redangel.it/articoli/articolo.asp?art=12&l=2

motogpdesmo16
13-10-2004, 13:02
ho capito.grazie del link ;)

comunque allego il progetto.

mitch82
13-10-2004, 13:08
sono arrivato tardi, ti hanno gia' proposto una soluzione piu' che valida
buon lavoro :p

motogpdesmo16
13-10-2004, 13:14
Originariamente inviato da mitch82
sono arrivato tardi, ti hanno gia' proposto una soluzione piu' che valida
buon lavoro :p

dici per fare l'ordinamento alfabetico??
ma trattandosi di record, non mi conviene ordinare su un record ausiliario e scrivere su un file di supporto dal quale andare a leggere in fase di visualizzazione?

ho quindi proceduto così

Do While Not EOF(1)
For i = 1 To ((campi / 7) - 1)
Input #1, persona.nominativo
Input #1, persona.indirizzo
Input #1, persona.datanascita
Input #1, persona.telefono
Input #1, persona.città
Input #1, persona.cap

r1.nominativo = persona.nominativo
r1.indirizzo = persona.indirizzo
r1.datanascita = persona.datanascita
r1.telefono = persona.telefono
r1.città = persona.città
r1.cap = persona.cap


For j = (i + 1) To (campi / 7)
Input #1, persona.nominativo
Input #1, persona.indirizzo
Input #1, persona.datanascita
Input #1, persona.telefono
Input #1, persona.città
Input #1, persona.cap
r2.nominativo = persona.nominativo
r2.indirizzo = persona.indirizzo
r2.datanascita = persona.datanascita
r2.telefono = persona.telefono
r2.città = persona.città
r2.cap = persona.cap

If (r1.nominativo > r2.nominativo) Then
aux.nominativo = r1.nominativo
aux.nominativo = r1.nominativo
aux.indirizzo = r1.indirizzo
aux.datanascita = r1.datanascita
aux.telefono = r1.telefono
aux.città = r1.città
aux.cap = r1.cap

r1.nominativo = r2.nominativo
r1.indirizzo = r2.indirizzo
r1.datanascita = r2.datanascita
r1.telefono = r2.telefono
r1.città = r2.città
r1.cap = r2.cap

r2.nominativo = aux.nominativo
r2.indirizzo = aux.indirizzo
r2.datanascita = aux.datanascita
r2.telefono = aux.telefono
r2.città = aux.città
r2.cap = aux.cap
End If



dove campi/7 è il numero di record presenti nel file. Potevo usare la formula lunghezzafile/lunghezza record ma non ci ho pensato:D :D

p.s.:perdonate l'identazione.......:mc:

motogpdesmo16
13-10-2004, 18:22
up

mitch82
14-10-2004, 09:46
Beh! l'ordinamento pare giusto, ma credo che si possa ottimizzare di molto senza scrivere i dati ordinati in un file., utlizzando degli array come è già stato detto.

:rolleyes:

motogpdesmo16
14-10-2004, 12:46
penso mi convenga memorizzare i dati in una matrice, visto che ci sono più campi per ogni record....

che ne pensate?

mitch82
14-10-2004, 15:04
beh se fai un array di record ti eviti la gestione della matrice e hai lo stesso tutti i dati ;)

Ma la scelta di file è proprio obbligata o l'hai deciso tu? altrimenti potresti usare un database anche access e tutto diventerebbe molto più facile :)

motogpdesmo16
14-10-2004, 15:34
è proprio obbligato l'uso dei file, e per di più sequenziale.
Che io sappia, con questo tipo di file, non puoi leggere tutto l'intero record, ma devi farlo campo per campo. Ecco perchè ho detto che la matrice di dati sarebbe meglio rispetto ad un vettore.

motogpdesmo16
14-10-2004, 17:15
sono riuscito finalmente a risolvere mediante l'uso di una doppia matrice:
*in una ho memorizzato i campi del record man mano che li leggevo dal file sequenziale
*l'altra l'ho usata di supporto in fase di scambio record, in quello che poi è stato il vero è proprio ordinamento.

Questo primo problema è stato finalmente risolto.
In caso di novità scriverò sempre in questo post!

grazie a tutti per l'aiuto e le idee proposte.

motogpdesmo16
14-10-2004, 22:48
dovrei adesso visualizzare i contatti per lettera.
Ho pensato quindi a una vscrollbar: premendo verso il basso dovrebbe visualizzare i record corrispondenti alla lettera successiva; viceversa premendo verso l'alto deve visualizzare i record corrispondenti alla lettera precedente.

Dato che su msdn non sono riuscito a capire granchè, o meglio non c'è nessun esempio simile al caso da me presentato, c'è qualcuno che potrebbe aiutarmi?

grazie.

mitch82
15-10-2004, 08:13
ciao, se metti due pulsanti su uno incrememnti il codice ascii della "A" e poi richiami la funzione che ti riordina i dati con quella lettera e cosi' via e con l-altro fai viceversa, che alla fine e- la stessa cosa che dovresti fare con la scroll bar. Ovviamente devi controllare di non superare ne la "Z" e tornand indietro la "A".

Spero di esserti stato di aiuto

motogpdesmo16
15-10-2004, 13:22
ho inserito adesso la scroll bar .

num = frmVisualizza.scroll.Value 'memorizza il valore numerico della scroll
lettere = Chr(65 + num) 'converte in lettera il numero
apri 'apre file in input
Do While Not EOF(1)
Input #1, persona.nominativo 'estrae il campo .nominativo di ogni record
car = Mid(persona.nominativo, 1, 1) 'estrae il primo carattere di ogni campo nominativo
If (car = lettere) Then 'confronta
campi = (campi + 1) 'se si verifica la condizione incrementa un contatore
End If
Loop
Close #1
totrighe = (campi / 7) 'il numero delle righe è dato dalla somma della variabile diviso il numero campi

è giusto come algoritmo?
grazie

mitch82
16-10-2004, 14:16
ha prima vista sembra porprio di si... :D

ciao ciao

motogpdesmo16
17-10-2004, 11:56
eppure continua a non funzionare.....mi genera le righe pari al numero dei contatti presenti in agenda e non pari al numero dei contatti della lettera selezionata.

motogpdesmo16
18-10-2004, 21:04
sempre a proposito di questo problema, nel record memorizzo la data di nascita in formato date prendendola dal Month View.
Quando vado a fare l'ordinamento per data di nascita, l'ordinamento viene ovviamente effettuato in base al giorno.
Vorrei farlo in base all'anno, poi al mese e poi al giorno.
Avevo pensato di memorizzare in una variabile, la conversione in stringa di ogni elemento che compone la data:

variabile=cstr(calendario.year)+cstr(calendario.month)+cstr(calendario.day)

dove calendario è il nome del Month View inserito.

come poi posso fare l'ordinamento in base a queste mie disposizioni??
grazie.

motogpdesmo16
20-10-2004, 13:06
up....

lunedì deve essere terminato questo programma....;)

grazie.

mitch82
20-10-2004, 16:46
mi dispiace dovrei provarlo ma allo stato attuale non ne ho la possibilità :(

motogpdesmo16
20-10-2004, 18:23
grazie lo stesso.
comunque quell'algoritmo che c'è in qualche reply fa, quello della visualizzazione per lettera, non funziona.eppure non riesco proprio a capire dove sia l'errore.

motogpdesmo16
22-10-2004, 10:03
up please....

trapanator
25-10-2004, 09:36
ce l'hai fatta? :D

motogpdesmo16
25-10-2004, 18:41
si, alla fine ce l'ho fatta. Ho lavorato su un intero pomeriggio, ma alla fine ce l'ho fatta.

Poi a prodotto finito lo metto online qui

motogpdesmo16
28-10-2004, 22:39
non riesco adesso a fare l'ordinamento in base alla data di nascita.
Le date sono ordinate in base al giorno e non considerando mese e anno, pur essendo state dichiarate in formato "date".

Un'ultima cosa. Se io apro un file sequenziale, e vorrei modificare i campi di un record al suo interno, come bisognerebbe fare non potendo usare la seek per posizionarsi sul record che interessa??

grazie.

trapanator
29-10-2004, 08:28
Originariamente inviato da motogpdesmo16
Un'ultima cosa. Se io apro un file sequenziale, e vorrei modificare i campi di un record al suo interno, come bisognerebbe fare non potendo usare la seek per posizionarsi sul record che interessa??

i record sono fissi? Se si', leggi n*(dimensione record) caratteri
se sono variabili senza un indice devi leggerlo da cima a fondo...

motogpdesmo16
31-10-2004, 18:36
Originariamente inviato da trapanator
i record sono fissi? Se si', leggi n*(dimensione record) caratteri
se sono variabili senza un indice devi leggerlo da cima a fondo...
tralasciando la parte di modifica del file, adesso intenderei sapere se è possibile fare l'ordinamento per data.
I campi del record relativi all'inserimento della data di nascita sono dichiarati come "date".
Questi record vengono poi trasferiti all'interno di una matrice dichiarata come "string" e poi sui dati presenti nella matrice viene effettuato l'ordinamento, che avviene tenendo conto solamente del giorno e non del mese e dell'anno.

come posso ovviare a questo problema??
avevo pensato anche a :

'dd = Left(persona.datanascita, 2)
'mm = Mid(persona.datanascita, 4, 2)
'yyyy = Right(persona.datanascita, 4)
'dat = dd & " " & mm & " " & yyyy
'matrice(i, 4) = dat
cioè a prendere le varie parti che mi interessano giorno, mese e anno e memorizzarle in 3 variabili string e poi associarle all'elemento della matrice.
In questo caso l'ordinamento avviene correttamente e quindi ho ad esempio 03112004.
se vado a fare cdate(matrice(i,4)) mi da errore: tipo non corrispondente.

motogpdesmo16
01-11-2004, 15:55
up

grazie