|
Può
risultare utile dover utilizzare la stessa query per più
database (ad esempio per sincronizzarli) o per qualsiasi altro
motivo e visualizzarne il risultato. Nel corso di quest'articolo
si vedrà come lanciare una query da Visual Basic senza
dover utilizzare macro o oggetti all'infuori di quelli della
libreria di Access.
Come nel caso di Word e di Excel per avere il controllo completo
degli oggetti Access è necessario importare nel progetto
la libreria corrispondente. In questo caso perciò si
dovrà selezionare Progetto dal menu principale, scegliere
l'opzione Riferimenti e dalla finestra che apparirà
spuntare la voce Microsoft Access X.0 Object Library, come
mostrato dalla figura sottostante.
Il
primo passo da compiere consiste nel dichiarare e definire
l'applicazione Access. La dichiarazione (da inserire nel gruppo
delle dichiarazioni generali del form) corrisponde a:
| Dim
appAccess As Access.Application |
Mentre
la definizione va inclusa in una routine (ad esempio Form_Load
in modo che la creazione dell'oggetto sia eseguita una volta
per tutte all'apertura dell'applicazione) ed è la seguente:
| Set
appAccess = CreateObject("Access.Application") |
Siccome
la query può essere lanciata all'interno di un qualsiasi
database, la scelta ottimale impone di trasportare sul piano
una TextBox (Text1) nella quale inserire il percorso del database
Access prescelto, una seconda TextBox (Text2) nella quale
inserire il testo della query ed un pulsante (Command1) che
permette di avviare la query.
Tutte le modifiche ulteriori (selezione tramite CommonDialog
dei database presenti sul disco, inserimento di label associate
a ciascun controllo, validazione del contenuto delle caselle
di testo eccetera) non sono che abbellimenti della struttura
principale del progetto.
Progetto che dal punto di vista grafico si dovrebbe presentare
più o meno in questo modo:
Alla
pressione del pulsante Command1 pertanto si dovrà innanzitutto
aprire il database selezionato in Text1. Il codice da utilizzare
è pertanto il seguente:
Private
Sub Command1_Click()
appAccess.OpenCurrentDatabase Text1.Text
'...
End Sub |
Anche
in questo caso, come negli articoli precedenti verrà
utilizzato il database comune FPNWIND.mdb, che si trova ovviamente
nella cartella C:\Programmi\Microsoft Office\Office\1040\.
Siccome risulta particolarmente scomodo e controproducente
visualizzare il database prima della creazione della tabella
dei risultati della query se ne impedirà la visualizzazione
tramite l'aggiunta della seguente riga di codice:
| appAccess.Visible
= False |
E
per arrivare all'argomento principale dell'articolo, si vedrà
adesso come lanciare la query: attraverso l'oggetto DoCmd
che come in VBA ha lo scopo di eseguire differenti azioni.
La riga di codice in analisi è la seguente:
Prima
di inserire tale codice c'è però bisogno di
una precisazione. La riga qui sopra creerà dei risultati
non visualizzabili. Per ovviare al problema basta utilizzare
un SELECT
INTO con il nome della tabella temporanea che
verrà creata e che mostrerà tutti i risultati
della query.
Una volta compreso questo meccanismo bisogna fare in modo
da poterlo utilizzare in ogni caso, senza possibilità
di errore, anche nel caso in cui l'utente lanci una query
del tipo:
invece
di una più corretta (corretta limitatamente al caso
in esame):
| SELECT
* INTO NuovaTabella FROM Clienti; |
La
soluzione al problema risiede in una banale concatenazione
di stringhe. Se si suppone cioè che le parole "INTO
NuovaTabella" vadano sempre prima di FROM si può
scrivere:
MtrFROM
= Split(Text2.Text, "FROM")
query = MtrFROM(0) & " INTO NuovaTabella FROM
" & MtrFROM(1) |
Naturalmente
per le query più complesse potrebbero essere necessari
accorgimenti ulteriori.
Successivamente si può aggiungere il codice che lancia
la query visualizzando la tabella denominata NuovaTabella:
DoCmd.RunSQL
query
DoCmd.OpenTable "NuovaTabella"
appAccess.Visible = True |
Così,
attraverso la compilazione di tutti i campi della tabella
e la pressione del pulsante come mostrato in figura:
Si
dovrebbe visualizzare il risultato sperato.
Può
capitare in fase di visualizzazione dei risultati di ottenere
una tabella risultante ridotta alle sole dimensioni della
barra del titolo. Per superare il problema si può comandare
a tale tabella di espandersi al massimo aggiungendo la seguente
riga di codice:
E
nel caso in cui la tabella NuovaTabella non venisse considerata
da Access come temporanea e quindi persistesse anche dopo
la chiusura del programma, la si può eliminare in qualsiasi
punto dell'applicazione attraverso:
| DoCmd.DeleteObject
acTable, "NuovaTabella" |
Per
concludere si sperimenteranno I risultati ottenuti dalla stessa
query eseguita prima internamente ad Access, come consuetudine,
ed in seguito utilizzando l'applicazione esterna appena analizzata.
A tale scopo si consideri la seguente query:
SELECT
Prodotti.Nome_prodotto, Fornitori.Nome_societa, Prodotti.Prezzo_unitario
FROM Fornitori LEFT JOIN Prodotti ON Fornitori.ID_fornitore
= Prodotti.IDFornitore
WHERE (((Prodotti.Prezzo_unitario)<20000)); |
che
non fa altro che visualizzare i prodotti, associati ai fornitori
relativi ed ai prezzi unitari, il cui prezzo sia inferiore
a L.20000.
Il risultato è una tabella di 20 elementi come mostrato
qui sotto:
Riscrivendo
nell'applicazione appena costruita la stessa query ossia:
(ricordarsi
di settare la proprietà Multiline di Text2 su True
per non perdere un pezzo di query), si otterrà come
risultato:
cioè
gli stessi identici dati in una tabella non perfettamente
formattata (la larghezza delle colonne non tiene conto della
lunghezza dei dati che contengono, a meno che non si imposti
esplicitamente).
|