Intermittente di errore quando si tenta di controllare un altro database in VBA

StackOverflow https://stackoverflow.com/questions/70417

  •  09-06-2019
  •  | 
  •  

Domanda

Ho il seguente codice:

Dim obj As New Access.Application
obj.OpenCurrentDatabase (CurrentProject.Path & "\Working.mdb")
obj.Run "Routine"
obj.CloseCurrentDatabase
Set obj = Nothing

Il problema che sto sperimentando è un pop-up che mi dice Accesso non è possibile impostare la messa a fuoco su altri database.Come si può vedere dal codice, voglio esecuzione di una Subroutine in un altro mdb.Qualsiasi altro modo per ottenere questo sarà apprezzato.

Sto lavorando con MS Access 2003.

Questo è un errore intermittente.Questo è il codice di produzione che verranno eseguite solo una volta al mese, è estremamente difficile da riprodurre, e non posso darti il testo esatto e il numero in questo momento.È il secondo mese che questo è accaduto.

Ho il sospetto che questo può verificarsi quando qualcuno sta lavorando con questo o altri database.

Il flusso di dati è quello di aggiornare tutti i 'progetti' una volta al mese in un database e quindi rendere queste informazioni disponibili in altri database.

Forse è a causa della prima linea nella 'Routine' di codice:Se vbNo = MsgBox("vuoi aggiornare?", vbYesNo, "Aggiornamento"), Poi Uscita Funzione End If

Farò un altro sottoprogramma senza il MsgBox.

Sono stato in grado di riprodurre questo comportamento.Succede quando la messa a fuoco è di spostare il database, ma l'utente imposta la messa a fuoco ([ALT]+[TAB]) il primo database.La "soluzione" era quello di istruire l'utente.


Questo è un errore intermittente.Questo è il codice di produzione che verranno eseguite solo una volta al mese, è estremamente difficile da riprodurre, e non posso darti il testo esatto e il numero in questo momento.È il secondo mese che questo è accaduto.

Ho il sospetto che questo può verificarsi quando qualcuno sta lavorando con questo o altri database.

Il flusso di dati è quello di aggiornare tutti i 'progetti' una volta al mese in un database e quindi rendere queste informazioni disponibili in altri database.

Forse è a causa della prima linea nella 'Routine' di codice:Se vbNo = MsgBox("vuoi aggiornare?", vbYesNo, "Aggiornamento"), Poi Uscita Funzione End If

Farò un altro sottoprogramma senza il MsgBox.


Ho provato questo il nostro sviluppo di database e funziona.Questo non significa nulla, come gli altri anche il codice lavora bene in fase di sviluppo.

È stato utile?

Soluzione 3

Sono stato in grado di riprodurre l'errore in 'sviluppo'.

"Questa azione non può essere completata perché l'altra applicazione è occupato.Scegliere "passa a" Per attivare ...."

Non riesco davvero a vedere il resto del messaggio, in quanto è a lampeggiare molto velocemente.Credo che questo errore è dovuto all 'switching' tra i due database.Spero che, da educare l'utente, questo si ferma.

Philippe, la tua risposta è, ovviamente, corretta.Avrei scelto questo percorso, se non avessi sviluppato la 'routine' in anticipo.

"Sono stato in grado di riprodurre questo comportamento.Succede quando la messa a fuoco è di spostare il database, ma l'utente imposta la messa a fuoco ([ALT]+[TAB]) il primo database.La "soluzione" era quello di istruire l'utente." Come è impossibile impedire all'utente di passare applicazione in Windows, vorrei chiudere l'argomento.

Altri suggerimenti

Credo che questo messaggio di errore collegato allo stato di uno dei database.Si utilizza qui connessioni di Jet e oggetti di Access, e si potrebbe non essere in grado, per vari motivi (ambiente multi-utente, unability per eliminare LDB file di Blocco, ecc), per chiudere correttamente il database attivo e aperto un altro.Quindi, secondo me, la soluzione è quello di dimenticare il motore a reazione e a utilizzare un'altra connessione per aggiornare i dati in un "altro" del database.

Quando si dice "Il flusso di dati è quello di aggiornare tutti i 'progetti' una volta al mese in un database e quindi rendere queste informazioni disponibili in altri database", presumo che il ruolo delle "Routine" è per l'aggiornamento di alcuni dati, sia tramite istruzioni SQL o equivalente recordset aggiornamenti.

Perché non provare a fare gli aggiornamenti corrispondenti con l'apertura di una connessione ad altri database e (1) inviare le corrispondenti istruzioni SQL o (2) l'apertura del recordset e fare gli aggiornamenti richiesti?

Un'idea potrebbe essere per esempio:

Dim cn as ADODB.connexion, 
    qr as string, 
    rs as ADODB.recordset

'qr can be "Update Table_Blablabla Set ... Where ...
'rs can be "SELECT * From Table_Blablabla INNER JOIN Table_Blobloblo  

set cn = New ADODB.connexion
cn.open

You can here send any SQL instruction (with command object and execute method) 
or open and update any recordset linked to your other database, then

cn.close

Questo può essere fatto anche tramite una connessione ODBC (e DAO.i recordset), in modo da poter scegliere il vostro preferito oggetti.

Se vuoi un altro mezzo per la funzione di esecuzione, provare le seguenti operazioni:

Dim obj As New Access.Application
obj.OpenCurrentDatabase (CurrentProject.Path & "\Working.mdb")

obj.DoCmd.RunMacro "MyMacro"
obj.CloseCurrentDatabase
Set obj = Nothing

Dove 'MyMacro'ha un'azione di 'Eseguicodice'con il nome della Funzione che si preferisce eseguire il Lavoro.mdb

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top