Newsgroup: it.comp.appl.access
Titolo: verificare e chiudere un database se aperto

Salve a tutti, il mio problema è il seguente...
da un database aperto ad un certo punto ne voglio aprire un altro e chiudere quello aperto. questo è il codice che uso su un pulsante di comando...
 
Shell SysCmd(acSysCmdAccessDir) & "MSAccess.exe D:\Programma\aps.mde", vbNormalFocus
DoCmd.Quit
 
ma ottengo il seguente messaggio....
 
L'espressione su caricamento immessa come impostazione della proprietà
di evento ha generato l'errore seguente: Errore di accesso al percorso/file
* L'espressione non corrisponde al nome di una macro, di una funzione definita
dall'utente oppure a [routine evento]
* Si è verificato un errore durante la valutazione di una funzione, di un evento
o di una macro.
 
Non capisco dove sbaglio... potete aiutarmi ?
Grazie

Usa GETOBJECT per recuperare l'istanza del DB aperto quindi da automazione poi lo chiudi...
 
@Alex 

Ciao, 
non sarà che SysCmd(acSysCmdAccessDir) restituisce un percorso contenente spazi?
Mat.

 @Alex
 
non capisco... sii più esplicito Alex, io non ho la tua esperienza.

Iniziamo a capire cosa non ti è chiaro della guida in merito alla ricerca e lettura che sicuramente hai fatto relativamente a GETOBJECT... perché io sicuramente sono sintetico... ma la guida è estremamente chiara... con esempi anche...
 
Da lì poi andiamo avanti...
 
@Alex

Scusa Augusto, 
hai verificato cosa restituisce SysCmd(acSysCmdAccessDir)?
È molto probabile che il percorso restituito contenga spazi, pe: C:\Program files\Microsoft Office\...
in questo caso il comando shell non potrà fare accesso al file restituendo l'errore che hai riportato (piuttisto esplicativo, dice: errore di accesso al percorso o file).
Per risolvere devi includere l'intero percorso tra doppi apici. 
Ciao
Mat.

Speriamo non venga aperta una seconda istanza...quel metodo... Non ho verificato ma mi sa tanto di si...
 
@Alex

Ciao @Alex,
penso che il suo intento sia proprio quello di aprire una nuova istanza e chiudere quella corrente. 
Mat.

DoCmd.Quit
 
La richiesta di Augusto non e' cosi banale...
Pure io ho un problema, non sull'apertura del file Access da VBA, quanto 
sulla chiusura.
Dopo il lancio con Shell di un DB, l'istanza resta attiva come processo 
anche chiudendo il file, impedendo l'avvio di altri file Access.
Spiegando piu in dettaglio, ho 3 file Access che sono una *copia dello 
stesso programma* ma con nomi diversi:
- Access.accdb - per il lancio programma stand-alone
- ERP.accdb - per lancio programma da pulsante su maschera dell'ERP
- Outlook.accdb - per lancio programma da Outlook con VBA
 
Sono 3 copie uguali dello stesso programma perche ero stanco di battagliare 
controllando se Access gia aperto in memoria, condivisione form, ecc.
Il problema è che quando lancio il programma da VBA Outlook, esso parte 
correttamente, ma quando esco da Access l'istanza resta attiva come 
processo.
Posso buttarla giu solo con Task Manager.
In pratica Outlook.accdb parte, poi esco, ma non riesco ad aprire gli altri 
ERP.accdb e Access.accdb.
Dove sbaglio?
Forse perché prima apro una connessione DAO e non la chiudo correttamente 
distruggendo l'oggetto nel punto corretto?
Grazie se potete darmi una dritta.
 
Il sorgente che utilizzo in Outlook è il seguente:
 
Public Const Sistema = "C:\Programmi\Acc\Outlook.accdb"
Public Const Connessione = "C:\Program Files\Microsoft 
Office\Office14\MSACCESS"
 
