VB
I dati delle maschere
Anche se le operazioni compiute nelle maschere di Access, sono automatizzate, spesso è necessario ricorrere a costrutti VBA per reperire informazioni, ad es. sapere  se l’utente si è spostato da un record ad un altro.

In molte maschere, capita di dover  sapere se l’utente è 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  all’inserimento 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 all’evento 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 l’utente mettendo a disposizione dello stesso i pulsanti per spostarsi all’interno 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 all’evento 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 d’aiuto, in questo  caso infatti bisigna ricorrere alle proprietà dell’origine record stessa; la proprietà che fa al nostro caso è RecordCount, prima di invocare la stessa è comunque prassi, quella di spostarsi alla fine dell’ultimo 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?
Un’altra 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 l’evento Dirty per la maschera; c’è da dire che lo stesso evento non è capace comunque di determinare se l’utente 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 all’interno di un’ipotetica maschera contenente un’origine dati, se lo stesso viene premuto, la proprietà Dirty, verifica che siano stati apportati cambiamenti ai record della maschera, se si, viene associata all’etichetta di testo Etichetta11 la stringa “Sono state apportate modifiche”, altrimenti se la proprietà restituirà il valore False, allora all’etichetta 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 l’operazione 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 all’interno 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
L’uso del segnalibro è comodo se si volesse ad es. sapere la posizione relativa di un record contrassegnato da un segnalibro, rispetto ad un altro record anch’esso contrassegnato da un segnalibro. Gli oggetti ADO a tal proposito forniscono il metodo CompareBookMarks; l’oggetto 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 un’applicazione  è 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 l’accesso 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. All’atto della creazione di un nuovo database (file MDB), o un progetto di dati (ADP), l’applicazione per default imposterà l’utilizzo 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 quest’ultimo 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 dell’oggetto, la libreria di appartenenza, così come nelle  righe di codice seguente

Dim rst1 As ADODB.Recordset
Dim rst2 As DAO.Recordset