Connettersi ad un database (mdb) ed estrarre dati importandoli su un foglio di Excel. - pagina vista: volte Difficoltà : medio -alta Sul sito ennius.interfree.it ho già pubblicato una serie di articoli che trattano l'argomento "Connettersi ad un database", e li trovate riuniti nell'articolo "Database esterni (mdb)". L'utilità di questi esercizi è evidente: connettersi ad un database per "importare" (dati presenti sul database) in fogli di lavoro di Excel. Comunque prima di iniziare, è opportuno ricordare che per poter lavorare con Connessioni DAO, è necessario, dal menù "Strumenti/Riferimenti/Riferimenti disponibili" (dal Visual Basic Editor) mettere un segno di spunta alla voce "Microsoft DAO 3.6 Object Library" (o altra versione disponibile sul proprio computer), altrimenti non si attiverà la connessione al database. L'importazione di dati è uno "sport" che svolgono in molti, e in questo articolo non ripeterò cose che "pellegrini sportivi" già conoscono, o sono contenute in spiegazioni contenute nell'articolo succitato, ma vorrei mostrare come rendere "variabile" l'importazione di dati: credo che le procedure e le spiegazioni che presento, potranno aiutare a diversificare una "connessione" rendendo veramente versatile l'estrazione e l'utilizzo di dati contenuti in un database. Al di là delle procedure da seguire e delle istruzioni da compilare per ottenere una connessione, l'importazione dei dati è poi affidata ad una Query di selezione, che altro non è che un'istruzione scritta in linguaggio SQL, con la quale decidiamo "cosa importare" e da quale "tabella" contenuta nel database al quale ci siamo connessi. Sappiamo che in un database di tipo Access (.mdb), i dati sono contenuti in una o più tabelle (e/o Query residenti), e che questi dati all'interno di ogni tabella, sono organizzati in "campi" (colonne) e "records" (righe): una "Query di selezione" in genere viene inserita direttamente nelle istruzioni per l'importazione di dati, rendendo di fatto ripetitiva la Query, la quale eventualmente importerà nuovi dati inseriti nel database di origine, ma sempre quello; ciò che faremo sarà invece:
Sarà quindi possibile decidere da quale tabella importare i dati, e quali campi di questa tabella scegliere per importare i dati, questo ci consentirà di modificare la Query di selezione, importando di volta in volta dati diversi, provenienti da tabelle e campi diversi. Per questo esercizio ho usato il database northwind.mdb, in genere installato, come esempio di database, sui computer al momento dell'installazione di Access, ma potrete tranquillamente usare un qualsiasi vostro database mdb; sarà poi necessario indicare nelle istruzioni di connessione, il percorso completo che mira al file; io per questa occasione l'ho posto in : C:\Temp\northwind.mdb, ed ho poi usato una cella del foglio di lavoro dove ho scritto il percorso completo. Useremo questa cella come riferimento al database nelle istruzioni di connessione. Ho predisposto 3 ListBox su una UserForm che chiameremo da un pulsante posto sul foglio; all'apertura della UserForm (evento Activate), facciamo caricare nella ListBox 1 col metodo AddItem, tutti i nomi delle tabelle contenute nel database; sfruttando poi l'evento ListBox1_Click, faremo caricare nella ListBox 2 tutti i nomi dei campi contenuti nella tabella che avremo selezionato nella ListBox1. Avremo a questo punto sott'occhio lo schema della tabella scelta, e a questo punto potremo scegliere due strade:
Vediamo un'immagine della UserForm, con i tre passaggi: abbiamo scelto la tabella Clienti, nella ListBox2 vediamo i campi relativi alla tabella selezionata, ed abbiamo infine scelto solo i campi che vediamo nella ListBox3, selezionandoli nella ListBox2. Ora dovremo premere il pulsante "Predisponi Campi sul Foglio" prima di usare il pulante "Componi la Query": Passiamo ora ad esaminare la prima parte delle routines, quelle relative al caricamento delle ListBox. Parleremo poi di come comporre le Query, argomento che riveste particolare attenzione nel contesto di questo esercizio. Istruzioni per caricare le tabelle del database all'apertura della UserForm:
Tanto per capire cosa si intende per Td.Attributes e dbSystemObject, se si eliminasse la condizione impostata, ci troveremmo anche con tutte le tabelle bordate in rosso nell'immagine sottostante, tabelle che potrebbero generare confusione e che all'utente sicuramente non servono, contenendo solo dati di gestione del database da parte di Access: continuiamo con le routine prima parte: Istruzioni per visualizzare nella ListBox2 i "Campi" contenuti nella tabella che selezioneremo nella ListBox1:
Una volta che avremo il nome dei campi nella ListBox2, decideremo cosa vogliamo "estrarre", se tutti i campi, o solo alcuni; in questa seconda ipotesi useremo ancora l'evento Click ma della ListBox2, per trasferire il nome dei campi scelti nella ListBox3, vediamo quindi le istruzioni che sono molto semplici: Istruzioni per visualizzare nella ListBox3 i "Campi" che selezioneremo nella ListBox2:
Queste tre routines hanno il preciso scopo di permetterci di trasferire su una riga che avremo scelto, il nome dei campi da cui vogliamo importare i dati, (io ho usato la riga 7 a partire dalla A7 e fino alla Z7) attraverso uno dei due pulsanti predisposti sulla UserForm. Vediamo le routines inserite nell'evento Click dei CommandButton: Pulsante "Predisponi tutti i campi^". - questo pulsante va usato se vorremo estrarre tutti i campi, e dovremo aver selezionato prima una tabella nella ListBox1:
Pulsante "Predisponi Campi sul Foglio". - pulsante usato per trasferire i nomi dei campi presenti nella ListBox3, ottenuti per selezione da tutti i campi presenti nella ListBox2:
Pulsante "Componi la Query" - pulsante per chiamare la InputBox dove comporre la Query. Eseguo un controllo per assicurarci di non aver dimenticato di premere uno o l'altro dei pulsanti visti sopra:
L'intervallo A7:Z7, è l'intervallo che serve alle istruzioni per l'estrazione dati, dove verranno letti il nome dei campi da cui estrarre i dati, in funzione della Query di selezione che predisporremo, e che dovrà agire sullo stesso numero di campi che scriveremo nella Query. In genere, nelle istruzioni di connessione in DAO, per importare i dati sul foglio di lavoro, si usa un ciclo che scorra tutti i campi della tabella del database, e per ogni campo letto, dobbiamo indicare da quale cella del foglio di lavoro iniziare ad importare i dati, scalando di colonna, per tanti campi quanti ne stiamo importando; è in queste istruzioni che dobbiamo indicare che il riferimento alla cella(x, y) sarà uguale al (campo)Fields(numeroindice) della tabella, e ovviamente, se dovessimo importare 5 campi, dovremmo indicare 5 celle(x, y) indicando per ognuna il Fields(numeroindice) relativo. Useremo invece, per la connessione di importazione il metodo basato su ADO dove, anzichè indicare il numero indice del Field da importare, il suo nome: cioè il nome del campo. In questo esercizio, dove i campi diventano variabili di volta in volta, non possiamo usare istruzioni preimpostate nel codice, infatti non sapremo a priori da quale tabella e quali campi vogliamo importare, quindi abbiamo bisogno di far leggere da un secondo ciclo, il nome del campo (che verrà letto nell'intervallo A7:Z7, e che otterremo da ciò che faremo con le ListBox nella UserForm)), e usare il nome del campo per identificare lo stesso campo nella tabella del database ed importarne i dati. Sembra complicato ma in realtà è semplice. Le Query. Il compito di far estrarre i dati da un database, è affidato ad una Query di selezione; possiamo dividere le Query di selezione in due gruppi:
"Select * From Clienti" - Seleziona tutto (*) (quindi tutti i campi) dalla (From) tabella (sottintesa) Clienti
"Select * From Clienti Where Città between 'C' And
'D' " - Seleziona tutto (*) (tutti i campi) dalla tabella
"Select IDCliente, NomeSocietà, Indirizzo,
Città, CAP, Paese From Clienti" - Seleziona
solo i campi
"Select IDCliente, NomeSocietà, Indirizzo,
Città, CAP, Paese From Clienti where Paese = 'Italia' " Esistono molti modi di comporre le Query, compreso le Query di giunzione (Join) in cui è possibile estrarre dati da più tabelle contemporaneamente, ed altre, ma non è questa la sede per tenere un corso specifico sulle Query; ciò che credo vada invece puntualizzato (almeno nelle parole più frequenti) è la sintassi da usare nel comporre una Query, seguiamo uno specchietto:
due accorgimenti ancora; in queste Query, in particolare scrivendo la query in una InputBox come nell'esempio che faremo, la sintassi prevede che:
Continuando invece le spiegazioni, vediamo come fare per ottenere la nostra Query. Esistono diversi modi, ad esempio scrivere la Query in una cella del foglio di lavoro, ed assegnare il riferimento alla cella ad una variabile (Miaquery) che useremo nelle istruzioni di collegamento; oppure predisporre in una zona del Foglio (o altro Foglio) una serie di query preimpostate da noi, il cui intervallo venga poi assegnato al RowSource di una ComboBox che avremo inserito sulla userform, dove, una volta scelta la tabella e i campi da estrarre, ci consenta di selezionare nella ComboBox stessa, la Query più appropriata. Io nell'esercizio, tramite il pulsante "Componi la Query", richiamo una InputBox nella quale scriveremo la nostra Query. Saremo avvantaggiati dalla presenza dei campi scelti e visibili nella ListBox3, che ci ricorderanno i campi da scrivere nella query per comporla. Nella InputBox non avremo bisogno di iniziare e chiudere la Query con doppi apici in quanto assegneremo ciò che scriveremo ad una variabile stringa (vista quindi dal codice già tra doppi apici). Useremo dimensionare come Public questa variabile, in modo che sia vista in tutto il progetto; posizioneremo quindi questa variabile nella zona "Dichiarazioni - Generale" del modulo che useremo per scrivere le istruzioni di connessione; questo farà si che sia visibile in tutto il progetto (se avessimo usato la sezione Dichiarazioni - Generale della UserForm, la visibilità della variabile sarebbe stata limitata alla sola UserForm). Scriveremo quindi: Public Miaquery As String Dopo che avremo scritto la Query e premuto il pulsante OK della InputBox, ci troveremo sul foglio pronti a premere il pulsante "Estrai Dati dal Dbase". Ho diviso in due azioni questo esercizio, anche se è possibile creare un'unica sequenza di istruzioni, azionabile con un solo pulsante; ritengo che così sia meglio "digerire" i diversi passaggi, tra quelli visti fin'ora, e quelli che seguono. Per questa connessione al database, anzichè sfruttare l'apertura in DAO, basato sull' OpenDatabase del DBEngine, useremo l'apertura in ADO, basato sull'oggetto Connection, da cui dipende l'oggetto Recordset, che a sua volta è composto di Fields, in cui stanno l'insieme di oggetti Field. Queste poche premesse solo per evidenziare la diversità di connessione al database usate con le precedenti routine, e quella che vedremo ora. Potrete scaricare un file di esempio, ma suggerirei di stamparvi questa pagina, per "ricucire" con calma, le spiegazioni fornite. Questa sarà la pagina del Foglio1, con i pulsanti per chiamare la UserForm e poi per connettersi ed importare dati. La riga 7 (verde) è la riga dove verranno copiati i nomi dei campi scelti: e queste le istruzioni da inserire in un modulo standard: nella sezione "Generale - Dichiarazioni" scriveremo:
e questa la routine di connessione:
Ricordarsi di scrivere l'esatto percorso che mira al vostro database, comprensivo di path; io l'ho scritto nella cella B2, ma sarà possibile munire il progetto di routine per la ricerca dei file, con assegnazione alla variabile NomeDB del nome del database (da rendere in questo caso come variabile Pubblica), in modo da diversificare anche il database sul quale operare; ma per questo esercizio esistono diversi articoli sui due siti. Buon lavoro. File consultabile e scaricabile:
prelevato sul sito www.ennius.altervista.org |