Sub AccCall(Selettore As Variant)
On Error GoTo Err_AccCall
 
    Dim db As DAO.Database
    Dim Filtro As String
    Dim Servizio As String
 
    If Nz(Selettore, "") = "" Then Exit Sub
 
    Select Case Selettore:
     Case "Documento":
        Servizio = "fDocumento"
        Filtro = SelezioneLeggi
        SQL = "INSERT INTO Filtro(Filtro01) VALUES ('" & Filtro & "')"
     Case "Anagrafica":
        Servizio = "fAnagrafica"
        Filtro = SelezioneLeggi
        SQL = "INSERT INTO Filtro(Filtro01) VALUES ('" & Filtro & "')"
     Case Else:
        Servizio = "fMain"
 
    End Select
 
    Set db = DAO.OpenDatabase(Sistema)
    db.Execute "DELETE * FROM Filtro"
    db.Execute SQL
    db.Close
 
    Dim Retval As Variant
    Retval = Shell("""" & Connessione & """" & " " & """" & Sistema & """" & 
" /x Avvio /cmd " & """" & Servizio & """", vbNormalFocus)
 
Exit_AccCall:
    Exit Sub
 
Err_AccCall:
    Response = MsgBox("AccCall - " & Err.Description, vbCritical, "Errore")
    Resume Exit_AccCall
End Sub 
 
 
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 


 mi permetto una IPOTESI DA SPROVVEDUTO
(e mi scuso per il tempo che perdi a leggere ...)
 
e se fosse che "non ci sia buona sincronia" fra VBA Outlook e gestione processi ?
 
se hai tempo e voglia puoi lanciare, da Outlook (come dagli altri ambienti), 
un file VBS anche con istruzioni più ridotte (solo test) per vedere come la gestione processi Windows "smaltisce" Access alla sua normale chiusura.
 
Note (minime minime):
 
l'oggetto DBengine da utilizzare sarà (credo) DAO.DBEngine.140
credo pure che si possano eseguire query nello script
 
Ho una esperienza davvero ristretta sulla cosa
(adopero solo file mdb e quindi il "mio" oggetto DBengine è DAO.DBEngine.36)
 
però un inghippo è certo:
 
per eseguire un oggetto a 32 bit 
(come nel mio caso è DAO.DBEngine.36 e come può essere per te DAO.DBEngine.140)
occorre utilizzare il motore vbscript a 32 bit
C:\Windows\SysWOW64\Wscript.exe -->fileVbs
 
mentre per eseguire un oggetto a 64 bit 
occorre utilizzare il motore vbscript a 64 bit
C:\Windows\System\Wscript.exe -->fileVbs
 

gestione processi Windows "smaltisce" Access alla sua normale chiusura.
 
Grazie tentero! Potrebbe essere!
Avevo anche tentato la strada di programmare l' "auto-kill" del processo 
alla chiusura di Access, ma credo non sia possibile oppure non capisco quale 
evento utilizzare. 



Al fine di evitare Istanze multiple potrebbe essere un buon tentativo usare i MUTEX... purtroppo sconosciuti a molti...
 
Provate a leggere questo:
https://www.experts-exchange.com/articles/2104/Avoiding-running-multiple-instances-of-an-application.html
 
 
@Alex


https://www.experts-exchange.com/articles/2104/Avoiding-running-multiple-instances-of-an-application.html
 
 
Molto interessante, grazie! 


Scusate se riapro la discussione.
Ho risolto il problema dell'impossibilità di chiudere Access dopo il lancio 
del database con VBA da Outlook.
Il database lanciato da Outlook si chiude, ma facendo il debug e osservando 
il task manager ho 2 processi MSACCESS.EXE che vengono lanciati...
Uno di questi due processi non si chiude mai. Perché?
Perché il primo processo è lanciato dall'istruzione:
If Nz(Selettore, "") = "" Then Exit Sub
 
Nz è un'istruzione Access e non Outlook, pertanto VBA procede col cercarla 
nei Riferimenti del progetto e quindi istanzia un processo MSACCESS.
Ho risolto sostituendo Nz con una banale:
If IsNull(Selettore) Then Exit Sub
 
In conclusione, il programma definitivo per lanciare Access da Outlook con 
l'inserimento di un dato di filtro in una tabella e lancio di una macro, è 
il seguente:
(... di una semplicità disarmante!)
 
Public Const Sistema = "C:\Programmi\Acc\Outlook.accdb"
Public Const Connessione = "C:\Program Files\Microsoft 
Office\Office14\MSACCESS"
 
Sub AccCall(Selettore As Variant)
On Error GoTo Err_AccCall
 
    Dim db As DAO.Database
    Dim Filtro As String
    Dim Servizio As String
 
    If IsNull(Selettore) Then Exit Sub

*****

