|
Anche se le
operazioni compiute nelle maschere di Access, sono automatizzate, spesso è necessario
ricorrere a costrutti VBA per reperire informazioni, ad es. sapere se lutente
si è spostato da un record ad un altro.
In molte maschere, capita di dover sapere se lutente è si spostato da un
record ad un altro, oppure se ha fatto una richiesta per inserire di un nuovo
record. Per questo caso Access fornisce una proprietà che prende il nome di NewRecord, la
stessa restituisce valore True se la maschera mostra la nuova riga del record da
immettere, False nel caso contrario. La maschera allinserimento di un
nuovo record, ne evidenza il fatto mostrando una label con la dicitura Nuovo
Record, ciò e dovuto all'uso della proprietà NewRecord; basta associare
allevento Su Corrente della maschera il codice relativo alla funzione NewRecord,
così come mostrato di seguito
Private Sub Form_Current()
NuovoRecord.Visible = Me.NewRecord
End Sub
|
Il codice sopra proposto equivale a dire: mostra la label se la funzione NewRecord
restituisce valore True.
Riga corrente e numero totale delle righe
Anche se Access, in ogni maschera da la possibilità di usare il navigatore di record, che
ricordiamo, aiuta lutente mettendo a disposizione dello stesso i pulsanti per
spostarsi allinterno dei record, in alcune situazioni, ad es. se si volesse evitare
di visualizzare lo stesso e ricorrere a dei pulsanti personalizzati, risulta utile avere
delle proprietà in grado di fornire il numero del record sul quale attualmente ci si
trova posizionati, o ancora stabilire il numero totale di record presenti nella maschera.
La proprietà CurrentRecord, assolve alla prima delle due richieste, fornendo la posizione
del record correntemente utilizzato; così come visto in precedenza possiamo associare
allevento Su corrente di una maschera, tale proprietà per averne sempre in una
casella di testo denominata RecordCorrente il valore restituito dalla stessa:
Private Sub Form_Current()
RecordCorrente.Caption = Me.CurrentRecord
End Sub
|
Per quanto riguarda la possibilità di reperire il numero totali dei record, cè da
aggiungere che le proprietà delle maschera non ci sono daiuto, in questo caso
infatti bisigna ricorrere alle proprietà dellorigine record stessa; la proprietà
che fa al nostro caso è RecordCount, prima di invocare la stessa è comunque prassi,
quella di spostarsi alla fine dellultimo record (usare la proprietà MoveLast) e poi
invocare la proprietà RecordCount.
Il recordset di una maschera è parte integrante della stessa,
non accessibile in modo diretto tramite codice VBA; a questo scopo è necessario usare
RecordsetClone che ci permette di far riferimento all'oggetto specificato dalla proprietà
RecordSource della maschera stessa. Se in una maschera quindi usiamo come origine dati una
query, facendo riferimento alla proprietà RecordsetClone, vorrà dire clonare un
oggetto Recordset utilizzando la stessa query. Ecco di seguito il codice completo che ci
consentirà di fare uso della proprietà RecordCount:
Private Sub Form_Current()
Set rst = Me.RecordsetClone
rst.MoveLast
Etichetta11.Visible = True
Etichetta11.Caption = rst.RecordCount
End Sub
|
|
Il
record è stato modificato?
Unaltra delle operazioni che risultano utili, è stabilire se il record corrente è
stato modificato dopo l'ultimo salvataggio, questo ad es. può essere importante nel
determinare se le modifiche apportate ad un record siano state intenzionali oppure no e
consentire lo spostamento al record successivo senza procedere al salvataggio delle
stesse. La proprietà Dirty si occupa di assolvere a questa funzionalità; ogni qualvolta
i dati presenti nella maschera vengono modificati per la prima volta, Access attiva
levento Dirty per la maschera; cè da dire che lo stesso evento non è capace
comunque di determinare se lutente per es. premendo il tasto Esc, annulla la
modifica attuale ai dati. La proprietà Dirty viene impostata come riportato in Tab.1 Ecco
un es. in codice che mostra il funzionamento della proprietà:
Sub Annulla_Click ()
If Me.Dirty Then
Me!Etichetta11.Caption=
Sono state apportate modifiche
Else
Me!Etichetta11.Caption=
NON state apportate modifiche
End If
End Sub |
Nel codice sopra si fa riferimento ad un ipotetico bottone Annulla posizionato
allinterno di unipotetica maschera contenente unorigine dati, se lo
stesso viene premuto, la proprietà Dirty, verifica che siano stati apportati cambiamenti
ai record della maschera, se si, viene associata alletichetta di testo Etichetta11
la stringa Sono state apportate modifiche, altrimenti se la proprietà
restituirà il valore False, allora alletichetta verrà associata la stringa
NON sono state apportate modifiche La proprietà BookMark La proprietà
BookMark consente di impostare una sorta di segnalibro per il record corrente della
maschera, un promemoria che potrebbe servire in qualche modo per ritornare al record una
volta che ci si è spostati dallo stesso. Sostanzialmente loperazione conserva in
una variabile il record attivo in quel preciso momento. Con i segnalibri quindi si possono
eseguire tre diverse fondamentali operazioni:
Recuperare il valore del segnalibro, e immagazzinarlo per un
recupero successivo.
Assegnare al segnalibro un valore che è stato salvato in
precedenza.
Confrontare due segnalibri per determinare allinterno del
RecordSet le posizioni relative.
Non c'è nessun limite al n. di segnalibri che si può salvare
purché ciascuno di essi venga salvato con una variabile di tipo stringa univoca. Ecco un
es. che mostra come fare uso della proprietà Bookmark:
Private Sub Comando12_Click()
Dim s As Variant
Set rst = Me.RecordsetClone
'Impostiamo il bookmark corrente
s = rst.Bookmark
'Ci spostiamo sul primo record
rst.MoveFirst
'Ritorniamo al Bookmark salvato in precedenza
rst.Bookmark = s
End Sub |
Il confronto tra i segnalibri
Luso del segnalibro è comodo se si volesse ad es. sapere la posizione relativa di
un record contrassegnato da un segnalibro, rispetto ad un altro record anchesso
contrassegnato da un segnalibro. Gli oggetti ADO a tal proposito forniscono il metodo
CompareBookMarks; loggetto dati due segnalibri del medesimo recordset, restituisce
uno dei valori mostrati in Tab 2. Ecco un es che illustra come usare il metodo:
If Rst.CompareBookMarks (book1, book2)=
adCompareLessThan then
MsgBox Il primo segnalibri precede il secondo
End if |
|
ADO
e ADOX
In unapplicazione è necessario accedere alle strutture del db, per es. se so
vuole recuperare lo schema di una tabella, creare un nuovo indice ecc.... Ognuna di
queste operazioni, con Access la si compie in modo semplice utilizzando gli ADO e le ADOX
(Estensioni degli ADO per il DDL e la protezione, ADO Extensions for DDL and Security),
una coppia di librerie COM (Modello d'oggetto basato su componenti, Component Object
Model), facente parte della strategia Microsoft UDA (Accesso universale ai dati, Universal
Data Access), per il recupero e la gestione dei dati. Le versioni precedenti di Access a
partire dalla versione 1 per l'accesso programmato ai dati usavano una libreria chiamata
DAO come un'interfaccia al motore di database Jet; tale libreria si è riproposta nelle
successive versioni di Access sino alla versione 97. Nella nuova versione 2000, DAO è
ancora presente tuttavia non resta la libreria unica per laccesso ai dati. DAO in
Access 2000 è ancora utilizzato in diverse situazioni, come per esempio quando si
recupera il recordset di una maschera in un database o ancora quando si converte un
database da una versione precedente di Access. Allatto della creazione di un nuovo
database (file MDB), o un progetto di dati (ADP), lapplicazione per default
imposterà lutilizzo degli oggetti ADO, impostando in modo automatico un riferimento
alla libreria Microsoft ActiveX Data Objects versione 2.1. Esiste comunque un modo che
permette in ogni caso di impostare manualmente, per qualunque evenienza, il riferimento
alla libreria ADO. Tale operazione la si compie da Visual Basic Editor, dal menu STRUMENTI
> RIFERIMENTI scegliendo dalla finestra che comparirà a video la voce Microsoft Active
Data Objects 2.1,così come mostrato nella figura sottostante. Dalla stessa maschera,
tuttavia sarà anche possibile selezionare la libreria DAO, quindi sostanzialmente nella
medesima applicazione, sarà anche possibile selezionare entrambe le librerie; in
questultimo caso si potranno usare contemporaneamente sia gli ADO che i DAO. Il
problema sorge dal fatto che entrambe le librerie includono alcuni oggetti con lo stesso
nome, come per esempio nel caso degli oggetti RecordSet, in questo particolare caso, un
riferimento all'oggetto punterà alla libreria che appare per prima nella finestra di
dialogo Riferimenti (proprio a questo servono i pulsanti Priorità presenti nella finestra
dei riferimenti). Digitando quindi per esempio: Dim rst As Recordset, non si potrà mai
determinare quale recordset si otterrà, senza aver controllato la finestra di dialogo
Riferimenti, per vedere quale delle due librerie appare per prima nell'elenco. Si può
comunque aggirare ilp roblema specificando durante la dichiarazione delloggetto, la
libreria di appartenenza, così come nelle righe di codice seguente
Dim rst1 As ADODB.Recordset
Dim rst2 As DAO.Recordset |
|
|