Export Tabella DAO in Excel

di
Anonimizzato14170
il
6 risposte

Export Tabella DAO in Excel

Ragazzi ho bisogno di un consiglio da qualcuno che programma più frequentemente di me in VBA.
Da premettere che la mia versione è Access 2007 e non posso aggiornarla perché si tratta dell'azienda per la quale lavoro.
Ho bisogno di un programma che scorra una tabella di dipendenti e ne prenda il numero di matricola (T_DIPENDENTI); da questo poi deve lasciare una colonna vuota e inserire i giorni del mese che prenderà da un altra tabella (T_GIORNI) e lasciare un'altra colonna vuota.
T_DIPENDENTI e T_GIORNI sono tabelle collegate a file Excel perché devono essere aggiornabili mensilmente. Per ogni dipendente deve poi prendere la tabella così creata ed esportarla in un file Excel in rete in modo che ognuno possa caricarvi le ore lavorate.
Avevo creato il file che lavorasse in locale e funzionava benissimo. Successivamente ho iniziato a testarlo in rete e notavo che tutti gli Excel erano vuoti.
Sbattendoci un po' la testa avevo capito che il problema era il tempo di esecuzione delle query SQL, il programma non attendeva il termine della query prima di iniziare l'export.
E' stato sufficiente mettere un "do until" dopo la query che verificasse quando la tabella del prodotto raggiunge lo stesso numero di righe della tabella T_GIORNI:

Private Sub Comando0_DblClick(Cancel As Integer)


Dim dbs As Database
Set dbs = OpenDatabase("\\dati\Gestione Personale.accdb")
Dim tbl, tex, tgio As Recordset
 'Dim tabella As Recordset
Set tbl = dbs.OpenRecordset("SELECT * FROM T_DIPENDENTI")
Set tgio = dbs.OpenRecordset("SELECT * FROM T_GIORNI")

DoCmd.SetWarnings False
Do While tbl.EOF = False
    'Azzera tabella d'appoggio
    dbs.Execute " DELETE * FROM T_EXCEL "

    Matricola = tbl("MATRICOLA")
    'Metto i record di data e matricola
   

 DoCmd.RunSQL ("INSERT INTO T_EXCEL ( matricola, Ntw_odm, data, ore )" _
            & "  SELECT '" & Matricola & "', null, T_GIORNI.data,null " _
           & " FROM T_GIORNI; ")




  Do
  
     Set tex = dbs.OpenRecordset("SELECT * from T_EXCEL")
        
 Loop Until tex.RecordCount = tgio.RecordCount
    

    'Carico il nome del file e la matricola del dipendente
    strFileName = tbl("FILE")
    strPath = "\\dati\Personale\" & strFileName
    DoCmd.OutputTo acOutputTable, "T_EXCEL", "Excel97-Excel2003Workbook(*.xls)", strPath, False, "", 0, acExportQualityPrint

    'Avanza record
    tbl.MoveNext
Loop

DoCmd.SetWarnings True




dbs.Close
Beep
    MsgBox "Generazione nuovi file", vbInformation, "Aggiornamento effettuato!"
    DoCmd.Close acForm, "M_SI_NO"
End Sub
Il programma così funziona efficace ma non efficiente: è lentissimo (basta immaginare quante query esegue per via di quel piccolo ciclo). Questa è comunque l'unica soluzione che finora mi ha permesso di arrivare al risultato, esiste un modo più semplice per dirgli di aspettare la fine della query e fare a meno della parte col ciclo?

Se non sono stato chiaro non esitate a domandare.
Grazie

