Condividi tramite

Backup automatico

Anonimo
2010-09-01T00:05:13+00:00

Ciao a tutti,

Il mio obiettivo è quello di fare il backup di un file Access 2007,

automaticamente alla chiusura.

Ho creato una maschera dalla quale è possibile:

-   selezionare il percorso dove si vuole salvare il backup

-    salvare tale percorso nel campo “Backup” di TABELLA

Per fare il backup automaticamente alla chiusura, ho pensato diinserirenel Sub

dichiusura della maschera principale (in modo tale che quandosi chiude il file,

si chiude anche la maschera principale e quindivienefatto il backup) le seguenti istruzioni:

Dim PathBackup As String

Dim fso As Object          

Set fso = CreateObject("Scripting.FileSystemObject")

PathBackup =Percorso ricavato dal campo Backup di TABELLA

If (Len(Dir(PathBackup, vbDirectory)) > 0)  Then            ‘Se il percorso esiste

   fso.CopyFile CurrentDb.Name, PathBackup & "\Backup_" &Dir(CurrentDb.Name), True  

   Set fso = Nothing

Else                                                                           ‘Se il percorso non esiste          

   MsgBox "Il Backup non è stato effettuato! Appena possibile, scegliere un percorso valido!"

End If

DoCmd.Quit                          ‘Chiudendo la maschera principale si chiude anche l’applicativo

Volevo chiedere se è possibile fare il backup utilizzando solo istruzioni native di VBA, cioè

senza istanziare un oggetto (fso) da una libreria esterna da VBA?

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2010-09-05T13:13:17+00:00

Ciao Eulero,

fai così:

nel db-bck crea un modulo Bas e inserisci questo codice:


Option Compare Database

Option Explicit

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

'Per info su Sleep vedi http://msdn.microsoft.com/en-us/library/ms686298(VS.85).aspx

Sub BackupDbGestione()

    Dim Tentativi As Integer

    Dim Errore As Long

    Dim Descrizione As String

    On Error Resume Next

    Do

       'Tento di eseguire la copia

       FileCopy "percorso e nome del db-gestionale" , "percorso e nome del backup"

       Errore = Err.Number

       Descrizione = Err.Description

       'Se nessun errore

       If Errore = 0 Then

          MsgBox "Backup Eseguito", vbInformation

          Exit Do

       End If

       'Se errore <>70 notifico l'errore ed esco

       If Errore <> 70 Then

          MsgBox Descrizione

          Exit Do

       End If

       'Se supero i 5 tentativi notifico l'errore ed esco

       If Tentativi = 5 Then

          MsgBox Descrizione

          Exit Do

       End If

       'Attesa 1/2 secondo

       Sleep 500

       Tentativi = Tentativi + 1

       Err.Clear

    Loop

    Application.Quit

End Sub


Poi sempre nel db-bck crea una maschera vuota e inserisci queste due sub rispettivamento nell'evento "Su Apertura" e nell'evento "Su Timer"


Private Sub Form_Load()

    'Start timer

    Me.TimerInterval = 500

End Sub

Private Sub Form_Timer()

    'Stop timer

    Me.TimerInterval = 0

    'Richiamo la sub che esegue il backup

    BackupDbGestione

End Sub


Salva e chiudi la maschera, poi nelle opzioni del database corrente inserisci nell'opzione "Visualizza Maschera" il nome della maschera appena creata.

La maschera con il timer è necessaria per far completare l'esecuzione dell'istruzione "Application.FollowHyperlink " che ha aperto il db-bck nel dbgestione in modo che il flusso possa continuare ed eseguire l'istruzione Application.Quit

Ciao

Giorgio Rancati

La risposta è stata utile?

0 commenti Nessun commento

17 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2010-09-05T15:20:34+00:00

    Scusate se mi intrometto nella discussione ma è un argomento che interessa anche a me!

    Volevo farti alcune domande Giorgio al riguardo se possibile:

    1 - in un'ottica di ottimizzazione della tua soluzione pensi possa essere migliore invece di inserire un percorso fisso del db-bck

    FileCopy "percorso e nome del db-gestionale" , "percorso e nome del backup"

    trovare il percorso in un file Parametri.ini , nella stessa cartella del Front End, simile a come mi hai suggerito in questo post? (che riguardava la protezione del backend)

    http://social.answers.microsoft.com/Forums/it-IT/officebizit/thread/765a91c7-d36a-444f-9b1c-3d520bed8618

    (in modo da modificare solo la stringa nel file .ini qualora il file db-bck venga spostato nella rete.

    2 - Come si apre da codice un file .ini che risiede nella stessa cartella del Front-End?

    3 - Se non sbaglio, con la routine che hai suggerito i backup si sovrappongono, nel senso che il nuovo backup sovrascriverà il precedente con lo stesso nome. Non sarebbe il caso di avere più copie di backup con nomi diversi magari per data?

    Volevo sapere la tua opinione su questi quesiti

    Ti ringrazio come sempre per la disponibilità

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2010-09-04T17:24:47+00:00

    Grazie dell’aiuto sia a Cinzia che a Giorgio!!

    Riguardo il metodo suggerito da Cinzia, propongo una nuova discussione:

    Riguardo il metodo introdotto da Giorgio; indicando con db-bck il db che fa il backup, per fare il backup automatico, se non sbaglio bisognerebbe che il db-gestionale, alla chiusura avviasse la seguente procedura:

    1)   Il db-gestionale apre il db-bck

            Application.FollowHyperlink "percorso e nome didb-bck”

    2)   Il db-gestionale si chiude

            Application.Quit

    3)   Il db-bck (all’apertura) fa una copia del db-gestionale

            FileCopy “percorso e nome del db-gestionale” , “percorso e nome del backup

    4)   Il db-bck si chiude

            Application.Quit

    Ma quando il db-bck lancia l’operazione FileCopy si ha un “Errore di Run-Time 70 : Autorizzazione negata”

    probabilmente perché il db-gestionale è ancora aperto…. come si può fare?

       Backup automatico tramite API

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2010-09-01T09:22:39+00:00

    Ciao Eulero,

    io non mi fiderei di una copia fatta da un database aperto, potrebbe succedere che nel momento della copia esistano pagine dati in memoria che devono essere scritte nel database, con il risultato che il database di destinazione potrebbe risultare danneggiaro e inutilizzabile.

    L'istruzione VBA per copiare un file si chiama FileCopy ma (in questo caso saggiamente) non può eseguire la copia di un file aperto.

    Io farei un Db a parte il cui compito sia quello di fare la copia del Db gestionale.

    Ciao

    Giorgio Rancati

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2010-09-01T09:18:14+00:00

    Ciao Eulero,

    qui http://www.mvps.org/access/api/api0026.htm trovi una procedura che fa una copia del database utilizzando una API di Windows.

    La copia viene creata nella stessa direcotroy del db con il nome Copia di NomeDB.

    Utilizzando l'istruzione VBA FileCopy e/o Name puoi poi copiare/rinominare il file come e dove  preferisci


    Cinzia


    Sito RIO

    Il mio Blog

    La risposta è stata utile?

    0 commenti Nessun commento