Newsgroup: it.comp.appl.access
Titolo: Alternative alle funzioni di Dominio

Immaginiamo di avere una semplicissima tabella di nome "Tabe"
con i campi:   
- Id ----- Contatore Key
- Quan --- Numerico
 
Vogliamo trovare con VBA 1 numero ( o valore ) che corrisponde alla 
somma del campo "Quan" sui record che abbiano "Id" maggiore di 4
 
La cosa piu immediata, breve., e semplice è una funzione di Dominio ( DSum )
ma noi non vogliamo utilizzarla perche ..........
 
 
La alternativa puo essere un RecordSet ( Esteso o compatto )
ma vorrei delle opinioni in proposito,    
o meglio delle altre alternative
 
 
Public Sub AltDominio()
 
' Caso 1 ------ Una classica funzione di Dominio
Dim xxxx1 As Long
xxxx1 = DSum("Tabe.Quan", "Tabe", "Tabe.Id>4")
MsgBox xxxx1
 
 
' Caso 2 ------ Una alternativa "Ben fatta"
Dim xxxx2 As Long
 
Dim DBx As DAO.Database
Set DBx = CurrentDb
 
Dim RSx As DAO.Recordset
Set RSx = DBx.OpenRecordset("SELECT Sum(Tabe.Quan) FROM Tabe WHERE Tabe.Id>4;", dbOpenDynaset)
 
xxxx2 = RSx.Fields(0).Value
 
RSx.Close
DBx.Close
Set RSx = Nothing
Set DBx = Nothing
 
MsgBox xxxx2
 
 
' Caso 3 ------ Una alternativa "Sporca e compatta"
Dim xxxx3 As Long
xxxx3 = CurrentDb.OpenRecordset("SELECT Sum(Tabe.Quan) FROM Tabe WHERE Tabe.Id>4;").Fields(0).Value
MsgBox xxxx3
 
End Sub
 
 
--- Caso 1 
è la classicissima e comoda funzione di dominio,
 
--- Caso 2
è un RecordSet con tutte le sue dichiarazioni, settaggi, chiusure
 
--- Caso 3
è ancora il Caso 2 ridotto all'osso
 
 
               Grazie per le opinioni
 
 
 
 
 
 
 

personalmente funzioni di dominio mai. se passi ad un motore di database diverso da access sei finito. uso solo vba, caso 2. ma: dbs.opendatabase(sql, dbopensnapshot, dbreadonly) ' non hai bisogno del dynaset. così è più leggero e veloce.
dbs.close non serve a nulla. il db tanto nn si chiude

 Grazie per le opinioni
 
altre alternative?... non ce ne sono...
 
-- 
------------
Pablitomf
Napoli sempre nel "Q"uore!
"mammasantissima" si nasce, non si diventa.
 
TheSpaceCowboy : 
Britos deve recuperare per arrivare in forma al prossimo
infortunio - 24/10/12
 

Chiudere e distruggere è importante per liberare le risorse della memoria è ovvio che il db non si chiude se è quello di lavoro, ma si chiude l'istanza...
 
Saluti.
@alex

Se non lavori con Workspace usa il Puntatore di istanza dell'oggetto database cosi:
Set Rs=Dbengine (0)(0).Openrecordset (.....)
è diretto più rapido proprio perché non apre nuove istanze come invece fa CurrentDb. 
Se poi hai linked table tieni sempre un recordset vuoto aperto per mantenere viva la connection nella garbage collection. 
Saluti
@alex

> Se poi hai linked table tieni sempre un recordset vuoto aperto per mantenere viva la connection nella garbage collection. 
Ma questa è una evoluzione della "TabellaPilota" che apri nello "SpeedTest"  ?
 
 
Tu dici un RecordSet vuoto.   ma come minimo deve contenere 1 record ...
 
Dim RSV As DAO.Recordset
Set RSV = DBEngine(0)(0).OpenRecordset("SELECT TOP 1 NomeCampo FROM NomeTabellaCollegata")
 
oppure mi sfugge qualcosa ?
 
 
Grazie

È esattamente quello non serve un record ma serve che rimanga aperta la connessione nel pool, quindi anche un Rs nullo va bene

 È esattamente quello non serve un record ma serve che rimanga aperta la connessione nel pool, quindi anche un Rs nullo va bene
 
Ci sono alternative  alle altre funzioni di Dominio  esempio Dmin e Dmax
 
Grazie

 Grazie

il 'banale' sql (sum, count, top .....)

MsgBox xxxx3
 
Buongiorno a tutti.
 
Da qualche giorno seguo questo thread.
Non ho ancora trovato il tempo per provarla. Ma... veramente funziona 
l'alternativa "Sporca e compatta" Caso 3??
 
xxxx3 = CurrentDb.OpenRecordset("SELECT Sum(Tabe.Quan) FROM Tabe WHERE 
Tabe.Id>4;").Fields(0).Value
 
Io lo trovo bellissima: una vera alternativa alle funzioni di dominio 
DlookUp e altre.
Non devi definire oggetti, non ne lascia aperti etc.
Mi pare che non abbia contoindicazioni, giusto?
 
Quindi, in base alle successive risposte, sembra che la riga migliore sia:
xxxx3 = Dbengine (0)(0).OpenRecordset("SELECT Sum(Tabe.Quan) FROM Tabe WHERE 
Tabe.Id>4;", dbopensnapshot, dbreadonly).Fields(0).Value
con Dbengine (0)(0), dbopensnapshot e dbreadonly
 
Me lo confermate?
 
Grazie.
 
Ciao.
 
 
 
 

Sì lo si potrebbe confermare ma serve sempre contestualizzare i concetti.