+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Sistema di backup e compattazione tramite altro applicativo

  1. #1
    7nuvole non è in linea Scolaretto
    Post
    113

    Sistema di backup e compattazione tramite altro applicativo

    Ciao a tutti!
    Ho un piccolo applicativo A2007 (2Mb), non diviso, con 2 tabelle, 2 report e 10 maschere, il quale:
    * viene aperto in modo esclusivo da un altro applicativo…
    * dovrà essere utilizzato quotidianamente per inserire dati in una sua tabella…
    Prima dell’apertura, volevo gestire anche il backup e la compattazione con il seguente sistema:
    • Il backup viene eseguito 3 volte al mese (alla prima apertura, a partire dai giorni 1, 11, 21 di ogni mese)
    • La compattazione viene eseguita ogni 2 mesi (alla prima apertura, a partire dal giorno 11 dei mesi pari)
    • Nella cartella dei backup vengono mantenuti solo gli ultimi 5 backup (gli altri vengono eliminati)
    • Il campo NextBackup di Tabella2 contiene la data del prossimo backup
    • Il campo PathBackup di Tabella2 contiene il percorso della cartella in cui vengono salvati i backup
    Il codice è il seguente:
    codice:
    Private Sub BckComp(ByVal Appl As String, Optional Psw As String)
      On Error GoTo BckComp_Err
      Dim PathBck As String, f1 As String, f2 As String, fs
      Dim rs As DAO.Recordset, NextBck As Date, NumBck As Integer
      Set rs = DBEngine(0)(0).OpenRecordset("SELECT * FROM Tabella2", dbOpenDynaset)  
      NextBck = rs("NextBackup")
      PathBck = rs("PathBackup")
      rs.Close
      Set rs = Nothing
      
      If Date >= NextBck Then
        FileCopy Appl, PathBck & "\BCK_" & Format(Date, "ddmmyy") & "_" & _
                       Right(Appl, Len(Appl) - InStrRev(Appl, "\"))
        If Day(NextBck) = 11 And Month(NextBck) \ 2 = Month(NextBck) / 2 Then
          If Psw <> "" Then Psw = ";pwd=" & Psw
          DBEngine.CompactDatabase Appl, Appl & ".w", , , Psw
          Kill Appl
          Name Appl & ".w" As Appl
        End If
        Select Case Day(Date)
          Case 1 To 10
            NextBck = Date - Day(Date) + 11
          Case 11 To 20
            NextBck = Date - Day(Date) + 21
          Case 21 To 31
            NextBck = DateAdd("m", 1, Date - Day(Date) + 1)
        End Select
        DBEngine(0)(0).Execute "UPDATE Tabella2 SET NextBackup = " & _
                                Str(CDbl(NextBck)), dbFailOnError        
        Set fs = CreateObject("Scripting.FileSystemObject")
    ReLoop:    
        f1 = Dir(PathBck & "\BCK*.accd*")
        f2 = f1
        While f1 <> ""
          If fs.GetFile(PathBck & "\" & f1).DateCreated < _
             fs.GetFile(PathBck & "\" & f2).DateCreated Then
             f2 = f1
          End If
          f1 = Dir
          NumBck = NumBck + 1
        Wend
        If NumBck > 5 Then
          NumBck = 0
          Kill PathBck & "\" & f2
          GoTo ReLoop    
        End If
      End If
    
    BckComp_Exit:
      Exit Sub
    BckComp_Err:
      MsgBox "Errore n° " & Err.Number & ": " & Err.Description, vbExclamation
      GoTo BckComp_Exit
    End Sub
    Il codice arancione si può togliere visto che appena verrà creato il 6° backup, ne verrà eliminato uno, mantenendo gli ultimi 5 ...
    Per compattare l’applicativo, subito pensavo di utilizzare il metodo CompactRepair (invece del CompactDatabase),
    perché si tratta di un applicativo non diviso, tuttavia mettendo alla prova i due metodi sul mio applicativo, ho notato che:
    * CompactDatabase risulta essere circa 8 volte più veloce del CompactRepair…
    * Sia con uno che con l’altro metodo, il file compattato si riduce alla stessa identica dimensione in termini di bytes…

    Ho esposto il suddetto sistema di compattazione e backup, per:
    • Ricevere eventuali osservazioni o consigli
    • Renderlo disponibile agli altri utenti del forum
    Ultima modifica di 7nuvole; 17-03-2012 19:32 

  2. #2
    L'avatar di @Alex
    @Alex non è in linea Very Important Person
    Post
    16,091
    Alcune osservazioni di cui una assolutamente necessaria...

    1) Non mi pare che la GESTIONE ERRORI faccia nulla... messaggio a parte.
    In teoria dovrebbe ripristinare le condizioni iniziali, ma queste considerazioni le avevo già fatte nel Link che peraltro riporti... quindi forse non ti interessano...

    2) Non capisco perchè usi FSO per ricavare semplicemente la data di Creazione...
    Hai pensato di verificare le funzioni che Access(VBA) mette a disposizione...?
    FileDateTime magari...

    Dando per scontato che solo le prime 5 volte non hai da cancellare alcun BackUp non capisco perchè non cancelli semplicemente il più vecchio.
    Quel Ciclo strano in fondo mi lascia perplesso...

    Se ti serve il NOME del File Cancellato, ma non mi pare sia utile salva la chiamata GetOldestFile(...) in una strVAR...!
    codice:
    Public Function GetOldestFile(ByVal sFolder As String) As String
        
        Dim sFile As String
        Dim FileDT As Date
        
        Dim sOldestFile As String
        Dim OldestDT As Date
        
        ' RECUPERA IL PRIMO FILE NELLA CARTELLA
        sFile = Dir$(sFolder & "\*.*")
                
        ' CICLA TUTTI I FILE(Ma dovrebbero essere solo 5)
        OldestDT = Now
        Do Until sFile = ""
            FileDT = FileDateTime(sFolder & "\" & sFile)
            ' CONFRONTA la data del FILE analizzato con quella più vecchia memorizzata
            If FileDT < OldestDT Then
              sOldestFile = sFile
              OldestDT = FileDT
            End If
            sFile = Dir$
        Loop
        GetOldestFile = sFolder & "\" & sOldestFile & " -:- " & Format(OldestDT, "Short Date") & "  " & Format(OldestDT, "Short Time")
    End Function
    Con KILL lo cancelli...
    codice:
    Call KILL(GetOldestFile("C:\FolderBackUp"))
    @Alex
    Il CROSSPOST è VIETATO
    Mirror al vecchio sito WEB(salvare i Demo riassegnando l'estensione (.Zip/.Rar/.Exe in base all'icona...):
    http://mirror.masterdrive.it/alessandrobaraldi/
    Leggi il
    Regolamento del Forum e nel comprenderne la filosofia rispettalo.

  3. #3
    7nuvole non è in linea Scolaretto
    Post
    113
    Grazie delle osservazioni Alex!!

    Quote Originariamente inviato da @Alex Visualizza il messaggio
    1) Non mi pare che la GESTIONE ERRORI faccia nulla... messaggio a parte.
    In teoria dovrebbe ripristinare le condizioni iniziali, ma queste considerazioni le avevo già fatte nel Link che peraltro riporti... quindi forse non ti interessano...
    Riguardo la gestione degli errori, io pensavo di accontentarmi del semplice messaggio che avvisa l’utente sulla causa del problema,
    così poi l’utente agisce di conseguenza… se l’utente si ritrova senza l’applicativo o con l’applicativo danneggiato (eventi che potrebbero
    succedere anche al di fuori della ruotine in questione) basta che si copi l’ultimo backup e lo rinomini…
    in questo modo l’utente si rende conto in modo più incisivo, del fatto che dovrà lavorare con l’ultimo backup, il quale non contiene
    i dati degli ultimi giorni, e che quindi dovrà reinserirli…


    Quote Originariamente inviato da @Alex Visualizza il messaggio
    2) Non capisco perchè usi FSO per ricavare semplicemente la data di Creazione...
    Hai pensato di verificare le funzioni che Access(VBA) mette a disposizione...?
    FileDateTime magari...
    Si, avevo pensato di utilizzare FileDateTime anziché FSO, però quella funzione mi è sempre stata antipatica,
    perchè fornisce la data di ultima modifica, che per i files Access corrisponde alla data di creazione del file,
    SOLO dal momento in cui viene creato al momento in cui viene aperto per la prima volta…
    … qualcuno potrebbe dire che i backup non dovrebbero essere aperti dall’utente... ma visto che il FSO è solo
    un po’ più lento… qualche millisecondo in più… quando voglio ricavare la data di creazione di un file, preferisco
    farlo tramite FSO che è il metodo più affidabile…

    Tuttavia ho osservato che il seguente codice:
    codice:
    PathBck & "\" & Dir(PathBck & "\BCK*.accd*")
    identifica esattamente il file più vecchio della cartella PathBck, e quindi potrebbe essere utilizzato anche come
    sostituto della funzione GetOldestFile… correggetemi se sbaglio!
    Pertanto si potrebbe riscrivere il codice come segue:

    codice:
    Private Sub BckComp(ByVal Appl As String, Optional Psw As String)
      On Error GoTo BckComp_Err
      Dim PathBck As String, f As String
      Dim rs As DAO.Recordset, NextBck As Date, NumBck As Integer
      Set rs = DBEngine(0)(0).OpenRecordset("SELECT * FROM Tabella2", dbOpenDynaset) 
      NextBck = rs("NextBackup")
      PathBck = rs("PathBackup")
      rs.Close
      Set rs = Nothing
      
      If Date >= NextBck Then
        FileCopy Appl, PathBck & "\BCK_" & Format(Date, "ddmmyy") & "_" & _
                       Right(Appl, Len(Appl) - InStrRev(Appl, "\"))
        If Day(NextBck) = 11 And Month(NextBck) \ 2 = Month(NextBck) / 2 Then
          If Psw <> "" Then Psw = ";pwd=" & Psw
          DBEngine.CompactDatabase Appl, Appl & ".w", , , Psw
          Kill Appl
          Name Appl & ".w" As Appl
        End If
        Select Case Day(Date)
          Case 1 To 10
            NextBck = Date - Day(Date) + 11
          Case 11 To 20
            NextBck = Date - Day(Date) + 21
          Case 21 To 31
            NextBck = DateAdd("m", 1, Date - Day(Date) + 1)
        End Select
        DBEngine(0)(0).Execute "UPDATE Tabella2 SET NextBackup = " & _
                                Str(CDbl(NextBck)), dbFailOnError                       
        f = Dir(PathBck & "\BCK*.accd*")
        While f <> ""
          f = Dir
          NumBck = NumBck + 1
        Wend
        If NumBck > 5 Then Kill PathBck & "\" & Dir(PathBck & "\BCK*.accd*")
      End If
    
    BckComp_Exit:
      Exit Sub
    BckComp_Err:
      MsgBox "Errore n° " & Err.Number & ": " & Err.Description, vbExclamation, “Attenzione!”
      GoTo BckComp_Exit
    End Sub
    … anche in questo modo viene cancellato il file più vecchio, solo se è stato creato il 6° backup.
    Il conteggio dei backup tramite NumBck, è utile anche nel caso in cui l’utente modificasse
    il PathBackup assegnando il percorso di una cartella vuota…
    Ultima modifica di 7nuvole; 19-03-2012 19:01 

  4. #4
    L'avatar di @Alex
    @Alex non è in linea Very Important Person
    Post
    16,091
    Quote Originariamente inviato da 7nuvole Visualizza il messaggio
    Grazie delle osservazioni Alex!!
    .....
    Riguardo la gestione degli errori, io pensavo di accontentarmi del semplice messaggio che avvisa l’utente sulla causa del problema,
    così poi l’utente agisce di conseguenza… se l’utente si ritrova senza l’applicativo o con l’applicativo danneggiato (eventi che potrebbero
    succedere anche al di fuori della ruotine in questione) basta che si copi l’ultimo backup e lo rinomini…
    in questo modo l’utente si rende conto in modo più incisivo, del fatto che dovrà lavorare con l’ultimo backup, il quale non contiene
    i dati degli ultimi giorni, e che quindi dovrà reinserirli…
    Avevo intuito un'ottica simile... io sono un pò più tutelativo, nel senso che nell'ottica in cui l'utente è inesperto, come molte segretarie(o segretari senza nulla togliere alla categoria), tutto quello che hai detto non verrà mai fatto...!
    Per questo la mia metodica mi suggerisce di RIPRISTINARE a quello che era la situazione precedente, e di conseguenza gestine le conseguenze con MAIL automatiche
    di ANOMALIA o LOG di ERRORE o quello che meglio si addice, ma per primo penso a ridare OPERATIVITA'.
    Quote Originariamente inviato da 7nuvole Visualizza il messaggio
    Si, avevo pensato di utilizzare FileDateTime anziché FSO, però quella funzione mi è sempre stata antipatica,
    perchè fornisce la data di ultima modifica, che per i files Access corrisponde alla data di creazione del file,
    SOLO dal momento in cui viene creato al momento in cui viene aperto per la prima volta…
    … qualcuno potrebbe dire che i backup non dovrebbero essere aperti dall’utente... ma visto che il FSO è solo
    un po’ più lento… qualche millisecondo in più… quando voglio ricavare la data di creazione di un file, preferisco
    farlo tramite FSO che è il metodo più affidabile…
    Anche quì è solo questione di OPERATIVITA'.
    Io considero che i FILE BACKUP siano più sacri dell'arca di Noè, quindi NESSUNO li tocca manualmente.
    Il Ripristino del BackUp lo gestisco con un'applicativo separato che chiede all'utente quale ripristinare, di conseguenza
    la DATA di creazione è quella che mi serve, perchè se la DataCreazione è diversa da quella dell'ultima modifica un Mariuolo
    deve essere punito...!

    Scherzi a parte devi calare la cosa nella tua operatività, io la vedo in modo più strutturato e meno manuale e riduco sempre
    al minimo il contagio da fattori esterni, e tutte le LIB invocate anche se in LATEBINDING sono fattori esterni.
    Quote Originariamente inviato da 7nuvole Visualizza il messaggio
    Tuttavia ho osservato che il seguente codice:
    codice:
    PathBck & "\" & Dir(PathBck & "\BCK*.accd*")
    identifica esattamente il file più vecchio della cartella PathBck, e quindi potrebbe essere utilizzato anche come
    sostituto della funzione GetOldestFile… correggetemi se sbaglio!
    Pertanto si potrebbe riscrivere il codice come segue:

    codice:
    Private Sub BckComp(ByVal Appl As String, Optional Psw As String)
      On Error GoTo BckComp_Err
      Dim PathBck As String, f As String
      Dim rs As DAO.Recordset, NextBck As Date, NumBck As Integer
      Set rs = DBEngine(0)(0).OpenRecordset("SELECT * FROM Tabella2", dbOpenDynaset) 
      NextBck = rs("NextBackup")
      PathBck = rs("PathBackup")
      rs.Close
      Set rs = Nothing
      
      If Date >= NextBck Then
        FileCopy Appl, PathBck & "\BCK_" & Format(Date, "ddmmyy") & "_" & _
                       Right(Appl, Len(Appl) - InStrRev(Appl, "\"))
        If Day(NextBck) = 11 And Month(NextBck) \ 2 = Month(NextBck) / 2 Then
          If Psw <> "" Then Psw = ";pwd=" & Psw
          DBEngine.CompactDatabase Appl, Appl & ".w", , , Psw
          Kill Appl
          Name Appl & ".w" As Appl
        End If
        Select Case Day(Date)
          Case 1 To 10
            NextBck = Date - Day(Date) + 11
          Case 11 To 20
            NextBck = Date - Day(Date) + 21
          Case 21 To 31
            NextBck = DateAdd("m", 1, Date - Day(Date) + 1)
        End Select
        DBEngine(0)(0).Execute "UPDATE Tabella2 SET NextBackup = " & _
                                Str(CDbl(NextBck)), dbFailOnError                       
        f = Dir(PathBck & "\BCK*.accd*")
        While f <> ""
          f = Dir
          NumBck = NumBck + 1
        Wend
        If NumBck > 5 Then Kill PathBck & "\" & Dir(PathBck & "\BCK*.accd*")
    
    BckComp_Exit:
      Exit Sub
    BckComp_Err:
      MsgBox "Errore n° " & Err.Number & ": " & Err.Description, vbExclamation, “Attenzione!”
      GoTo BckComp_Exit
    End Sub
    … anche in questo modo viene cancellato il file più vecchio, solo se è stato creato il 6° backup.
    Il conteggio dei backup tramite NumBck, è utile anche nel caso in cui l’utente modificasse
    il PathBackup assegnando il percorso di una cartella vuota…
    Si osservazione valida, ma ti costringe come vedi a memorizzare il tutto in una Tabella... cosa che io per i BackUp non farei mai...!
    So che destino una Folder ai Bck e li ci devono essere da 0÷5 File al massimo(parametrizzabili).
    Non salvo nulla di statico nelle Tabelle del DB perchè il DB si può corrompere e se si corrompe cade il criterio di controllo...
    Io scrivo codice indipendente leggo i dati dei File e come un'archivio Ciclico l'ultimo cancella il 1°....!

    Sono come sempre indicazioni molto personali derivanti dalle abitudini e dalle necessità...
    Non credo ci sia UN METODO PERFETTO.
    @Alex
    Il CROSSPOST è VIETATO
    Mirror al vecchio sito WEB(salvare i Demo riassegnando l'estensione (.Zip/.Rar/.Exe in base all'icona...):
    http://mirror.masterdrive.it/alessandrobaraldi/
    Leggi il
    Regolamento del Forum e nel comprenderne la filosofia rispettalo.

  5. #5
    7nuvole non è in linea Scolaretto
    Post
    113
    Purtroppo ho notato che il codice:
    codice:
    PathBck & "\" & Dir(PathBck & "\BCK*.accd*")
    non mi identifica sempre il file più vecchio.... pertanto meglio rimanere con il codice iniziale che ho risistemato:
    codice:
    Public Sub BckComp(ByVal Appl As String, Optional Psw As String)
      On Error GoTo BckComp_Err
      Dim PathBck As String, f1 As String, f2 As String, fs
      Dim rs As DAO.Recordset, NextBck As Date, NumBck As Integer
      Set rs = DBEngine(0)(0).OpenRecordset("SELECT * FROM Tabella2", dbOpenDynaset)  
      NextBck = rs("NextBackup")
      PathBck = rs("PathBackup")
      rs.Close
      Set rs = Nothing
      
      If Date >= NextBck Then
        FileCopy Appl, PathBck & "\BCK_" & Format(Date, "ddmmyy") & "_" & _
                       Right(Appl, Len(Appl) - InStrRev(Appl, "\"))
        If Day(NextBck) = 11 And Month(NextBck) \ 2 = Month(NextBck) / 2 Then
          If Psw <> "" Then Psw = ";pwd=" & Psw
          DBEngine.CompactDatabase Appl, Appl & ".w", , , Psw
          Kill Appl
          Name Appl & ".w" As Appl
        End If
        Select Case Day(Date)
          Case 1 To 10
            NextBck = Date - Day(Date) + 11
          Case 11 To 20
            NextBck = Date - Day(Date) + 21
          Case 21 To 31
            NextBck = DateAdd("m", 1, Date - Day(Date) + 1)
        End Select
        DBEngine(0)(0).Execute "UPDATE Tabella2 SET NextBackup = " & _
                                Str(CDbl(NextBck)), dbFailOnError                        
        Set fs = CreateObject("Scripting.FileSystemObject")
        f1 = Dir(PathBck & "\BCK*.accd*")
        f2 = f1
        While f1 <> ""
          If fs.GetFile(PathBck & "\" & f1).DateCreated < _
             fs.GetFile(PathBck & "\" & f2).DateCreated Then
             f2 = f1
          End If
          f1 = Dir
          NumBck = NumBck + 1
        Wend
        If NumBck > 5 Then Kill PathBck & "\" & f2
      End If
      
    BckComp_Exit:
      Exit Sub
    BckComp_Err:
      MsgBox "Errore n° " & Err.Number & ": " & Err.Description, vbExclamation, "Attenzione!"
      GoTo BckComp_Exit
    End Sub
    Per adesso mi accontento del codice esposto... in futuro quando magari sarò più esperto, affronterò il problema in modo più sofisticato...
    Ringrazio Alex per le sue osservazioni che come sempre offrono buoni spunti per riflessioni e approfondimenti...

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi