indietro

UN'ALTRA PROCEDURA DI IMPORTAZIONE DATI

Le procedure che vedremo in questa pagina sono leggermente diverse rispetto a quelle viste nell'esempio precedente, ma come quelle, anche queste si basano su una Query per il reperimento e l'importazione dei dati.

L'importanza di questo tipo di procedure è rappresentato dal fatto che qui, usando il metodo CreateQueryDef unito al Workspaces, rendiamo "permanenti" le query create. Questo ci consente di renderle disponibili per altri processi compreso altre query. Non so quanti "pellegrini" usino una cartella di Excel sfruttandone molti fogli, ma se per esempio si creasse una prima importazione di dati sul foglio1, un'altra diversa interrogazione importata sul foglio2, e si salvassero le query nel database rendendole permanenti, sarebbe possibile importare sul foglio3 tramite una nuova query i dati contenuti in una o nelle due query salvate, che essendo già formate da dati "filtrati", fornirebbero una ulteriore "filtrazione" più mirata e veloce. Le Query "permanenti" non restano immutabili, ma possono essere di nuovo ricreate variando uno o più dei criteri usati nell'istruzione vera e propria, estraendo quindi nuovi dati che potranno poi essere usati a valle tramite altre query che mirino a lei. Chi non conosce l'uso delle query, non può rendersi conto della loro importanza e della molteplicità di risultati ottenibili nella gestione dei database e quindi nei lavori in Excel che prendono dati da questi database.

Le istruzioni che seguono sono simili all'esempio precedente, quindi in questo caso evidenzierò solo le differenze in rosso, aggiungendo solo i commenti necessari, oltre ad avvisare che facciamo uso di un Controllo Errori:

Sub Importadue()

On Error Resume Next

'come si nota sotto, usiamo altri nomi o sigle, ma dichiariamo il "tipo" di ogni variabile; 'cambia comunque il modo di accedere sia al database (db) sia per la presenza del tipo 'QueryDef (Definizione di una Query) non usata nel precedente esempio. Questa è l'impostazione che ci consente di 'creare una query "residente"
Dim db As Database, myq As QueryDef, myset As Recordset, CellaAtt As Range

'sotto: settiamo la variabile db impostando il percorso dove risiede il database usando 'l'oggetto Workspaces(0) (in veramente due parole, diciamo che con Workspaces manipoliamo il database, permettendo l'inserimento di una nuova query) e col metodo 'OpenDatabase
Set db = Workspaces(0).OpenDatabase("C:\Progetti\Contabilita\contab.mdb")

Set CellaAtt = ActiveCell
CellaAtt = "ciccia"
CellaAtt.Offset(0, 1) = "verdura"
CellaAtt.Offset(0, 2) = "crema"

'sotto: quando creiamo una nuova query residente nel database di origine, e lo facciamo 'una unica volta, questa riga non sarebbe necessaria. ma visto che potremo rilanciare di 'nuovo la routine perchè magari, come anticipato, vogliamo cambiare un parametro (un 'campo), poichè nella creazione della query DOBBIAMO assegnare un nome (pippo), se 'nel ripetere la macro la procedura riscontra la presenza nel database di una query già 'chiamata pippo, si genera un errore di run-time e si interrompe il tutto. Ecco perchè è 'necessario inserire a inizio e fine routine un controllo errori, e sfruttando l'errore che si 'genererà inevitabilmente, con questa riga diciamo: se il numero dell'errore di runtime è 'uguale al 3012, allora cancelliamo (Delete) la query esistente pippo in modo che 'l'istruzione della riga sotto possa ricrearne una nuova con lo stesso nome.
If Err.Number = 3012 Then db.QueryDefs.Delete ("pippo")

'e questa sotto è l'istruzione che setta la variabile myq richiamando il database (db) e 'facendogli creare una query residente, con CreateQueryDef . E NECESSARIO definire 'un nome per identificare la query e il nome va posto tra doppi apici, seguito dalla virgola 'e tra due doppi apici andrà scritta l'istruzione della query: questa istruzione dice: seleziona '(tutti) i record dei campi ciccia, verdura, crema dalla tabella prova.
Set myq = db.CreateQueryDef("pippo", "SELECT ciccia, verdura, crema from prova;")
'assegnazione alla variabile myset della query "pippo". seguono commenti come esempio 'precedente
Set myset = db.OpenRecordset("pippo")
While Not myset.EOF
i = i + 1
CellaAtt.Offset(i) = myset.Fields(0)
CellaAtt.Offset(i, 1) = myset.Fields(1)
CellaAtt.Offset(i, 2) = myset.Fields(2)
myset.movenext
Wend
myset.Close: db.Close
 

Resume
End Sub

Abbiamo visto due esempi che consentiranno a chi vorrà cimentarsi in queste procedure di potersi destreggiare senza grossi problemi, almeno seguendo i suggerimenti e i commenti inseriti, nel realizzare dei colleganti ai propri database. Ovviamente gli argomenti trattati sono un pò come le ciliege : una tira l'altra, sarà quindi opportuno sviluppare a casa propria le conoscenze necessarie per migliorare la padronanza sull'argomento.

Buon lavoro.

prelevato sul sito http://ennius.interfree.it