DATABASE
I database sono dei file organizzati
in formato tabellare dove una riga rappresenta il dato riferito ad un
prodotto o ad un cliente e le colonne le informazioni presenti in una
riga. In una riga anagrafica potrò avere colonne come nome,
cognome, indirizzo e altri dati relativi ad un nominativo. L'insieme
di righe e colonne di dati omogenei viene detto tabella; avrò
pertanto la tabella dei prodotti, dei clienti e così
via.
Nel disegno ci sono 3 tabelle
chiamate Prodotti, Ordini e Clienti. Ogni tabella contiene le
informazioni relative rispettivamente ai prodotti, agli ordini ed ai
clienti. I dati che vengono memorizzati in ogni riga della tabella
sono scritti nel rettangolo che rappresenta la tabella; così,
guardando il disegno, per ogni riga prodotto le informazioni sono
codice, descrizione, quantità e prezzo. Si potrebbe anche dire
che un cliente, ad esempio, é quel dato definito da codice,
nome e cognome, il dato cioé si identifica con le
qualità, le colonne assegnate. Le definizioni date si
riferiscono a database di tipo relazionale che sono i più
usati. Nel disegno sopra le tabelle sono rappresentate come
definizione di dati; nel disegno sottostante viene data una
rappresentazione della tabella di come appare completa con i suoi
dati, dando l'idea cosa vuole dire forma tabellare dei dati.
tabella
PRODOTTI

