25/03/2024 - paolo792 ha scritto:
Buongiorno a tutti, ho un problema e spero mi possiate aiutare: c'è la possibilità di inserire in una macro la compattazione del database che non lo chiuda?
Mi spiego meglio con un esempio: dovrei creare una macro con all'interno una query di creazione tabella con tanti dati all'interno (tabella T1), successivamente un'altra tabella con tanti dati (T2), poi creo una query di eliminazione dei dati contenuti nella prima tabella T1 (anche se lo spazio allocato non decrementa gli MB del mio file), poi lanciare un ipotetico comando/modulo/function che compatti il DB senza chiuderlo, poi lanciare una terza query con altri (molti) dati (T3), poi una query di eliminazione della tabella T2 e ripetere quel comando/modulo/function che compatti nuovamente.
Ciao,
si si si sssiiii !!! puoi fare quello che chiedi ma il processo che crea le tabelle ed elimina i records ecc…ecc… lo devi eseguire su di un altro database.
Insomma… non ti cambia nulla rispetto a quello che già fai perchè gli attuali processi li esegui su un altro database invece che su quello attuale.
Per far questo è molto semplice… Si deve creare un database che contiene il tuo codice, query , macro e form, atti al processo che devi eseguire per la creazione delle tabelle ed eliminazione dei records, ecc..
A questo tuo database che chiameremo per comodità DbImport, si devono collegare le Tabelle da trattare che si trovano nel database principale che per comodità chiameremo DbPrincipale
Riepilogando sinteticamente le operazioni da compiere saranno:
- Creazione di un database DbImport:
- Crea un nuovo database che sarà utilizzato durante per i processi di creazione ed eliminazione delle tabelle nel DbPrincipale
- Copiare il codice, le query, form, ecc… (solo la parte che interessa al processo) in DbImport
- Collegamento al database principale:
- Stabilire le connessioni alle tabelle che si trovano in DbPrincipale (link di collegamento delle tabelle interessate al processo)
- Esecuzione della routine di Import/Cancellazione:
- Eseguire la routine che crea / cancella i records nel DbImport
- Ogni volta che si vuole, eseguire la Compattazione di DbPrincipale chiudendo le connessioni in corso su DbImport
- Disconnessione e compattazione del database principale:
- Dopo ogni ciclo di aggiunta ed eliminazione di record, chiudere le eventuali connessione al database DbImport. Questo eviterà eventuali problemi di corruzione dei dati durante il processo di compattazione
- Esequire la compattazione di DbPrincipale
- Ripetizione dei passaggi 2-4:
- Ripetere i passaggi 2-4 per ogni ciclo che prevede la routine di creazione tabelle ed eliminazione dei records
Più lungo da spiegarsi che da farsi… ;-)
Esempio del ciclo da realizzare nella routine nel database DbImport:
Sub MyImport()
' --- First Import ---
' refresh link table DbPrincipale
MyRefreshLink
' add table or records
MyCreateTable01
' delete records
MyDeleteRecords01
' start Compact/Repair database DbPrincipale
MyCompactRepair
' --- Second Import ---
' refresh link table DbPrincipale
MyRefreshLink
' add table or records
MyCreateTable02
' delete records
MyDeleteRecords02
' start Compact/Repair database DbPrincipale
MyCompactRepair
' --- Other Import ---
' ...
' .....
End Sub
Sub AggiungiRecord()
' Codice per aggiungere record al database
End Sub
Sub EliminaRecord()
' Codice per eliminare record dal database
End Sub
Occorre aggiunge alcune considerazioni:
- Il Database principale non deve essere in uso
- E' necessario inserire alcuni controlli quando termina il Compatta/Ripristina… per esempio prima di refreshare i link delle tabelle collegate, assicurarsi con un ciclo o delle if che esista il DbPrincipale. Se esiste significa che l'operaone di compattazione ha avuto esito positivo. A questo punto si può procedere con i successivi processi di creazione tabelle ed eliminazione dei records
- ecc…ecc… (mi fermo qui non conoscendo bene lo scenario e lo stato dell'arte della tua applicazione)
Riepilogando possiamo dire che… Si ! si può fare, ma dall'esterno del database principale come descritto sopra.
Quindi l'unica differenza è quella di portare il codice le macro le form e le query (la parte di programmzaione) fuori dal database principale in un nuovo database dove aggiungere il collegamento e ricollegamento alle tabelle (i link) e la routine di compattazione/ripristino del database principale. Per il resto rimane tutto invariato.
Ciao .. ;-)