PDA

Visualizza versione completa : Access connessione oracle


Fast-M
15-10-2004, 16.28.13
Salve a tutti! Avrei un problemino:
Ho un server oracle in locale con un database.
Dovrei creare un tool in access che si connette a questo db oracle tramite odbc e mi permette di variare il contenuto di alcune tabelle direttamente da access in modo semplice ed immediato.
Ad esempio tramite un form con alcuni text box o combo box che mi permettano di immettere il nome della tabella da modificare o visionare e i relativi campi da inserire.

Sono per ora al punto iniziale perchè non riesco a stabilire la connessione, ma ho creato un dns e ho impostato i parametri per l'accesso al db oracle usando come driver odbc for oracle.
Non riesco comunque ad accedere, perchè nella configurazione del dns stesso in origine dati, quando faccio il test per verificare la connessione con il db, mi dice che non riesce a connettersi.
Qualche aiuto?
Grazie mille in anticipo!
:)

Xtefano
15-10-2004, 17.08.09
Lavoro su Oracle dal 1994 e mi è capitato a volte di fare cose simili.
L'unico driver ODBC che non mi ha mai dato problemi è quello Oracle (se hai il database lo dovresti trovare sul CD, altrimenti da technet.oracle.com).
Una volta installato lo trovi come "Oracle ODBC Driver".
Crei un DSN (sostanzialmente devi impostare il "service name" uguale all'alias che trovi nel file TNSNAMES.ORA e UserID con l'utente da utilizzare per la connessione) e poi lo utilizzi normalmente.
E' semplicissimo creare "tabelle collegate" ed utilizzarle in Access. Talvolta mi è servito per fare da ponte tra Oracle e Office .....
Niente di più perchè su istanze con decine di migliaia di oggetti e svariate centinaia di questi con righe nell'ordine dei milioni Access va un pò in crisi .... ma per piccole applicazioncine di nicchia può risultare utile.

