Backup progressivi.

Anonimo
2017-08-26T20:37:37+00:00

Ciao,

facendo una ricerca in rete sono riuscito ad adattare il seguente codice per creare il backup del database.

In un modulo:

Declare PtrSafe Function apiCopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long

Sub CopyFile(SourceFile As String, DestFile As String)

       '---------------------------------------------------------------

       ' PURPOSE: Copy a file in use on disk from one location to another.

       ' ACCEPTS: The name of the source file and destination file.

       ' RETURNS: Nothing

       '---------------------------------------------------------------

       Dim Result As Long

         If Dir(SourceFile) = "" Then

            MsgBox Chr(34) & SourceFile & Chr(34) & _

               " is not valid file name."

         Else

            Result = apiCopyFile(SourceFile, DestFile, False)

         End If

End Sub

In un pulsante:

Call CopyFile(CurrentProject.Path & "\Database.mdb", CurrentProject.Path & "\CopiaDatabase.mdb")

Quello che a me servirebbe, è creare ad ogni click del pulsante un backup nuovo, cioè che non si vada a sovrapporre a quello già esistente.

Ad esempio CopiaDatabase1, CopiaDatabase2, CopiaDatabase3 ecc...

Vladimiro

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

44 risposte

Ordina per: Più utili
  1. Anonimo
    2017-08-27T19:36:33+00:00

    ciao Vladimiro,

    [...]

    simpatico questo escamotage per Win64 o Win32   :-)

    [...]

    è indispensabile per dichiarare le Api discriminando la piattaforma a 32 o 64 bit di office.

    Con questa Api si apprezza poco, ma diventa fondamentale soprattutto nel caso in cui il tipo di variabile cambi, caso tipico l'handle.

    [...]

    Purtroppo, anche così non mi rilascia nessuna copia.

    Sicuramente ho sbagliato qualcosa e per farla breve ti allego il db chiamato Database Qui

    [...]

    no, non direi, manca l'impostazione della form in avvio del database :

    Strumenti, opzioni, database corrente ed imposti la form come mostra l'immagine.

    [...]

    Una cosa,

    come faccio ad inserire il seguente percorso:

    CurrentProject.Path & "\Database.mdb"

    con quest'altro:

    "C:\Users\Vladimiro\Desktop\Database.accdb"

    evitando l'errore:

    [...]

    una costante è un valore che non cambia mai, currentProject.Path varia a seconda del path in cui il db risiede quindi non puoi procedere in tal modo.

    visto che ci sei dichiara la costante di tipo string, il codice è più chiaro ed esplicito.

    L'attribuzione del tipo avviene in modo automatico nel caso manchi, ma è buona pratica impostarlo:

    Const strPathDB as string= "C:\Users\Vladimiro\Desktop\Database.accdb"

    Ovviamente il database deve essere un altro non quello che gestisce il backup.

    Oltre a questo imposta l'operazione pianificata.

    Per valutare la corretta creazione del backup è sufficiente che imposti un path di un db esistente e apri il database che effettua il backup.

    Nella stessa cartella trovi la copia.

    Il tutto si automatizza, come detto, con l'operazione pianificata.

    HTH.

    Ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2017-08-27T17:26:31+00:00

    ciao Vlamidiro,

    inserisci nella testata del modulo di classe della form ( della form ), la dichiarazione della Api Sleep come mostrato in precedenza.

    Senza di essa ottieni l'errore di cui al tuo post.

    Option Compare Database

    Option Explicit

    #If Win64 Then

            Private Declare PtrSafe Sub _

                            Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

    #Else

            Private Declare Sub _

                            Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

    #End If

    Ciao Sandro,

    simpatico questo escamotage per Win64 o Win32   :-)

    Purtroppo, anche così non mi rilascia nessuna copia.

    Sicuramente ho sbagliato qualcosa e per farla breve ti allego il db chiamato Database Qui

    Una cosa,

    come faccio ad inserire il seguente percorso:

    CurrentProject.Path & "\Database.mdb"

    con quest'altro:

    "C:\Users\Vladimiro\Desktop\Database.accdb"

    evitando l'errore:

    Vladimiro

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2017-08-27T15:07:26+00:00

    ciao Vlamidiro,

    inserisci nella testata del modulo di classe della form ( della form ), la dichiarazione della Api Sleep come mostrato in precedenza.

    Senza di essa ottieni l'errore di cui al tuo post.

    Option Compare Database

    Option Explicit

    #If Win64 Then

            Private Declare PtrSafe Sub _

                            Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

    #Else

            Private Declare Sub _

                            Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

    #End If

    Private Sub bckup2()

    Dim strDBPath As String

    Dim strDBName As String

    Dim aName()   As String

    Dim strDBKup  As String

    Dim i         As Long

    Dim j         As Long

    Dim k         As Long

    '.... resto del codice

    Ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2017-08-27T13:26:55+00:00

    Ciao Sandro,

    ancor prima di personalizzare il percorso, ho il seguente errore:

    Vladimiro

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2017-08-27T08:57:34+00:00

    ciao Vladimiro,

    backup dell'intero database non solo della parte dati, corretto?

    Meglio non da database aperto, sempre da database chiuso, sfruttando l'errore delle funzione nativa fileCopy

    Crea un nuovo database con una maschera che imposterai come maschera di avvio del database stesso in modo che una volta avviato, la maschera si apra.

    Su evento timer invochi :

    Private Sub Form_Timer()

    bckup2

    End Sub

    avendo cura di impostare l'intervallo a 1 secondo :

    la routine, bckup2, richiamata 10 volte, 1 volta ogni secondo avrà il compito di tentare il backup ed in caso di errore ri-tentare per altre 10 volte, concedendo "un po'" di tempo per chiudere il database :

    Option Compare Database

    Option Explicit

    #If Win64 Then

            Private Declare PtrSafe Sub _

                            Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

    #Else

            Private Declare Sub _

                            Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

    #End If

    Private Sub bckup2()

    Dim strDBPath As String

    Dim strDBName As String

    Dim aName()   As String

    Dim strDBKup  As String

    Dim i         As Long

    Dim j         As Long

    Dim k         As Long

    Dim strMess   As String

    Dim bt        As VBA.VbMsgBoxStyle

    Dim strTitle  As String

    Const strPathDB = "C:\fullPathDatabase" ' personalizza il path con nome db+estensione

    aName = Split(strPathDB, "")

    strDBName = Split(aName(UBound(aName)), ".")(0)

    strDBPath = Replace(strPathDB, aName(UBound(aName)), "")

        i = 1

        Do While Len(Dir(strDBKup)) > 0

            strDBKup = strDBPath & strDBName & " copia (" & i & ").accdb"

            i = i + 1

        Loop

        On Error Resume Next   

        For j = 1 To 10

            VBA.FileCopy Source:=strPathDB, Destination:=strDBKup

            DoEvents

            Sleep 1000

            If Err.Number = 0 Then

                Me.TimerInterval = 0

                Exit For

            End If

        Next

        on error goto 0

        strMess = "BackUp eseguito correttamente"

        strTitle = "Informazione"

        bt = vbInformation

        If j = 11 Then

            strMess = "BackUP non eseguito, qualcosa non va...!"

            bt = vbCritical

            strTitle = "Attenzione!"

            k = -1

        End If

        VBA.MsgBox prompt:=strMess, _

                   buttons:=bt, _

                   title:=strTitle

        If k = -1 Then

            Sleep 1000

            bckup2

        End If

        Erase aName 

        DoCmd.Quit

    End Sub

    un loop genera il nome del database backup concatenato al nome Copia (n) come suffisso, ovviamente ulteriormente personalizzabile.

    Apri lo schedulatore di Windows, digitando schedule sulla barra di ricerca e scegli pianifica attività :

    azione, crea attività e imposti la frequenza:

    HTH,ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento