Nella pagina precedente abbiamo esaminato i quattro pulsanti di navidazione nel database ed il pulsante e le due ComboBox per la ricerca dei dati. Questa è la UserForm su cui stiamo lavorando
Continuo con la descrizione degli altri pulsanti
Gli altri pulsanti sono dedicati alla gestione dei dati
Può capitare che occorra semplicemente modificare dei dati già esistenti.
Nel codice che ho usato occorre svolgere alcune azioni:
NB
è da notare il modo che ho adottato per scrivere nel file di testo:
Il file viene aperto in scrittura usando la forma
Open NomeFile For Output As #FileNum
la quale fa sì che i dati vengono sovrascritti
Per scrivere i dati viene usata l'istruzione Write # che scrive i dati una stringa alla volta racchiudendoli tra doppi apici e, se scritti sulla stessa riga, divisi da una virgola (,), come mostrato in questo esempio
Siccome la scrittura dei tati viene effettuata in un ciclo ed ogni record deve risiedere sullo stesso rigo nel file di testo, il ciclo lo faccio terminare prima del numero indicato da NumCampi in modo che nel ciclo accompagno l'istruzione di scrittura col punto e virgola ed appena uscito dal ciclo scrivo l'ultimo dato denza il punto e virgola.
Per scegliere se scrivere i dati su una stessa riga o su righe diverse viene usata una punteggiatura predefinita:
Il problema si fa ancora più interessante.
Con questa opzione dobbiamo
Il problema principale è quello che dobbiamo affrontare per aggiornare la matrice.
Io ho risolto in questo modo:
In pratica è questo che succede:
| record 4 da eliminare | si fanno scorrere in su i record sottostanti | la matrice viene ridimensionata | Nuova definizione dei record dopo ridimensionamento |
| Rec n° 1 | Rec n° 1 | Rec n° 1 | Rec n° 1 |
| Rec n° 2 | Rec n°2 | Rec n°2 | Rec n°2 |
| Rec n° 3 | Rec n°3 | Rec n°3 | Rec n°3 |
| Rec n° 4 X | Rec n°5 ^ | Rec n°5 | Rec n°4 |
| Rec n° 5 | Rec n°6 ^ | Rec n°6 | Rec n°5 |
| Rec n° 6 | Rec n°7 ^ | Rec n°7 | Rec n°6 |
| Rec n° 7 | Rec n°8 ^ | Rec n°8 | Rec n°7 |
| Rec n° 8 | Rec n°9 ^ | Rec n°9 | Rec n°8 |
| Rec n° 9 | Rec n° 10 ^ | Rec n° 10 | Rec n°9 |
| Rec n° 10 | Rec n° 11 ^ | Rec n° 11 | Rec n° 10 |
| Rec n° 11 | Rec n° 11 | X |
Fatto questo si esegue l'aggiornamento del file di testo nel solito modo.
Private Sub CommandButton6_Click()
Dim R, C
Dim Cartella, NomeFile, FileNum
If MsgBox("sicuro di voler eliminare " & vbCrLf & Matrice(1, RecordCorrente) & "?", _
vbYesNo + vbExclamation) = vbNo Then Exit Sub
If MsgBox("Allora elimino " & vbCrLf & Matrice(1, RecordCorrente) & "?", _
vbYesNo + vbExclamation) = vbNo Then Exit Sub
MsgBox "fatto"
' nella matrice si fanno scorrere in sù i record sottostanti quello da eliminare a partire
' dalla posizione del record corrente che è quello da eliminare
For R = RecordCorrente To NumRec - 1
For C = 1 To NumCampi
Matrice(C, R) = Matrice(C, R + 1)
Next
Next
' la matrice viene ridimensionata usando la clausola Preserve per non perdere i dati eliminando così,
'
di fatto, l'ultimo record che è rimasto duplicato a causa dello scorrimento in sù degli ultimi record
ReDim Preserve Matrice(1 To NumCampi, 1 To NumRec - 1)
NumRec = UBound(Matrice, 2)
If RecordCorrente > NumRec Then
RecordCorrente = NumRec
End If
Label12.Caption = NumRec & " record"
' RecordCorrente conserva il valore che aveva prima dell'operazione, se ad essere eliminato
'
non è l'ultimo record, per cui viene visualizzato il record che ha preso il posto di quello eliminato
For C = 1 To NumCampi
Controls("TextBox" & C) = Matrice(C, RecordCorrente)
Next
' si procede ora alla registrazione dell'intera matrice sovrascrivendo i vecchi dati
Cartella = ThisWorkbook.Path & "\"
NomeFile = Cartella & "Indirizzario.mik"
Close
FileNum = FreeFile()
Open NomeFile For Output As #FileNum
For C = 1 To NumCampi - 1
Write #FileNum, Controls("Label" & C).Caption;
Next
Write #FileNum, Controls("Label" & C).Caption
For R = 1 To NumRec
For C = 1 To NumCampi - 1
Write #FileNum, Matrice(C, R);
Next
Write #FileNum, Matrice(C, R)
Next
Close #FileNum
End Sub
Questa è senz'altro la fase più delicata di questo applicativo.
Quando si entra in fase di inserimento di un nuovo record è opportuno disabilitare tutti i controlli per non creare confusione ed eventuali errori.
In questa fase gli unici controlli che ci servono sono:
Questo pulsante è abbinato al pulsante Nuovo Record e normalmente viene tenuto nascosto.
Il suo compito è quello di uscire dalla modalità inserimento e riportare alla modalità consultazione. Quindi il suo compito è molto semplice