Muoversi
nel risultato di una query |
Il
risultato della nostra query ci verrà restituito in
un recordset a sua volta diviso in fields. Un recordset è
il set di record ottenuto da una tabella in base a un comando
eseguito.
Per creare un recordset noi utilizziamo ADODB.Recordset (installato
con ADO) e ADOR.Recordset (installato con MS Internet Explorer).
Questi sono entrambi ID programmatici.
Aperto il recordset questo viene fatto corrispondere al primo
record disponibile e le proprietà BOF (Begin Of
File) e EOF (End Of File) sono settate come false,
se non ci sono record queste due proprietà sono entrambe
true.
Come si può intendere dal nome BOF e EOF restituisco
un valore booleano a seconda se ci troviamo nel primo o nell'ultimo
record. EOF ci sarà molto simile nel caso in cui dovremmo
scorrere un recordset intero, infatti in combinazione col
cicli do
while potremmo scorrere il recordset fino a
quando non sono finiti i record in lui contenuti. Cioè:
Do
Until
rs.Eof = True
'...
'istruzioni da eseguire
'...
rs.movenext 'va al record successivo
Loop
|
Ottenuto
un risultato dalla nostra query ci possiamo spostare all'interno
di essa, per fare ciò ricorriamo a MoveFirst,
MoveLast, MoveNext e MovePrevious.
La sintassi è ad esempio:
Discorso
a parte merita Move, questo muove di n record a partire
dall'i-esimo record, ad esempio
n
= 0
i = 3
rs.Move n, i
|
n
= 5
i = 8
rs.Move n, i
|
Il
primo esempio muove al terzo record, il secondo al tredicesimo.
Discorso a parte meritano:
» AbsolutePosition: forza il record corrente
su l'i-esimo record da noi specificato, o ne restituisce la
posizione. Esempio:
rs.AbsolutePosition
= Indice
'sposta il record corrente sull'i-esimo
record
MsgBox rs.AbsolutePosition
'visualizza in una message box il
numero del record corrente |
»
AbsolutePage: forza il record corrente su una determinata
pagina del recordset, oppure restituisce la pagina corrente.
rs.AbsolutePage
= Indice
'sposta il record corrente sull'i-esimima
pagina
MsgBox rs.AbsolutePosition
'visualizza in una message box il
numero della pagina corrente |
»
Filter: Indica un filtro per i dati di un recordset.
» RecordCount e PageCount: Contano rispettivamente
il numero dei record ed in numero delle pagine presenti nel
recordset.
Per
chiudere la connessione al database bastano le seguenti 4
righe di codice:
'libero
risorse
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing |
Piccoli
accorgimenti ed errori comuni |
Ed
ecco ora alcune domande interessanti con relativa risposta
che vi potreste essere posti:
D: Come faccio a scorrere tutto il contenuto di
una tabella?
R: Dopo aver eseguito il SELECT sulla tabella che ci
interessa:
Do
Until
rs.Eof = True
MsgBox rs("nomecampo")
rs.movenext 'va al record successivo
Loop |
D:
Come faccio a inserire parametri messi in input dall'utente
nelle mie query?
R: Mettiamo caso che voi riceviate l'input da delle
textbox, il codice dovrà essere qualcosa tipo:
SQL
= "SELECT nazione, cognome FROM fornitori WHERE nazione
= '" & _ Text1.Text & "' " 'seleziona
i dati dalla tabella fornitori
Set rs = CreateObject("ADODB.Recordset")
'setta rs come un record per ADO
rs.Open SQL, conn 'apre il record |
Stesso
discorso vale se vogliamo inserire una variabile. ATTENZIONE,
le variabili numeriche non necessitano degli apici. Mettiamo
caso che nazione sia numerico, scriveremo quindi:
SQL
= "SELECT nazione, cognome FROM fornitori WHERE nazione
= " & _ varnumerica
'seleziona i dati dalla tabella fornitori
Set rs = CreateObject("ADODB.Recordset")
'setta rs come un record per ADO
rs.Open SQL, conn 'apre il record |
D:
Se ho bisogno di basare la ricerca su più condizioni
come faccio?
R: L'SQL accetta gli operatori logici AND, OR, NOT,
XOR. Esempio:
SQL
= "SELECT nazione, cognome FROM fornitori WHERE nazione
= 'Italia' OR cognome = 'Cerbo' "
'seleziona i dati dalla tabella fornitori
Set rs = CreateObject("ADODB.Recordset")
'setta rs come un record per ADO
rs.Open SQL, conn
'apre il record |
D:
Come faccio a sapere se mi trovo all'inizio o alla fine
del record?
R: rs.BOF e rs.EOF restituiscono un valore booleano
(cioè TRUE o FALSE) che indicano rispettivamente se
ci troviamo all'inizio (Begin Of File) o alla fine di questo
(End Of File).
D:
Come faccio a sapere il nome dei campi di un recordset?
R: Basta usare la il metodo di rs chiamato fields ed
il suo sottometodo name. Esempio: rs.Fields(I).Name . I indica
il numero del campo da considerare. I campi vanno da 0 a N,
dove N è recuperabile tramite rs.Fields.Count.
D:
Come faccio a ottenere il nome di tutte le tabelle presenti
nel database aperto?
R: Basta utilizzare il seguente frammento di codice:
Set
rstSchema = conn.OpenSchema(adSchemaTables)
Do Until rstSchema.EOF
If Left(rstSchema!TABLE_NAME,
4) <> "MSys" Then
MsgBosx rstSchema!TABLE_NAME
End If
rstSchema.MoveNext
Loop
rstSchema.Close |
Se
togliete l'IF in arancione otterrete anche le tabelle di sistema,
cioè quelle precedute da MSys.
D:
Come faccio ad esportare in HTML la mia tabella?
R: Semplicissimo. Nel progetto dove aprite il database
create una text box (noi la chiameremo Text1) e copiate il
seguente codice:
Text1.Text
= ""
Text1.SelText = "<HTML><HEAD></HEAD><BODY>"
& vbCrLf
Text1.SelText = "<table cellspacing=""0""
border=""1"" bordercolor=""#000000""
cellpadding=""2"" style=""border-collapse:
collapse"">" & vbCrLf
campi = rs.Fields.Count
Flex1.Cols = campi
Text1.SelText = "<tr>" & vbCrLf
For I = 0 To
campi - 1
Text1.SelText = "<td bgcolor=""#C0C0C0"">"
& rs.Fields(I).Name & "</td>"
_ & vbCrLf
Next I
Text1.SelText = "</tr>" & vbCrLf
rs.MoveFirst
Do Until rs.EOF = True
J = J + 1
Text1.SelText = "<tr>" & vbCrLf
For I = 0 To
campi - 1
Text1.SelText = "<td>" & rs(rs.Fields(I).Name)
& "</td>" & vbCrLf
Next I
Text1.SelText = "</tr>" & vbCrLf
rs.MoveNext
Loop
Text1.SelText = "</table>" & vbCrLf
Text1.SelText = "</BODY></HTML>"
Clipboard.Clear
Clipboard.SetText (Text1.Text)
MsgBox "Il codice HTML è stato copiato nella
clipboard.", , "HTML Copiato!" |
Questo esempio copia anche il codice ottenuto nella clipboard
di Windows in modo da poterlo incollare subito dove
ci serve.
D: Come faccio ad aprire un database generico nella
mia applicazione?
R: Aggiungete il componente Microsoft Common Dialog
Control 6.0 . Aggiungete al vostro progetto il componente
che sarà aggiunto nella vostra barra degli strumenti.
Copiate poi il seguente codice:
cd1.Filter
= "Access Database (*.mdb)|*.mdb"
cd1.ShowOpen
Set strConn = New
ADOdb.Connection
strConn.CursorLocation = adUseClient
strConn = "Provider = Microsoft.Jet.OLEDB.4.0; Data
Source =" & _ cd1.FileName
Set conn = CreateObject("ADODB.Connection")
conn.Open strConn |
Spero
di aggiornare il tutorial di tanto in tanto, quindi se avete
domande ditemele, le aggiungerò in questa sezione del
tutorial.
|