Per rendere l'accesso alle tabelle
più veloce, vengono create delle altre tabelle chiamate
indici, composte con parte delle colonne della tabella dati; quando
avviene la creazione di un indice, esso riordina i dati secondo i
campi presenti. L'indice viene aggiornato automaticamente quando si
variano i dati nella tabella dati, ma non serve codice aggiuntivo per
gestirlo. Una tabella può avere uno o più indici o
anche nessuno. Di solito si usa mettere nell'indice quelle colonne
della tabella che identificano in maniera univoca una riga: nel caso
della tabella Clienti e di Prodotti, é il codice. Ciò
significa che se ricerco un dato in queste tabelle per codice, sono
sicuro di trovare una sola riga o record cui appartiene. Questa
particolare colonna o insieme di colonne viene detta chiave univoca o
Unique Key ed é la candidata migliore per entrare a far parte
di un indice. E' una buona regola avere sempre per ogni tabella una
chiaveunivoca.
SQL
Esiste un linguaggio riconosciuto
ormai come standard che permette di gestire un database con
facilità ,sollevando lo sviluppatore dai problemi di gestione
dei dati. SQL é la sigla che sta per Structure Query Language
ed è un linguaggio creato parecchi anni or sono, che usa una
sintassi English-like per compiere ricerche, inserimenti, variazioni
e cancellazioni nei database. Ogni casa produttrice di database ha un
suo Sql che però ha sempre come base, delle istruzioni in
comune con altri database; pertanto é possibile che una
ricerca in una tabella funzioni anche in database diversi da quello
per cui era stata creata. Visual Basic usa Sql per accedere ai
database ma dispone anche di altri strumenti che semplificano un po'
le cose; occorre però conoscere qualcosa di sql se si vogliono
usare i database con Visual Basic.
COME
VISUAL BASIC ACCEDE AI DATABASE
E' in grado di usare svariati metodi,
non solo uno come succede per altri linguaggi: anzi nel caso di ODBC
é stato VB a creare uno standard per accedere ai database.
Visual Basic usa 3 metodi di accesso:
- diretto
- usando Isam Driver
- Odbc
Il metodo diretto é
applicabile solo con Microsoft Access usando delle istruzioni
appropriate; in pratica Visual Basic ha nel suo set di istruzioni
anche quelle per accedere direttamente ad Access, senza usare degli
intermediari come negli altri 2 metodi. Non é necessario avere
il pacchetto Access.
Ecco uno schema semplificato di come
VB accede ai database.
I driver Isam sono delle funzioni che
permettono a Visual Basic di accedere a database creati per
funzionare in ambienti pc, quindi semplici da usare e di facile
manutenzione come ad esempio Btrieve, dBase, Paradox, ecc.Ogni
database ha bisogno del suo driver per dialogare con VB e per
accedere ai dati bisogna utilizzare i comandi tipici del database
scelto, che non sempre utilizzano SQL.
ODBC é la sigla che sta
per Open Database Connectivity ed é una libreria di funzioni
che fa da tramite tra Visual Basic ed un qualsiasi database che abbia
i suoi driver ODBC. Con questo metodo si possono accedere ai database
più potenti esistenti sul mercato ed in grado di funzionare su
macchine differenti. ODBC viene usato generalmente per connettersi a
database che risiedono in macchine collegate in rete locale, i
cosiddetti server database ed in grado di gestire centinaia di utenti
contemporaneamente: con questo metodo si é in grado di creare
applicazioni in grado di funzionare in ambienti client-server.Non
é necessario scegliere solo uno di questi metodi ma posso
usarli tutti e 3 ad anche più di una volta, posso cioé
collegarmi contemporaneamente con uno qualsiasi dei database e
scambiare dati tra loro.
IL
DATA CONTROL
Finora abbiamo visto i metodi usati
da Visual Basic per accedere ai database. Per accedere però da
programma ai dati, dobbiamo entrare più in dettaglio per
vedere quali strumenti VB adopera. Il primo fra tutti é il
Data Control: ecco sotto un'immagine di come si presenta
Va
inserito nel form come un normale control e come tale ha
proprietà e metodi, alcune delle quali ad hoc per i database;
vediamo quali sono quelle che sono maggiormente coinvolte per
l'accesso dei dati. Useremo negli esempi Access. Vediamo allora come
connetterci con Access: prima di tutto bisogna indicare al data
control, che chiameremo Data1, quale database utilizzare, usando la
proprietà DatabaseName. Esempio: collegamento con
PROVA.MDB
- data1.DatabaseName
= "c:\db\prova.mdb"
Nella proprietà Recordsource
inserirò o il nome della tabella a cui voglio accdere o
un'istruzione Sql. Esempio: accesso alla tabella clienti.
- data1.recordSource
= "clienti"
Usando Sql dovrò
scrivere:
- data1.recordSource
= "Select * From clienti"
oppure
- data1.recordSource
= "Select codice, nome From clienti"
Il primo esempio é un modo
diverso per accedere alla tabella Clienti, il secondo mi restituisce
codice e nome di tutti i clienti.Per visualizzare i dati della
tabella posso utilizzare un form come questo.
Ci sono 3 textbox con i relativi
nomi: ad ogni textbox devo associare la colonna corrispondente della
tabella clienti, a txtCodice cioé devo associare la colonna
codice di clienti e così per le altre colonne della tabella.
Per farlo uso 2 proprietà di textbox, presenti anche in altri
control che sono datasource e datafield.In Datasource devo inserire
il nome del data control che uso per accedere ad Access e quindi
scriverò:
- textCodice.datasource
= Data1
- textNome.datasource
= Data1
- textCognome.datasource
= Data1
In dataField scriverò il nome
della colonna corrispondente.
- textCodice.datafield
= 'codice'
- textNome.datafield
= 'nome'
- textCognome.datafield
= 'cognome'
Ora tutto é pronto per
eseguire l'applicazione. Notare che le istruzioni inserite sono
valori per le proprietà e quindi possono essere fatte in
design time, significa cioé che senza scrivere un'istruzione
con Visual Basic si é in grado di creare un'applicazione in
grado di interagire con un database. Naturalmente le assegnazioni
possono essere fatte anche a run-time. Con i cursori di data1 posso
scorrere tutte le righe della tabella mentre nelle 3 textbox, i dati
cambieranno automaticamente come ci si sposta: ogni variazione fatta,
per esempio modificando il nome in textNome, verrà aggiornata
nella tabella; questo però vale solamente se data1.recordSource =
"clienti" ovvero se accedo alla
tabella senza Sql.
Vediamo ora come é possibile
implementare questa applicazione aggiungendo delle funzionalià
come l'inserimento di una nuova riga, la cancellazione,
l'aggiornamento e la ricerca. Ma prima di procedere bisogna
introdurre 2 nuovi concetti che sono:
current row o riga corrente

