Sincronizza Indice |
Scarica il progetto |
Testo dell'articolo |
Stampa l'articolo |
( Articolo temporaneo in attesa di essere trasferito ad altra sezione ) Un problema che affligge parecchi programmatori è quello di far comunicare un programma scritto in Visual Basic con un AS/400, richiedere l'esportazione di certi dati dal server e reimportarli, ad esempio, in un foglio Excel per semplificarne l'utilizzo sul lato client. In questo articolo sarà spiegato come stabilire una connessione
all'AS/400 utilizzando il driver ODBC
fornito con IBM Client Access e Client Access Express.
L'accesso al foglio Excel richiede l'aggiunta di un riferimento alla Microsoft Excel 8.0 Object Library (EXCEL8.OLB) in caso di Excel 97 e Microsoft Excel 9.0 Object Library (EXCEL9.OLB) in caso di Excel 2000. La cartella Excel si chiamerà CARTEL1.XLS e sarà contenuta nella cartella del programma. Nel nostro esempio il server si chiama AS400 ed i dati da estrarre sono contenuti nella tabella NOMINATIVI contenuta nel database posto sull'AS/400 nella libreria CLIENTI. L'utente che accederà al server si chiamerà UTENTE e la password associata sarà PASSWORD. Il DSN utilizzato sarà chiamato DSNAS400 ed utilizzerà il driver Client Access ODBC Driver (32-bit). La prima delle due soluzioni utilizza il modello dati più vecchio: Data Access Object (DAO) ed a tal scopo è necessario aggiungere un riferimento alla libreria Microsoft DAO x.xx Object Library (DAOxx.DLL). Questa soluzione è necessaria se si utilizza Microsoft Excel 97. Vediamo il codice del progetto:
La routine che estrae i dati e li inserisce nel foglio Excel è chiamata EstraiDati e riceve due argomenti: strSQL è una stringa SQL, utilizzata per estrarre tutta o parte di una o più tabelle; strWbk indica invece il percorso della cartella Excel. La funzione utilizza parecchi riferimenti ad oggetti: wrkODBC
è l'area di lavoro ODBCDirect, conn è la connessione
basata sull'area di lavoro, mentre rs è il Recordset
che conterrà i dati.
La prima operazione da eseguire sarà quella di stabilire la connessione alla fonte dati ODBC mediante DSN, ma prima di poter accedere ad una qualsiasi fonte dati ODBC è necessario creare un'area di lavoro ODBCDirect; in seguito sarà aperta la connessione ed estratti i dati da essa. Alla riga 9 è creato una nuova area di lavoro (Workspace) di nome ODBCAS400, ma il nome poteva essere qualunque altro valore; il proprietario dell'area di lavoro è UTENTE ed utilizza la password PASSWORD per accedere alle fonti dati. L'ultimo parametro dbUseODBC specifica che il Workspace da creare è di tipo ODBCDirect, opposto al tipo standard Jet. La nuova area di lavoro è quindi contenuta nella variabile oggetto wrkODBC. Alla riga successiva è avviata la connessione al server; il nome della connessione è Conn1 ma ciò non è rilevante al nostro scopo; il secondo argomento dbDriverComplete specifica che nel caso venissero forniti i parametri di connessione errati, sarà proposta la finestra di accesso del driver utilizzato. Il valore è contenuto nell'enumerazione DriverPromptEnum e può assumere uno dei seguenti valori:
Il terzo argomento consente di specificare un valore che indica se la connessione è effettuata in modalità sola lettura oppure siano consentite le modifiche. Il valore è ignorato in questo articolo.
L'ultimo argomento della funzione OpenConnection specifica la stringa di connessione da utilizzare per accedere alla fonte dati. Il primo valore (ODBC) specifica il driver da utilizzare e nel nostro caso fa riferimento all'insieme dei DSN; le informazioni che seguono indicano il nome del DSN (DSNAS400) ed il database utilizzato (AS400.CLIENTI). Non sono stati volutamente specificati nome utente e password perché tali valori saranno quindi ereditati dall'oggetto Workspace. In caso contrario sarebbe stato necessario specificare UID=UTENTE;PWD=PASSWORD. Infine alla riga 11 sarà recuperato il Recordset con i dati desiderati dalla connessione conn. I dati da recuperare dipendono dalla variabile strSQL.
Alla riga 13 è richiamata l'applicazione Excel cosicché l'oggetto xlApp faccia riferimento alla nuova istanza di Microsoft Excel. In sequenza l'applicazione è mostrata, viene aperta la cartella di lavoro specificata nell'argomento di funzione strWbk, è scelto il primo foglio ed a questo viene aggiunta una nuova QueryTable contenente il Recordset rs, alla posizione A1 del foglio di lavoro. Il Refresh alla riga 21 fa sì che i dati della QueryTable siano riportati nel foglio di lavoro.
Segue infine la fase di chiusura e pulizia della memoria. Tutti gli oggetti aperti sono chiusi e deallocati. La cartella di lavoro Excel prima della chiusura viene salvata (riga 23). La seconda soluzione utilizza invece il nuovo modello dati: ActiveX Data Objects (ADO) e stabilire una connessione risulta ben più semplice. A tal scopo è necessario aggiungere un riferimento a Microsoft ActiveX Data Objects 2.x Library (MSADO15.DLL). Questa soluzione è necessaria se si utilizza Microsoft Excel 2000/XP. La stessa routine EstraiDati può essere riscritta come segue:
Rispetto la versione precedente è stato eliminato l'oggetto Workspace, mentre gli oggetti conn e rs cambiano la loro libreria da DAO ad ADODB. Sono mantenuti intatti i riferimenti agli oggetti Excel.
Alla riga 8 e 10 sono allocati rispettivamente una nuova connessione ed un nuovo Recordset. La connessione al DSN è aperta alla riga 9: tutto ciò che è necessario fornire è il nome del DSN, l'utente e la sua password associata; il nome del database a cui collegarsi è necessario solo se si utilizza un database differente da quello predefinito per l'utente.
Prima di poter estrarre i dati tramite Recordset è fondamentale cambiare la posizione del cursore dati da server a client. In caso contrario si genererà un errore (vedi l'articolo Q263498 della Microsoft Knowledge Base). La riga 12 richiama il metodo Open del Recordset con numerose informazioni: il primo argomento specifica la query SQL utilizzata per estrarre i dati; il secondo argomento è indica la connessione cui l'oggetto rs fa riferimento; il terzo argomento specifica il tipo di cursore dati da utilizzare; l'ultimo argomento specifica invece il tipo di blocco da attivare. Si rimanda alla Sezione Database per un'approfondimento di questi concetti.
Il segmento di codice per l'automazione di Microsoft Excel è identico a quello utilizzato nella soluzione precedente. Si vuole soltanto sottolineare che il metodo Add dell'insieme QueryTables richiede il passaggio di un oggetto Recordset, così come la soluzione precedente. La differenza sta nella classe di questo oggetto: sono rifiutati i Recordset DAO ma sono ammessi soltanto quelli di tipo ADODB.
Segue la chiusura e la deallocazione di tutti gli oggetti utilizzati. La cartella di lavoro è salvata prima di chiudere l'istanza xlApp di Microsoft Excel. La routine per l'esportazione dei dati può essere richiamata con una semplice riga: EstraiDati "SELECT * FROM NOMINATIVI",
App.Path & "\CARTEL1.XLS" |
La possibilità di automatizzare Microsoft Excel e recuperare fonti dati remote per utilizzarle con uno strumento esterno può semplificare numerosi problemi. Fibia
FBI e Marco Rubaltelli
|
Torna all'indice degli HowTo |