Compattazione Database all'interno di una Macro

di il
21 risposte

21 Risposte - Pagina 2

  • Re: Compattazione Database all'interno di una Macro

    Non dico che sia così in questo caso… ma spesso i db presentano dimensioni eccessive perché non sono normalizzati. Questo si ripercuote anche sulle prestazioni di elaborazione delle query.

  • Re: Compattazione Database all'interno di una Macro

    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:

    1. Creazione di un database DbImport
      1. Crea un nuovo database che sarà utilizzato durante per i processi di creazione ed eliminazione delle tabelle nel DbPrincipale
      2. Copiare il codice, le query, form, ecc… (solo la parte che interessa al processo) in DbImport
    2. Collegamento al database principale
      1. Stabilire le connessioni alle tabelle che si trovano in DbPrincipale (link di collegamento delle tabelle interessate al processo)
    3. Esecuzione della routine di Import/Cancellazione
      1. Eseguire la routine che crea / cancella i records nel DbImport
      2. Ogni volta che si vuole, eseguire la Compattazione di DbPrincipale chiudendo le connessioni in corso su DbImport
    4. Disconnessione e compattazione del database principale
      1. 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
      2. Esequire la compattazione di DbPrincipale
    5. Ripetizione dei passaggi 2-4
      1. 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:

    1. Il Database principale non deve essere in uso
    2. 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
    3. 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 ..  ;-)

  • Re: Compattazione Database all'interno di una Macro

    25/03/2024 - By65Franco ha scritto:

    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.

    Si Franco, si può fare … su un altro database e scrivendo codice vba, dubito che sia facilmente implementabile da chi, per propria ammissione, conosce poco vba e anche io ho suggerito di agire su un altro DB.

    Codice per compattare un DB (chiuso, non in uso da altri) in un nuovo DB :

    Application.DBEngine.CompactDatabase DBSource, DBDest

    Dubito che gli sia sufficiente la precedente riga di codice ma vedremo gli sviluppi …

    Resto dell'idea che sarebbe necessario prima capire se è possibile ridurre la mole di dati e se proprio non fosse possibile, solo allora mi concentrerei su come compattare il DB. Peraltro, se l'OP avesse voglia e tempo di dettagliare meglio come arriva ad avere i record e come li vuole unire, probabilmente si potrebbero suggerire delle query che gli fornirebbero i risultati desiderati anche senza dover fare questi giri di compattazione delle tabelle. 

    Ciao

  • Re: Compattazione Database all'interno di una Macro

    26/03/2024 - max.riservo ha scritto:


    Dubito che gli sia sufficiente la precedente riga di codice ma vedremo gli sviluppi …

    Resto dell'idea che sarebbe necessario prima capire se è possibile ridurre la mole di dati

    Ciao Max… come va ? 

    hai pienamente ragione e concordo con te.

    Anche la tua è un ottima strada da percorrere. Quindi adesso sa che si può fare e anche con approcci diversi e non come pensava di fare lui. Quindi al quesito del thread ha ricevuto tutte le risposte e in modo ben  argomentato. 

    Anch'io, come te, prima di tutto mi preoccuperei di sfoltire dalle tabelle le colonne e le righe che non servono allo scopo e se è percorribile questo approccio allora si riesce a capire quale sia la soluzione più adatta per il quesito posto.

    Sono anch'io convinto che solo con le query e con le macro non si va molto lontani…. due righe di codice sono indispensabili per snellire, migliorare e avere risultati eccellenti e/o accettabili. 

    Penso che la cosa importante per l' OP sia quella di aver capito che certe cose si possono fare, ma soltanto a certe condizioni.
    Se vengono a meno i prerequisiti minimi, è assai difficile o improbabile. E come dici tu, adesso vediamo gli sviluppi.

    Un salutone Max

    ciaooo ;-)

  • Re: Compattazione Database all'interno di una Macro

    A questo punto la questione non è più compattare o non compattare, quando farlo e come farlo ma usare uno strumento più adeguato.

    Dato che si parla di operazioni massive con 800 mila righe,mi sembra proprio il caso di passate a SQL Server o simili. 

  • Re: Compattazione Database all'interno di una Macro

    Buongiorno a tutti. Leggo tutto questa mattina e vi ringrazio per i suggerimenti.

    Ci provo subito e vi faccio sapere. Comunque grazie a tutti!!!!!

  • Re: Compattazione Database all'interno di una Macro

    26/03/2024 - oregon ha scritto:


    A questo punto la questione non è più compattare o non compattare, quando farlo e come farlo ma usare uno strumento più adeguato.

    Dato che si parla di operazioni massive con 800 mila righe,mi sembra proprio il caso di passate a SQL Server o simili. 

    Ciao oregon, 

    assolutamente si, meglio spostarsi su sql server, ma sembra che non possa farlo per le restrizioni che vengono impostate dalla sua organizzazione.

    Personalmente non ho mai avuto problemi in ambiente office, sia con access che con excel, su database di qualche decina di milioni di records presenti nei server… sempre collegato in odbc lasciando fare al server il lavoro da server e i client l'umile lavoro da client senza spostare mai i dati, trattando solo i risultati desiderati a fronte di eventuali estrapolazione da stampare/conservare/spedire.E per operazioni molto pesanti, dal lato server preconfezionavo le informazioni riducendo il compito del client al minimo indispensabile… ottenendo così prestazioni più che ottimali.

    Va capito lo scenario in questione per verificare la fattibilità e per individuare l'approccio più corretto.

    Ciaoooo ;-)

Devi accedere o registrarti per scrivere nel forum
21 risposte