DYNASET
E RECORDSET
Dal momento che data control rende
disponibili le informazioni un record alla volta, deve usare un
puntatore ai dati che indica quale riga é disponibile e quindi
visibile nel form: current Row é questo puntatore. Il Dynaset
é invece l'insieme di tutte le righe che data control ha
trovato nella tabella, consultabile come se fosse un array tramite il
recordset, un altra proprietà del data control. Con recordset
é possibile scorrere in avanti ed indietro il dynaset, i dati
cioé che ho estratto; posso andare nel primo o nell'ultimo
record come posso inserire, cancellare, fare ricerche o variare i
dati. Tutto quello che serve per implementare la gestione
clienti.
Current Row e Dynaset
Implementazione della gestione
cliente. La ricerca di un cliente avviene usando le
proprietà:
- data1.recordset.findFirst
- data1.recordset.findLast
- data1.recordset.findNext
- data1.recordset.findPrevious
che rispettivamente ricercano il
primo, l'ultimo, il successivo ed il precedente record che soddisfano
la ricerca. Il codice per la ricerca é:
- sub
cmdCerca_click()
- dim
ricerca as string
- ricerca =
" cognome = 'Rossi' "
- data1.recordset.findFirst
ricerca
- if
data1.recordset.noMatch then
- msgbox
"Non ho trovato nessun cliente!"
- end
if
- end
sub
Se cmdCerca é il command per
la ricerca, al suo click ricerca tutti i clienti con cognome uguale a
Rossi. L'istruzione di ricerca é memorizzata nella stringa
ricerca ed é praticamente una parte di Sql. L'istruzione
data1.recordset.findFirst ricerca inizia la ricerca nella tabella; se
non trova nulla, if data1.recordset.noMatch then, emette un messaggio
con msgbox "Non ho trovato nessun cliente!"; altrimenti i dati
compariranno nelle textbox. Le caso in cui non si trovi nessun
cliente, succede però che si perdono i riferimenti con il
record precedente; in pratica current row non punta a nessun record.
Per evitare questo piccolo incoveniente, é opportuno
memorizzare il record attuale in una variabile e rivisualizzarlo nel
caso che nessun cliente sia stato trovato. L'istruzione che memorizza
il current row é:
- data1.recordSet.Bookmark
Modifichiamo pertanto il listato
precedente.
- sub
cmdCerca_click()
- dim
ricerca as string
- dim
saveRecord as string
- saveRecord
= data1.recordset.Bookmark
- ricerca =
" cognome = 'Rossi' "
- data1.recordset.findFirst
ricerca
- if
data1.recordset.noMatch then
- msgbox
"Non ho trovato nessun cliente!"
- data1.recordSet.bookmark
= saveRecord
- end
if
- end
sub
La prima istruzione di bookmark copia
il current row, i dati cioé che compaiono nel form, nella
variabile saveRecord; se la ricerca é andata male, saveRecord
ricopia i dati nel Bookmark.L'aggiornamento avviene usando la
l'istruzione data1.recordset.Update. Il codice associato al click di
cmdAggiorna é pertanto:
- sub
cmdAggiorna_click()
- data1.recordset.Update
- end
sub
La differenza con l'aggiornamento
presentato all'inizio consiste che in precedenza per aggiornare il
record bisognava spostare avanti o indietro col cursore del data
control, mentre qui basta premere il bottone Aggiorna.
La cancellazione avviene con
data1.recordset.delete:
- sub
cmdCancella_click()
- data1.recordset.delete
- end
sub
Il record cancellato però
é quello del current row che dopo la cancellazione non punta a
nessun record: allora bisogna fare in modo che punti ad un record
esistente, come ad esempio, al record successivo. Ecco come
modificare il codice.
- sub
cmdCancella_click()
- on error
resume next
- data1.recordset.delete
- data1.recordSet.MoveNext
- if
data1.recordset.EOF then
- data1.recordset.MoveLast
- end
if
- end
sub
Per prima cosa con On error resume
next, in caso di errore la procedure prosegue. Dopo la cancellazione
cerchiamo il record successivo; se siamo alla fine della tabella,
data1.recordset.EOF andiamo all'ultimo record della tabella
data1.recordset.MoveLast. L'istruzione data1.recordset.EOF
restituisce True se siamo a fine tabella mentre al contrario
data1.recordset.BOF restituisce True quando si é all'inizio
della tabella.L'inserimento di un nuovo record avviene in 2 tempi:
creazione di un record vuoto ed aggiornamento dei dati, dopo averli
inseriti con le textbox. L'inserimento avviene con:
data1.recordset.addnew
mentre l'aggiornamento avviene con
update.
- sub
cmdAggiungi_click()
- data1.recordset.AddNew
- end
sub
-
- sub
cmdConferma_click()
- data1.recordset.Update
- end
sub
Per completare l' inserimento
bisognerebbe gestire i command facendoli apparire o scomparire a
seconda delle situazioni. Ad esempio premendo aggiungi dovrebbero
sparire tutti gli altri bottoni eccetto Conferma. Quando viene
aggiunto un nuovo record nel dynaset, viene collocato in fondo:
questo può essere un problema se avevamo chiesto i dati in
certo ordine. L'istruzione
- data1.recordset.refresh
riaggiorna il dynaset e dovrebbe
essere eseguito dopo ogni aggiornamento di dati.
ALTRE
PROPRIETA' E METODI DI DATA CONTROL
Nell'aprire un database diverso da
Access, dobbiamo dire al data control di che tipo é, come
dBase, Paradox, usando la proprietà connect, che può
avere i seguenti valori:

Esempio: assegna del database
paradox:
data1.connect
= "paradox;"
Le proprietà Exclusive e
ReadOnly servono ad indicare, quando valgono True, che il database
é in uso esclusivo, cioé un solo utente può
usarlo e di sola lettura.
- data1.exclusive
= true
- data1.readOnly
= false permessa sia lettura sia la
scrittura nel database
DataRegion
|