Compattazione Database all'interno di una Macro

di il
21 risposte

Compattazione Database all'interno di una Macro

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.

Esiste un comando di questo genere per caso senza lanciare le query a mano e fare “Chiudere e compatta database” ogni volta? Mi serve perché nell'esempio vi ho parlato di solo 3 tabelle ma in realtà ne avrei qualcuna in più.

Grazie.

Paolo

21 Risposte

  • Re: Compattazione Database all'interno di una Macro

    L'operazione di compattazione di un database e' un'operazione che va fatta, “concettualmente”, a “palle ferme” ;-)
    .
    E' un'operazione che va fatta quando NESSUNO e' collegato, per un'infinita' di motivi tecnici che non sto qui ad elencare.
    Se vuoi, pensala in questo modo: 

    e' come voler cambiare un isolatore su un traliccio dell'alta tensione MENTRE nei cavi PASSA L'ALTA TENSIONE.

    Si puo' fare, ovviamente, MA il rischio di farsi MOOOOLTO male (ed in questo caso di fare MOOOOLTO male al database) e' ESTREMAMENTE ALTO.

  • Re: Compattazione Database all'interno di una Macro

    25/03/2024 - migliorabile ha scritto:


    L'operazione di compattazione di un database e' un'operazione che va fatta, “concettualmente”, a “palle ferme” ;-)
    .
    E' un'operazione che va fatta quando NESSUNO e' collegato, per un'infinita' di motivi tecnici che non sto qui ad elencare.
    Se vuoi, pensala in questo modo: 

    e' come voler cambiare un isolatore su un traliccio dell'alta tensione MENTRE nei cavi PASSA L'ALTA TENSIONE.

    Si puo' fare, ovviamente, MA il rischio di farsi MOOOOLTO male (ed in questo caso di fare MOOOOLTO male al database) e' ESTREMAMENTE ALTO.

    Innanzitutto grazie per la risposta. Ma quindi si può fare? Perché l'utilizzo del database e dei dati per gli utenti si avrà solo alla fine della macro ma faccio tutto questo per evitare di arrivare al limite dei 2,095 Giga per evitare di creare più database con più tabelle e usufruire di un solo database.

  • Re: Compattazione Database all'interno di una Macro

    25/03/2024 - paolo792 ha scritto:


    … c'è la possibilità di inserire in una macro la compattazione del database che non lo chiuda?

    NO e Migliorabile ti ha dato dei buoni motivi comunque per non farlo.

    Se il tuo problema è quello di non allocare spazio ‘inutile’ per il DB, ovvero se vuoi recuperare spazio dopo aver eseguito operazioni di aggiornamento/cancellazione massive si potrebbe valutare l'ipotesi di lavorare su un Database ‘temporaneo’ importando i dati definitivi nel DB principale.

    Per percorrere una simile strada occorre :

    • che tu conosca VBA (dimentica le macro)
    • che tu abbia ben chiaro cosa devi fare con i dati (se vuoi esponi maggiormente nel dettaglio cosa devi fare - utilizza una terminologia chiara così come una nomenclatura a prova di confusione)
    • che tu sia in grado di scrivere le query che agiscono su tabelle anche al di fuori del DB corrente

    Se ho compreso la tua esigenza, concettualmente devi :

    • creare un DB ‘temporaneo’ tramite VBA
    • creare e riempire dal DB principale la tabella T1 dentro il DB temporaneo
    • elaborare la tabella T1 dal DB Temp per (credo, ma questo lo sai tu) aggiornare qualche tabella nel DB principale
    • creare e riempire dal DB principale la tabella T2 dentro il DB temporaneo
    • elaborare la tabella T2 dal DB Temp per (credo, ma questo lo sai tu) aggiornare qualche tabella nel DB principale
    • eliminare, se necessario, i dati superflui nella tabella T1 del DB Temp (potrebbe non essere necessario se alla fine elimini il DB temporaneo)
    • procedere con le altre tabelle …
    • cancellare il DB temporaneo perché non più utile
  • Re: Compattazione Database all'interno di una Macro

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


    25/03/2024 - paolo792 ha scritto:


    … c'è la possibilità di inserire in una macro la compattazione del database che non lo chiuda?

    NO e Migliorabile ti ha dato dei buoni motivi comunque per non farlo.

    Se il tuo problema è quello di non allocare spazio ‘inutile’ per il DB, ovvero se vuoi recuperare spazio dopo aver eseguito operazioni di aggiornamento/cancellazione massive si potrebbe valutare l'ipotesi di lavorare su un Database ‘temporaneo’ importando i dati definitivi nel DB principale.

    Per percorrere una simile strada occorre :

    • che tu conosca VBA (dimentica le macro)
    • che tu abbia ben chiaro cosa devi fare con i dati (se vuoi esponi maggiormente nel dettaglio cosa devi fare - utilizza una terminologia chiara così come una nomenclatura a prova di confusione)
    • che tu sia in grado di scrivere le query che agiscono su tabelle anche al di fuori del DB corrente

    Se ho compreso la tua esigenza, concettualmente devi :

    • creare un DB ‘temporaneo’ tramite VBA
    • creare e riempire dal DB principale la tabella T1 dentro il DB temporaneo
    • elaborare la tabella T1 dal DB Temp per (credo, ma questo lo sai tu) aggiornare qualche tabella nel DB principale
    • creare e riempire dal DB principale la tabella T2 dentro il DB temporaneo
    • elaborare la tabella T2 dal DB Temp per (credo, ma questo lo sai tu) aggiornare qualche tabella nel DB principale
    • eliminare, se necessario, i dati superflui nella tabella T1 del DB Temp (potrebbe non essere necessario se alla fine elimini il DB temporaneo)
    • procedere con le altre tabelle …
    • cancellare il DB temporaneo perché non più utile

    Purtroppo non conosco molto il VBA, per questo mi affido a macro.

    Diciamo che volevo fare il tutto per automatizzare e lanciare giornalmente una macro (io o i colleghi) evitando di fare troppi passaggi e soprattutto utilizzando un unico database. Da profano, siccome vedevo che Access oltra al comando di compattazione e ripristino ha nelle opzioni la compattazione del DB quando viene chiuso Access ho pensato ci fosse anche un comando o una function che potesse farlo senza chiudere il Db.

    Mi rassegno quindi……..

  • Re: Compattazione Database all'interno di una Macro

    Cmq non credo che la compattazione riesca a scongiurare del tutto il problema del raggiungimento della capacità massima dei 2Gb. Certo che ce ne vuole ad arrivare a 2Gb di memoria per un db access. Sicuro che non ci siano immagini dentro?

  • Re: Compattazione Database all'interno di una Macro

    25/03/2024 - Antony73 ha scritto:


    Cmq non credo che la compattazione riesca a scongiurare del tutto il problema del raggiungimento della capacità massima dei 2Gb. Certo che ce ne vuole ad arrivare a 2Gb di memoria per un db access. Sicuro che non ci siano immagini dentro?

    No purtroppo, perché le 3 tabella di cui parlavo nell'esempio hanno attorno alle 800.000 righe ciascuna per una 30 di colonne. Oltre a qualche tabella più piccola che mi fa arrivare a 1,9 gb. Tra un po' le stesse query giornaliere, poiché incrementali, arriveranno al limite massimo.

  • Re: Compattazione Database all'interno di una Macro

    @paolo792, ci sono TANTE strategie che si possono adottare per ovviare alla dimensione ‘mastodontica' di una tabella. Ovviamente NESSUNA SOLUZIONE e' a costo ‘zero’, e TUTTE LE SOLUZIONI sono valide per TUTTI i tipi di DBMS, non solo per Access.

    la piu' banale e' partizionare la tabella ‘orizzontalmente’ basandoti su qualche condizione, in modo da avere un po di righe nella tabella 1, un po' nella tabella 2, ecc.

    Ad esempio puoi partizionare le tabelle per ‘anno’ o 'anno/mese'. C'e' l'imbarazzo della scelta

    un'altra e' partizionare la tabella ‘verticalmente’: un po' di colonne nella tabella 1, un po' nella tabella 2, …

    un'altra soluzione e' rimpiazzare access con un dbms che ‘nativamente’ supporta tabelle con ‘miliardi di record’, ad esempio sql server.

    Poi ci sara' da modificare il codice di conseguenza.

    Access e' un prodottino per uso ‘casereccio’ con tabelline con al massimo 20.000 record. Diciamo che il limite e' una tabella con 100.000 record, ma non oltre. NON E' che non lo si possa fare, MA Access NON E' STATO PENSATO per questi volumi.

    Tu ne hai una 8 volte piu' grossa, e quella da 100.000 e' gia' 5 volte piu' grossa di una tabella Access normale.

    E' un po' come voler trasportare un blocco di marmo da divere tonnellate con un'Ape Piaggio! Poverina!

    L'Ape trasporta fino a qualche centinaio di kg. 

    Per le tonnellate ci sono i Dumper della Caterpillar!

  • Re: Compattazione Database all'interno di una Macro

    25/03/2024 - migliorabile ha scritto:


    @paolo792, ci sono TANTE strategie che si possono adottare per ovviare alla dimensione ‘mastodontica' di una tabella. Ovviamente NESSUNA SOLUZIONE e' a costo ‘zero’, e TUTTE LE SOLUZIONI sono valide per TUTTI i tipi di DBMS, non solo per Access.

    la piu' banale e' partizionare la tabella ‘orizzontalmente’ basandoti su qualche condizione, in modo da avere un po di righe nella tabella 1, un po' nella tabella 2, ecc.

    Ad esempio puoi partizionare le tabelle per ‘anno’ o 'anno/mese'. C'e' l'imbarazzo della scelta

    un'altra e' partizionare la tabella ‘verticalmente’: un po' di colonne nella tabella 1, un po' nella tabella 2, …

    un'altra soluzione e' rimpiazzare access con un dbms che ‘nativamente’ supporta tabelle con ‘miliardi di record’, ad esempio sql server.

    Lo so, ci avevo pensato. 

    Purtroppo SQL Server nella mia azienda lo può avere solo l'ITC e, per farmi qualche estrazione in proprio, devo utilizzare per forza Access anche se gli archivi sono enormi. In pratica mi devo adattare……

    Grazie.

  • Re: Compattazione Database all'interno di una Macro

    Perche' solo l'itc?

    installatelo locale, in una vm, o chiedi all'itc che ti fornisca un'istanza per lo sviluppo.

    Non devi mica installare la versione enterprise! ti basta la versione community (agratis) che gia' cosi' e' infinitamente piu' potente di access

  • Re: Compattazione Database all'interno di una Macro

    25/03/2024 - migliorabile ha scritto:


    Perche' solo l'itc?

    installatelo locale, in una vm, o chiedi all'itc che ti fornisca un'istanza per lo sviluppo.

    Non devi mica installare la versione enterprise! ti basta la versione community (agratis) che gia' cosi' e' infinitamente piu' potente di access

    Magari!!!! Per la sicurezza non si può installare niente. PC bloccati. Lavoro nel Marketing di una Banca.

  • Re: Compattazione Database all'interno di una Macro

    25/03/2024 - paolo792 ha scritto:


    Magari!!!! Per la sicurezza non si può installare niente. PC bloccati. Lavoro nel Marketing di una Banca.

    È vero. Molte aziende e gli enti pubblici non permette soluzioni alternative ad access per gestire database. Forse è questo il segreto del suo successo.

  • Re: Compattazione Database all'interno di una Macro

    Per darti eventuali consigli che possano risolvere il problema bisognerebbe almeno vedere la struttura del database, almeno l'immagine della finestra delle relazioni dove poter vedere tutte le tabelle e tutti i relativi campi.

  • Re: Compattazione Database all'interno di una Macro

    25/03/2024 - Antony73 ha scritto:


    25/03/2024 - paolo792 ha scritto:


    Magari!!!! Per la sicurezza non si può installare niente. PC bloccati. Lavoro nel Marketing di una Banca.

    È vero. Molte aziende e gli enti pubblici non permette soluzioni alternative ad access per gestire database. Forse è questo il segreto del suo successo.

    Antony, il rischio informatico maggiore per le aziende (di qualsiasi dimensione)  deriva da : navigazione internet, virus, malware, furto di dati sensibili (segreti industriali).

    Considerando che non si può eliminare la connettività internet gli IT agiscono limitando/eliminando tutto il superfluo e questo si concretizza :

    • nel rinforzo dell'accesso ad internet (antivirus/firewall/etc)
    • nella limitazione all'utilizzo delle porte USB (a volte con protezione meccaniche ma sempre di più tramite policy del sistema operativo)
    • nell'impedire l'accesso ai PC tramite account privilegiati (impedendo quindi la modifica a registry e/o a configurazione hw)
    • nell'impedire all'utente l'installazione di qualsiasi software
    • nell'utilizzare sw molto potenti per l'analisi del traffico di rete internet/intranet

    Access ha la ‘fortuna’ di essere spesso preinstallato/disponibile nativamente … tutto qui.

  • Re: Compattazione Database all'interno di una Macro

    25/03/2024 - Stifone ha scritto:


    Per darti eventuali consigli che possano risolvere il problema bisognerebbe almeno vedere la struttura del database, almeno l'immagine della finestra delle relazioni dove poter vedere tutte le tabelle e tutti i relativi campi.

    Diciamo che è un po' come l'ho descritta ma con tanti dati. In pratica scarico una serie di dati anagrafici dei clienti comprensivi di rapporto di mutuo, tasso, data accensione e così via. Successivamente replico la stessa tabella affiancando ulteriori dati di rapporto. Non faccio una query di aggiornamento perché essendo oltre 800 mila record ci mette una vita. Subito dopo creo un'altra query affiancando altre colonne con altri dati. 

    Non posso purtroppo fare tutto in un'unica query perché alcune tabelle non hanno tutti i dati che mi servono e lo devo per forza fare in più passaggi (purtroppo l'unidirezionalità della query non mi aiuta). So che così come spiegata magari è difficile ma se ti basi sul primo esempio è più semplice. E' come se creassi prima 1 tabella, poi una seconda e successivamente cancello la prima per risparmiare spazio. Per questo volevo compattare il db ma facendolo da macro direttamente senza lanciare manualmente le query…..

Devi accedere o registrarti per scrivere nel forum
21 risposte