Newsgroup: it.comp.appl.access
Titolo: Lavorare con più database - currentdb - (Automazione Word-Access) [lungo]

Come qualcuno sa, stò cercando di realizzare delle funzioni in Word che
accedano ai miei database di Access estraendo o scrivendo dati, lo scambio
deve essere bidirezionale insomma. Inoltre le funzioni non partono da Access
ma sono associate a dei pulsanti della barra strumenti di Word.
A tal proposito Namor 2 giorni fa mi scrisse:
----------------------------------------------
Riporto un piccolo esempio che funziona da word previo riferimento alla
libreria MS Access, ed inserisce dati via SQL in una tabella:
Sub ToAcess()
Dim Acc As Access.Application
    Set Acc = GetObject(, "Access.application")
    Acc.CurrentDb.Execute "INSERT INTO TblProva (CampoTxt, CampoLng) " & _
                          "VALUES (""da Word"", 999);"
    Set Acc = Nothing
End Sub
Qui si suppone che il db su cui lavorare sia già aperto. Se ce n'è aperto
più di uno è da verificare quale prende.
Se vuoi manipolare forms sarà leggermente più complicato ma penso che si
possa fare.
----------------------------------------------
Partendo da li e studia studia studia ho scritto due funzioni che da Word
rispettivamente scrivono e leggono nel/dal database di Access.
Devo dire che la cosa è più facile di quel che pensassi, anche se per fare
queste due semplici cose ho trascurato lavoro, moglie e figli, ma ce l'ho
fatta !
Ora i problemi e gli errori nascono talvolta dal fatto di avere già un
database aperto, sia il database cui io voglio accedere, sia un altro
database access qualsiasi.
Ho impostato dei controlli per verificare se il mio database è aperto e
sembra funzionare, ma con una logica che non capisco a volte mi si crea
l'errore database già aperto. Altre volte, nelle stesse identiche condizioni
l'errore non viene generato. Da impazzire.
Forse si tratta di lavorare con  il currentdb, ma dall'help apprendo che è
in sola lettura, quindi se non sbaglio posso solo estrarre il nome del
database corrente, ma come scelgo quello che IO voglio come corrente ?
In realtà credo che la cosa sia ancora più complicata ... se proprio non
riesco a risolvere potrei anche decidere che quando attivo queste funzioni
verifico se c'e' una istanza qualsiasi di Access aperta e COMUNQUE la
chiudo. Ma non lo so fare. E comunque non sarebbe mica tanto elegante eh ?
Anzi farebbe quasi schifo ...
Di seguito metto il codice che ho "scritto", mi si perdonino le ingenuità e
la non-normalizzazione.
Questa "cosa" è associata ad un pulsante della mia barra strumenti di
word ed esegue la copia della selezione attiva (nella fattiscpecie l'oggetto
del documento) e la incolla nel campo "oggetto" del database "protocol.mdb"
nella maschera "nuovoprotocollo".
Fa alcuni controlli, e funzionano, ma alcune volte da l'errore 7867 -
"Database già aperto" sulla riga     "oAcc.OpenCurrentDatabase path"
Altre volte (sempre con lo stesso altro database aperto) non lo da.
Se qualcuno ha voglia di darci un'occhiata o darmi qualche dritta... lo
ringrazio in anticipo.
Sub Macro1()
'Siccome deve copiare del testo da Word in Access verifica che ci sia una
selezione attiva
If Selection.Type = wdSelectionIP Then
    MsgBox "Per procedere deve essere selezionato del testo"
    Exit Sub
End If
' quindi copia la selezione attiva
    Selection.Copy
    Dim oAcc As Access.Application
    Dim path As String
    Dim dato As String
    path = "c:\dbase\Protocol.mdb"
    Set oAcc = CreateObject("Access.Application")
    Set oAcc = Access.Application
'Verifica che il Dbase Protocollo non sia già aperto:
If Dir("C:\dbase\protocol.ldb", vbDirectory) <> "" Then
    If oAcc.CurrentProject.AllForms("nuovoprotocollo").IsLoaded Then
    MsgBox "La maschera del protocollo è aperta. Salvare il lavoro in corso,
chiudere e riprovare.", vbApplicationModal + vbOKOnly + vbExclamation
    Exit Sub
    Else
    oAcc.DoCmd.Close
    'apre il form in modalità acformadd ossia possono solo essere inseriti
nuovi record
    oAcc.DoCmd.OpenForm "nuovoprotocollo", , , , acFormAdd
    End If
Else
    'apre il database
    oAcc.OpenCurrentDatabase path
    'chiude la form aperta di default su avvio
    oAcc.DoCmd.Close
    'apre il form in modalità acformadd ossia possono solo essere inseriti
nuovi record
    oAcc.DoCmd.OpenForm "nuovoprotocollo", , , , acFormAdd
End If
    'fa il set focus sul controllo "telefono"
    oAcc.Forms!nuovoprotocollo!oggetto.Visible = True
    oAcc.Forms!nuovoprotocollo!oggetto.SetFocus
    'fa il paste
    oAcc.DoCmd.RunCommand acCmdPaste
End Sub


La cosa che posso dirti da subito è che manca la gestione dell'errore e se 
ne capita qualcuno tutti gli oggetti sono già "attivi" mandandoti in palla, 
una volta rieseguito, il codice.
Quindi implementa prima una ottima gestione degli errori e poi riguardiamo 
il codice...
Ciao.
-- 
Sergio MAZZA 

 il codice...
Sergio hai ragione. Minchia !
Ma per esempio cosa gli faccio fare quando si genera l'errore ?
In qualche esempio che ho trovato ho anche visto gestire l'errore per capire 
se una maschera fosse già aperta, ma nel mio caso che gli faccio fare ?
Basta mettere un semplice:
On Error GoTo Err_Comando0_Click
...
...
...
Exit_Comando0_Click:
    Exit Sub
Err_Comando0_Click:
    MsgBox Err.Description
    Resume Exit_Comando0_Click
per eliminare gli oggetti zombie ?
Rick 

 Err_Comando0_Click:
    Set oggetto = nothing
    MsgBox err.number & ", " & Application.AccessError(Err.number)
Ciao.
-- 
Sergio MAZZA 

"Sergio MAZZA" ha scritto
----------------------------------------------------
On Error GoTo Err_Comando0_Click
Dim oggetto as Object
 ...
 ...
 ...
 Set oggetto = nothing
Exit Sub
Err_Comando0_Click:
Set oggetto = nothing
MsgBox err.number & ", " & Application.AccessError(Err.number)
----------------------------------------------------
Ok, chiarissimo ! Ti ringrazio.
Ma dici che i miei problemi possono dipendere da quel "nothing" mancante 
alla chiusura che incasinava le istanze successive ?
Dopo comunque farò un po' di prove ...
Rick 


La non distruzione (=nothing) degli oggetti comporta un aumento di richiesta 
delle risorse. Comunque, posso dirti che quando provavo con OLE a fare una 
stampa unione e non utilizzavo la gestione degli errori mi si accavallavano 
le sessioni aperte sia di word che access e chiaramente tutte nascoste!!
Facci sapere...
-- 
Sergio MAZZA