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