07/05/2025 - Scolaretto ha scritto:
Ti ringrazio per i suggerimenti e ne farò tesoro. Alla prossima
Ma di nulla, ci mancherebbe... è solo un piacere se ti torna utile... ;-)
Vorrei lasciarti un esempio concreto peri 5 punti/spunti che ho lasciato in precedenza. (spero ti torni utile)

Per realizzare questa funzione esistono diversi metodi e tecniche. Ne prendiamo solo due per fare l'esempio.
Primo ESEMPIO utilizzando DBEngine(0)(0) , nessuna Gestione degli Errori, etc etc...

Analisi Function:
- Viene dichiarata una variabile di tipo Variant che conterrà i risultati restituiti dalle Stringhe Sql eseguite con DBEngine
- Il primo DBEngine : si fa carico di verificare l'esistenza della tabella TraceNumber e restituisce 1 se la tabella esiste, restituisce 0 se la tabella non esiste
- Il secondo DBEngine : se esiste la tabella TraceNumber, allora si fa carico di verificare se la somma dei valori della colonna TraceNumber > 0
- se > di 0 viene impostato il valore di ritorno della Function = True
- altrimenti viene impostato il valore di ritorno della Function = False
- Cosa non fa la Function:
- nessuna gestione degli errori per verificarese la tabella esiste o meno
- nessuna dichiarazione nuovi oggetti Database e Recordet
- nessuna operazione di chiusura e di rilascio dalla memoria degli oggetti Database e Recordset
..
Secondo ESEMPIO utilizzando Oggetti Espliciti per la connessione al database, al recordset e una gestione degli errori

Analisi Function:
- Viene impostatoun valore di Default = False che restituirà la Function in caso di errori
- Viene dichiarato un oggetto Dao.Database
- Viene dichiarato un oggetto Dao.Recordset
- Viene attivata una Gestione Errori
- Viene impostato CurrentDb per aprireun Recordset
- Viene impostato un Recordset per ricevere dalla connessione al Db il risultato di una Stringa Sql
- Viene letto il Recordset (rst) per determinare se esiste almeno un record
- se esiste almeno un record allora si prende il Valore della somma della Colonna TraceNumber
- se > di 0 viene impostato il valore di ritorno della Function = True
- altrimenti la Function ritorna il valore di Default che ha assunto all'inizio della routine - Function = False
- Vengono eseguite le operazioni al termine della Function sia per la condizione di errori intercettati oppure no
- si deve verificare se necessario chiudere il Recordset, dipende se si sono verificati errori oppure no e in quale punto della Function
- si rilasciano dalla memoria gli oggetti Database e Records
- Cosa non fa la Function o cosa potrebbe fare ?
- si potrebbe eliminarela gestione degli errori e in tal caso:
- dichiarare un nuovo oggetto TableDef - Dim tdf As DAO.TableDef
- enumerare con TableDef gli oggetti presenti in MsAccess
- determinare se la tabella MyTableTrace esiste
- se esiste allora procedere nel verificare se esiste il Recordset e ricavare il valore della somma nella colonna TraceNumber, etc...
- allafine della function aggiungere il rilascio dell'oggetto TableDef
.
Come puoi vedere le due function, anche se in modo diverso, fanno la stessa cosa e restituiscono lo stesso risultato.
Il codice è documentato riga per riga nelle parti salienti. Quindi sappiamo, oggi come fra enne anni, cosa fa e come lo fa.
Considerazioni finali:
- Il primo ESEMPIO con due semplici Stringhe Sql estrae le informazioni che necessitano e con un solo controllo restituisce il valore di ritorno per la Function
- usa pochissime righe di codice rendendo la Function coincisa, di facile leggibilità e manutenibilità
- controlla eventuali errori prima di procedere
- utilizza e libera la memoria in automatico
è molto performante
.
- Il secondo ESEMPIO utilizza più oggetti
- più righe di codice
- una gestione errori con le sue problematiche se non gestita in modo dettagliato
- utilizza più oggetti per fare riferimento al database e per estrarre e popolare un recordset
- alla fine dei processi si deve controllare/verificare quali oggetti chiudere e quali rilasciare dalla memoria
- meno performante del primo Esempio
- utilizza esplicitamente degli oggetti
- gli oggetti devono poi essere rilasciati manualmente dalla memoria
.
.Personalmente preferisco usare il primo esempio di codice.
Ecco qua... questi due esempi riepilogano i 5 piccoli consigli che in precedenza mi ero permesso di dare.
Tra le altre cose con DBEngine puoi fare proprio tutto.
Tutte le operazioni che esegui con gli oggetti DAO.Database e DAO.Recordset, le puoi tranquillamente eseguire con DBEngine.
Rendi il codice più performante, coinciso e robusto soprattutto se devi leggere un valore di ritorno dalle varie stringhe Sql.
Oppure poni il recordset estratto con DBEngine nel tuo DAO.Recordset per poter leggere e scorrere i records estratti, etc... etc...:
Esempio:

Oppure senza dichiare un nuovo oggetto Recordset ... basta leggere quello restituito direttamente da DBEngine
(ANCORA PIU' SEMPLICE, COINCISO E PERFORMANTE)

.
Stessa cosa per eseguire Insert / Update / Delete / Drop / Etc...

In questi casi non devi dichiare oggetti, chiuderli e rilasciarli. Ti basta eseguire la riga di codice DBEngine.
Si semplifica tantissimo, si migliorano le performance, puoi controllare eventuali errori di ritorno con dbFailOnError, etc...
mo' basta ... non ti annoio più con ste' cose, era solo per chiudere una parentesi aperta nel Thread... Prova a Provare... ;-)