6 Risposte

  • Re: Export Tabella DAO in Excel

    Chi ti risponde non sa usare VBA, ma, dal discorso da te impostato...c'è qualcosa che non capisco:
    Perchè parli di "scorrere" tutti i Dipendenti?
    Lasciare una colonna vuota?
    Possibile che è necessario avere una tabella Date?
    Io credo che, se le tabelle sono correttamente impostate/correlate e le query altrettanto, non dovresti fare altro che semplicemente "esportare" il risultato di una query in Excel e nulla più. Trovo che, proprio perchè vai a prendere dati da Excel per poi mettere in moto tutto quel meccanismo, che ti stai complicando la vita.
    Non voglio dire altro di più perchè, ripeto non so usare VBA, ma soprattutto ragiono solo ed esclusivamente secondo la logica Access.
    Un parere di utente più esperto mi conforterebbe da quello che ho detto, oppure accetto volentieri aggiornamenti del caso.
  • Re: Export Tabella DAO in Excel

    Ciao...
    Se non ho capito male tu hai un db organizzato in questa maniera:
    - X Tabbelle collegate ad altrettanti X fogli Excel disseminati nella rete.
    - in access tu gestisci i dati del personale attraverso la lettura di tali tabelle collegate.
    - E vorresti, ogni mese e con un click, creare altri fogli excel con una sorta di calendario mensile, per ogni dipendente che vengono salvati in... \\dati\Personale\ con un nome specifico specificato nel campo "FILE" della tabella t_dipendenti.... poi ridissemini i fogli e ti ricolleghi?
  • Re: Export Tabella DAO in Excel

    Esatto!
    In pratica lo scopo della funzione è ripulire i file excel che i vari dipendenti valorizzano mese mese. Deve essere valorizzato per ogni file la prima colonna con la matricola ripetuta su ogni riga, la seconda prevede il nome del progetto (quindi bianca perchè valorizzata dagli utenti), la terza.colonna deve essere valorizzata con le date dei soli giorni lavorativi di quel mese (che fornisco io con il file T_GIORNI) e la quarta è valorizzata dagli utenti con le ore giornaliere. Mi servono dei file excel così impostati in modo da darli massivament in pasto al nostro gestionale che li carica a sistema.L'inserimento automatico.di.matricola e date è una esigenza nata per ridurre l'errore umano (incredibile il numero di persone che.sbagliava la propria matricola).
  • Re: Export Tabella DAO in Excel

    MMM. credo che migliorare le prestazioni di un esportazione/creazione così massiccia di file excel sia un tantino,oltre i limiti sopportabilità in termini di tempo di attesa ... ci vuole tempo!!!

    Potresti valutare la possibilità di demandare la creazione di detto file direttamente all'utente?

    mi spiego meglio:

    Immagina che gli utenti abbiano un loro DB con una tabella collegata ad DB centralizzato (che gestirai tu)... ognuno degli utenti, con il loro DB "front-end" potrebbe crearsi ill foglio autonomamente... anche loro premendo un pulsante!!!

    no?
  • Re: Export Tabella DAO in Excel

    Vedi se questi possono aiutarti:
    http://forum.masterdrive.it/access-79/access-esportare-dati-in-excel-xml-50060/

    oppure questo:
    http://forum.masterdrive.it/access-79/access-definire-i-campi-esportare-in-excel-54294/
  • Re: Export Tabella DAO in Excel

    Il problema non è l'esportazione che è lenta, prima che inserissi il ciclo di sotto la funzione impiegava pochi secondi.
    
    Do
      
         Set tex = dbs.OpenRecordset("SELECT * from T_EXCEL")
            
     Loop Until tex.RecordCount = tgio.RecordCount
    
    Anzi il problema era opposto, passava direttamente all'export senza attendere il completamento della INSERT, e così esportava dei record mancanti o addirittura nessuno. Con il ciclo che ho inserito mi assicuro che l'esecuzione continui solo quando la INSERT ha caricato tutti i record. Il problema è che il ciclo stesso mi rallenta l'esecuzione della INSERT, per cui il programma impiega quasi 10 min a terminare. Mi chiedo se esiste un modo alternativo a questo ciclo che mi permetta di mettere in pausa vba per attendere che SQL termini le sue operazioni in maniera da farli girare in maniera "sincrona".
    Purtroppo non ho il potere per creare modifiche a livello di organizzazione aziendale perché non sono né sistemista né programmatore. Se riuscissi a modificare in maniera efficiente il programma bene, perché alleggerirei il mio carico di lavoro, altrimenti non posso agire.
Devi accedere o registrarti per scrivere nel forum
6 risposte