Se la tua necessità è semplicemente quella di modificare il contenuto di una colonna et similia ti consiglio però di fare una visitina a www.quest.com e provare TOAD (che fa anche mooooolto altro). Se vuoi esiste anche una versione gratuita (ferma alle funzioni che aveva prima che Quest la acquistasse) da ToadSoft (http://www.toadsoft.com/downld.html) .


HTH


Byez

Stefano

Fast-M
15-10-2004, 17.59.11
Grazie per le tue informazioni!
Comunque io uso già Toad su Oracle.
Oracle mi fa solo da dbms di fondo, ma praticamente non ci accedo quasi mai direttamente, ma sempre tramite Toad. Il fatto è che nel progetto attuale in cui sono ora al lavoro, dovrei creare un piccolo tool che modifica alcune tabelle di oracle che fanno da base ad un'applicativo di e-commerce realizzato in java su Struts.
Quindi poi una volta utilizzato quel driver che mi hai consigliato, da Access devo collegare le tabelle o importare direttamente tutto il db di oracle?
Cioè come conviene procedere in questi casi?
Importo tutto il db o creo in Access una istanza vuota delle tabelle su cui voglio agire in oracle e me le collego con quelle di questultimo?
Grazie di nuovo!

P.S. Ho i 3 cd di oracle 9i, ma dove trovo il driver che mi hai detto?

Xtefano
15-10-2004, 18.58.27
:wall: :wall: :wall:
Accidenti a me e alla X !! Ti avevo scritto una bella rispostina ed ho chiuso la finestra prima di premere "invia"
:wall: :wall: :wall:

Spero di non dimenticare niente .... :(



Tra importare e collegare .... c'è di mezzo il mare !!
Se importi crei su Access una copia dei dati di Oracle, aggiornandoli da Access aggiorni la copia e lasci inalterati i dati di Oracle.
Se colleghi, invece, i dati rimangono su Oracle e tu li vedi in Access come una tabella virtuale. L'aggiornamento da Access agisce direttamente sui dati in Oracle.

Non esiste quindi *un* "mi conviene", dipende da cosa devi fare.

Il driver ODBC fa parte di Oracle Client e non mi ricordo dove sta sui CD, dovrei cercarlo anche io. Forse fai prima ad andare su TechNet (http://www.oracle.com/technology/software/tech/windows/odbc/index.html) , iscriverti come sviluppatore e scaricarti quello che ti serve....


P.S.: tra 2 minuti stacco la spina fino a lunedi, non prendertela se non ti rispondo ... ;)
Buon weekend !!


HTH


Byez

Stefano

Fast-M
18-10-2004, 19.37.01
Ci sono riuscito!
Ho cambiato driver e non ho usato quello microsoft, ma controllando meglio nella lista di drivers disponibili ho trovato già quello che mi hai scritto.
Ora ho collegato solo le tabelle che mi interessano e ho creato una maschera in access con delle combo box che hanno per origine dati una select a dei campi di quelle tabelle.

Alla fine della maschera ho inserito un button a cui vorrei collegare del codice che mi permette di fare un update o un insert into(parlando in sql) delle tabelle interessate, ma non so se è meglio associargli un evento che richiama del normale codice sql oppure un pezzo di codice VB che scrivo magari tramite un modulo in access stesso??
Cioè come si fa in genere in access?
Grazie mille!

Xtefano
19-10-2004, 08.42.40
Qui mi fermo.

Mi dispiace, ma la mia conoscenza di Access rasenta lo zero. Più che fare una formina semplice o un report non mi è mai capitato.

:(


Byez

Stefano

LoryOne
19-10-2004, 09.51.11
Originariamente inviato da Fast-M
...cut... Alla fine della maschera ho inserito un button a cui vorrei collegare del codice che mi permette di fare un update o un insert into(parlando in sql) delle tabelle interessate, ma non so se è meglio associargli un evento che richiama del normale codice sql oppure un pezzo di codice VB che scrivo magari tramite un modulo in access stesso

La cosa più semplice da fare è creare una querydef ed associare il codice VBA alla pressione del tasto.
Se i combobox sono associati ad una query, per avere i dati aggiornati dopo l'esecuzione della query, normalmente si utilizza il metodo .requery dell'oggetto stesso.

Fast-M
19-10-2004, 12.16.52
Seguirò questo tuo consiglio LoryOne, anche se dovrò leggere qualcosina su access e vba, perchè non sono pratico di queste cose.
Vorrei solo impostare il lavoro per sommi capi chidendoti se ti sembra corretta questa sequenza di passi:
1-creazione delle query(di accodamento?) che aggiungono i record alle 4 tabelle in questione(sono degli insert in sql?)
2-creazione del codice in vba di access(tramite un modulo?) in cui realizzo la querydef che hai descritto sopra(temporanea o no?).
3-imposto l'evento di esecuzione di tale codice vba alla pressione del tasto della maschera.

In questo modo viene eseguito il codice vba che a sua volta esegue le 4 query, ciascuna delle quali accoda un record alla rispettiva tabella in base ai criteri che io conosco?
Ti sembra corretta come impostazione?
Grazie di nuovo!
P.S. Cosa mi consigli di leggere per realizzare quanto sopra in breve tempo ?
:)

Fast-M
19-10-2004, 13.58.37
Lavorando sul problema non mi è chiaro questo:
se nella maschera "maschera1" ho una combo box che si chiama "combo1" e il cui contenuto che è immesso dall'utente voglio che venga preso come parametro da una query che aggiungerà alla "Tabella1" un nuovo record contenente questo campo, come faccio a far comunicare la maschera con la query?
Questo è il mio problema.
Non so come creare la query in modo che prenda come parametro una proprietà di un controllo della maschera.
:(

LoryOne
19-10-2004, 15.20.25
Capisco sia un po problematica la questione ma a parte la stesura del codice VBA che imparerai piuttosto in fretta, la prima cosa da fare è interfacciarsi al DataBase ed eseguire le query in modo del tutto trasparente all'utente.

Poco importa se le tabelle sono collegate in quanto sarà compito del driver ODBC a gestire i dati e di ACCESS a fornirti i metodi per farvi accesso e modificarli a tuo piacimento.

Per default, ACCESS utilizza il motore JET per gestire le tabelle al suo interno, mentre si appoggerà ai driver ODBC qualora il formato dei dati differisca dal classico MDB
La prima cosa da fare è quella di poter interfacciarsi con il motore JET e qui devi decidere se utilizzare DAO o ADO.
In entrambi i casi ciò significa creare un riferimento alla libreria oggetto per poter accedere ai metodi ed alle proprietà in essa contenuti.

Per fare ciò devi andare nel menu strumenti e cliccare sulla voce Riferimenti.
A questo punto ricercare e selezionare la libreria oggetto specifica che preferisci tra quelle in lista.
A questo punto dovrai cominciare inevitabilmente a scrivere qualche riga di codice.
Supponendo di aver utilizzato DAO e creato un riferimento a Microsoft DAO xx Object Library dovrai inserire queste poche righe:

Dim dbs As Database
'Con dbs accedo ai metodi dell'oggetto Database incluso nella libreria di riferimento

Set dbs=CurrentDB()
'Ora dbs fa riferimento al database corrente

dbs.Execute SQLString
'SQLString è una stringa SQL (UPDATE, INSERT, SELECT, quello che vuoi)
'Il metodo Execute eseguirà la query specificata in modo trasparente all'utente.

Qualora volessi specificare impostazioni della clausola WHERE in SQL facenti riferimento a valori immessi in oggetti presenti nella maschera attiva, tali valori potranno essere ricavati attraverso NomeOggetto.Proprietà.

LoryOne
19-10-2004, 15.24.28
querydef che hai descritto sopra(temporanea o no?).


le querydefs non sono mai temporanee.
Per farvi accesso studiati anche i metodi di DoCmd nella guida di ACCESS.

Fast-M
19-10-2004, 16.08.50
Perfetto!
In questo modo posso creare per esempio 4 moduli di codice di questo tipo da far eseguire tramite un evento scatenato dalla pressione di un button della maschera e ciascun modulo di codice provvederà ad eseguire la propria stringa contenente un query che aggiungerà record alle tabelle?
Ma posso seguire la sintassi SQL per l'aggiunta di un record, tipo insert into nometabella(campo1,campo2) values(valore1,valore2) ??
Grazie!
:)

LoryOne
19-10-2004, 19.06.41
Per quanto riguarda la stringa SQL devi studiarti la sintassi ma grossomodo è quella che conosci tranne qualche piccolezza che ti sarà chiara con l'utilizzo e la pratica.

Per quanto riguarda l'utilizzo dei moduli che hai proposto, invece, ho qualche perplessità.
Il modulo in VB non è altro che un raggruppamento di procedure comuni (pubbliche) a più maschere o form e che possono essere richiamate più volte (non utilizzo "riutilizzate" perchè il termine è più adatto all'uso delle classi) da oggetti esterni.

Per similitudine, bisogna considerarli un po come le unit in Pascal oppure gli header in C.
Detto questo, a meno che tu non voglia creare più moduli suddivisi in categorie di utilizzo e contenenti procedure appartenenti allo stessa categoria, io vedrei l'impiego di un solo modulo e l'utilizzo di più pulsanti, o, addirittura, l'impiego di un solo modulo comprensivo di più procedure e di un solo pulsante.

Può darsi invece che sia necessario utilizzare più moduli ma non avendo ben chiaro in che modo tu abbia congegnato mentalmente l'applicativo, non posso dirti di più ne valutare la bontà della tua realizzazione.

Fast-M
19-10-2004, 19.49.13
Si capisco cosa scrivi. Allo stato attuale del mio lavoro sono riuscito ad associare una routine evento sulla pressione di invio nella combo box.
Nel codice ho definito una reference ad un oggetto querydef come mi hai suggerito:

Dim qd as DAO.Database
Set qd=CurrentDb()
qd.Execute= "Stringa Sql"

e poi basta semplicemente invocare il metodo Execute dell'oggetto Database per eseguire la query ?
E poi il commit sul db viene eseguito tramite il metodo close che devo invocare esplicitamente dopo la query o viene automaticamente fatto dal Jet?
Infine non ho ancora capito bene il significato della proprietà origine controllo della combobox che tra l'altro non è valorizzata in access.
Tipo Origine Riga e Origine riga mi sono chiare e la seconda è valorizzata con una select, ma origine controllo ??
:|

Fast-M
20-10-2004, 01.15.43
Sono finalmente riuscito a scrivere un valore nella tabella tramite codice vb, inviando un semplice insert into... ed ha funzionato.
Il record è stato aggiunto.
Ora l'ultimo problema è capire come potere utilizzare le funzioni sql tipo Max() e simili, perchè ho provato ad usarle nella stringa stessa e in esecuzione mi ha dato il messaggio "impossibile utilizzare funzioni di aggregazione".
Un ultimo aiutino.
:rolleyes: