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-06T23:58:27+00:00

    Grazie Giorgio! Volevo chiedere se è possibile fare in modo che il db-gestionale trasmetta al db-bck:

    1. Il percorso e nome del db-gestionale
    2. Il percorso e nome del backup

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2010-09-06T09:28:47+00:00

    Si, questo l'avevo capito.

    Ma vorrei sapere come poter aprire un file .ini da codice tramite un pulsante per poter dar modo all'operatore di modificare la stringa del percorso BE qualora il riallegamento tabelle non andasse a buon fine.

    ok, puoi ad esempio aprire il file ini con Notepad, questa è l'istruzione


    Shell "Notepad.exe """ & Currentproject.Path & "\Parametri.ini""",vbNormalFocus


    Per mantenere ad esempio gli ultimi 5 backup che comando devo aggiungere?

    'ciclo per eliminare i files con data < 5 giorni dalla data attualeè possibile gestire questa cosa?

    sì, puoi cancellare i files più vecchi di 5 giorni

    Esempio


        Dim FileToDelete AS String

        FileToDelete = Dir(Percorso_letto_da_Ini & "??-??-??-NomeFileBe.accdb")

        Do

          If FileToDelete = "" Then Exit Do

          If FileToDelete < Format(Date() - 4, "yy-mm-dd-") Then

             Kill CurrentProject.Path & "" & FileToDelete

          End If

          FileToDelete = Dir()

        Loop


    Ciao

    Giorgio Rancati

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2010-09-06T08:36:54+00:00

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

    Nell'esempio che hai citato il file ini viene già aperto dalla stessa cartella del front end.


    NomeFileIni = CurrentProject.Path & "\Parametri.ini"


    CurrentProject.Path rende il percorso del database, per maggiori info vedi:

    ACC2000: Come ottenere il nome e il percorso del database corrente

    Si, questo l'avevo capito.

    Ma vorrei sapere come poter aprire un file .ini da codice tramite un pulsante per poter dar modo all'operatore di modificare la stringa del percorso BE qualora il riallegamento tabelle non andasse a buon fine.

    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? 

    Certamente,, ti basta inserire tra il percorso e il nome del Be la data.

    Es.


    Percorso_letto_da_Ini & "" & Format(Date(),"yy-mm-dd-") & "NomeFileBe.accdb"


    Ciao

    Giorgio Rancati

    Per mantenere ad esempio gli ultimi 5 backup che comando devo aggiungere?

    'ciclo per eliminare i files con data < 5 giorni dalla data attuale

    è possibile gestire questa cosa?

    Grazie ancora

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2010-09-05T17:25:13+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.

    Certamente, io ho mantenuto la riga [FileCopy "percorso e nome del db-gestionale" , "percorso e nome del backup"]  come generalizzzione dell'istruzione della copia ma si può modificare come si vuole.

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

    Nell'esempio che hai citato il file ini viene già aperto dalla stessa cartella del front end.


    NomeFileIni = CurrentProject.Path & "\Parametri.ini"


    CurrentProject.Path rende il percorso del database, per maggiori info vedi:

    ACC2000: Come ottenere il nome e il percorso del database corrente

    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? 

    Certamente,, ti basta inserire tra il percorso e il nome del Be la data.

    Es.


    Percorso_letto_da_Ini & "" & Format(Date(),"yy-mm-dd-") & "NomeFileBe.accdb"


    Ciao

    Giorgio Rancati

    La risposta è stata utile?

    0 commenti Nessun commento