Compattazione automatica di un db non diviso

Anonimo
2010-09-26T15:33:01+00:00

Ciao a tutti, stavo studiando un metodo per fare la compattazione del mio db

automaticamente alla chiusura. Volevo gentilmente chiedervi:

·         Se conoscete un buon metodo da consigliarmi?

·         Se con la compattazione si rischia di danneggiare il proprio db?  E quindi,

·         Se conviene compattare il db periodicamente, per esempio una volta al mese?

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

3 risposte

Ordina per: Più utili
  1. Anonimo
    2011-06-18T20:43:22+00:00

    _______________________________________________________________________                                  _____ COMPATTAZIONE DI UN DB NON DIVISO

    Nel caso in cui si voglia utilizzare un db non diviso (in BE e FE), è consigliabile evitare che esso venga utilizzato contemporaneamente da più utenti al fine di evitare eventuali danneggiamenti.

    Un esempio di danneggiamento è proprio dovuto alla compattazione. In particolare, se il db viene compattato alla chiusura da un utente, mentre un altro utente lo sta utilizzando, viene creato un altro db.

    Alla prima chiusura viene creato Database.mdb, alle seconda Database1.mdb, alla terza Database2.mdb, e così via (viene creato un .mdb anche se il file da compattare è un .accdb).

    Un metodo per fare in modo che il db venga  utiilizzato al massimo da un utente, è il seguente:

    [1] Inserire all’inizio della macro AutoExec il seguente codice:

    If (NumeroUtenti > 1) Then

          Application.Quit

    End If

    [2] Inserire in un modulo standard la seguente funzione:

    Public Function NumeroUtenti() As Integer

          Dim cn As Object, rs As Object

          Dim Nrutenti As Integer

          Set cn = CurrentProject.Connection

          Set rs = cn.OpenSchema(-1, , "{947bb102-5d43-11d1-bdbf-00c04fb92675}")

          While Not rs.EOF

                If rs.Fields("CONNECTED") = True Then

                       Nrutenti = Nrutenti + 1

                End If

                rs.MoveNext

           Wend

           Set rs = Nothing

           Set cn = Nothing

           NumeroUtenti = Nrutenti

    End Function

    Per quanto riguarda la compattazione, penso che essa comporti (anche se in minima parte)

    un rischio di danneggiamento del db, pertanto penso che sia ragionevole:

    * effettuare la compattazione periodicamente (per esempio una volta al mese)

    * fare un backup del db prima della compattazione

    Quindi il metodo da me descritto nel post precedente potrebbe andar bene, però modificherei

    l’opzione di compattazione, scrivendola in inglese anziché italiano, per quanto spiegato da Cinzia

    in Application.SetOption in italiano o inglese.

    Riporto qui sotto la procedura corretta:

    [3] Creare il campo DataCompattazione:

    Creare il campo DataCompattazione di tipo Data in una tabella (es.: TABELLA2)

    Inserire manualmente in questo campo la data della prima compattazione.

    [4] Inserire nella macro AutoExec il seguente codice:

    Application.SetOption "Auto Compact", False                 

    In modo tale che di norma non si abbia la compattazione automatica alla chiusura del db.

    [5] Inserire nel Sub di chiusura del db il seguente codice:

    Dim DataComp As Date, FuturaComp As Date

    DataComp = data ricavata dal campo DataCompattazione della TABELLA2

    If (Date >= DataComp) Then

           Application.SetOption "Auto Compact", True   ‘Si abilita la compattazione

           y = 3                                                                          'Giorno del mese in cui si vuole compattare

           FuturaComp = DateAdd("m", 1, Date - Day(Date) + y)

           Inserire FuturaComp nel campo DataCompattazione della TABELLA2

    End If

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2010-09-27T08:01:25+00:00

    Ciao! Ho formulato male le domande, era meglio se mettevo la prima per ultima, cmq grazie lo stesso The Raw.

    In altre parole ero interessato ad un metodo per effettuare una compattazione automatica periodica.

    Mi erano sorti i dubbi sul rischio di danneggiamento del db per i seguenti motivi:

    1)   Access non compatta i db sistematicamente ad ogni chiusura, ma offre l’opzione facoltativa (suggerita da The Raw)

    2)   Quando si installa Access, come default la suddetta opzione è disabilitata (non c’è il flag)

    3)   Su altri forum ci sono discussioni relative alla compattazione periodica (ma riguardano le versioni inferiori di A2007)

    Bisogna inoltre considerare che non sempre il db si apre per inserire nuovi dati… in questi casi quindi la compattazione risulta essere un’operazione superflua.

    A questo punto ho pensato che un buon metodo di compattazione, potrebbe essere quello di effettuarla automaticamente alla chiusura, il giorno y di ogni mese (esempio: y = 3) o comunque alla prima chiusura a partire da tale giorno.

    Il mio metodo si basa sulla seguente procedura:

    [1] Creare il campo DataCompattazione

    Creare il campo DataCompattazione di tipo Data in una tabella (es.: TABELLA2)

    Inserire manualmente in questo campo la data della prima compattazione.

    [2] Inserire nella Function richiamata dalla macro AutoExec, la seguente istruzione:

         Application.SetOption "Compattazione automatica", False                  

    In modo tale che di norma non si abbia la compattazione automatica alla chiusura del db.

    [3] Inserire nel Sub di chiusura del db, le seguenti istruzioni:

         Dim DataComp As Date, FuturaComp As Date

         DataComp = data ricavata dal campo DataCompattazione della TABELLA2

         If (Date >= DataComp) Then

             Application.SetOption "Compattazione automatica", True   ‘Si abilita la compattazione

             y = 3                                                                            'Giorno del mese in cui si vuole compattare

             FuturaComp = DateAdd("m", 1, Date - Day(Date) + y)

    Inserire FuturaComp nel campo DataCompattazione della TABELLA2

         End If

    Rimane comunque il dubbio, se ha senso fare la compattazione periodica. Cosa ne pensate?

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2010-09-26T18:46:41+00:00

    Ciao Eulero,

    Opzioni di access\Database corrente, flag su: compatta alla chiusura.

    Questo significa compattare il db ogni volta e non periodicamente. Io lo uso per risparmia spazio e migliorare le prestazione. Su questo link trovi qualche info aggiuntiva:

    http://office.microsoft.com/it-it/access-help/migliorare-le-prestazioni-di-un-database-di-access-HP005187453.aspx

    La risposta è stata utile?

    0 commenti Nessun commento