10/06/2026 - Mailman ha scritto:
10/06/2026 - @Alex ha scritto:
Devi contarli in una Tabella o in una Maschera...?
Grazie @Alex come sempre.
Li devo contare in una tabella.
Attualmente adotto il primo Dcount che hai suggerito, ma provo anche gli altri per vedere se ci sono differenze, anche se la mia richiesta era finalizzata a capire quale metodo era il piu' consono.
Ragionavo sul fatto che il Dcount deve leggere e contare tutto il recordset, mentre se creo "al volo" un recordset gia' filtrato il conteggio e' limitato a soli pochi records per cui presumibilmente piu' veloce...
Set rst = DBEngine(0)(0).OpenRecordset("SELECT * FROM MiaTabella WHERE FK=" & MiaFK, dbOpenSnapshot, dbReadOnly)
La velocità va contestualizzata...!
Se la chiamata è singola la differenza di 50ms non ha senso di essere considerata... mentre se devi inserirlo in un Loop di un migliaio di Records, le cose cambiano.
Io ricordo vagamente di aver fatto un test e le differenze erano veramente molto ridotte a tal punto che io uso sempre DCount, perchè più semplice e più comodo.
Non avevo specificato che il risultato del conteggio puo' variare da minimo 1 a massimo 10 records...
Devo discriminare se il risultato e' 1 o piu' di 1
Potresti eventualmente fare una cosa simile:
SELECT
Count(FK) > 1 AS ConteggioFK
FROM
Dominio
HAVING
FK = TuoValore;
Questa restituisce un Boolean già fatto, allo stesso modo:
TuoValore=DCOUNT("*","Dominio", "FK=" & TuaFK) >1
TuoValore=DCOUNT("PK","Dominio", "FK=" & TuaFK)>1
TuoValore=DCOUNT("FK","Dominio", "FK=" & TuaFK)>1
Fai un test con un Timer ed un ciclo di 1000 interrogazioni segnando il Tempo prima di iniziare il Loop e dopo vedi dal differenza in ms e poi capisci se vale la pena o meno...
Sub DCountVsRecordset()
Const TABLE = "yourtablehere"
Const MAX = 1000
Dim clock As Single
Dim tmp As String
Dim i As Integer
clock = Timer
For i = 1 To MAX
tmp = DCount("*", TABLE, "......")
'tmp = DCount("FK", TABLE, "......")
Next
Debug.Print "DCount(): " & Round(Timer - clock, 4)
clock = Timer
For i = 1 To MAX
tmp = CurrentDb.OpenRecordset("SELECT Count(*) FROM " & TABLE).Fields(0)
Next
Debug.Print "Recordset: " & Round(Timer - clock, 4)
Beep
Debug.Print "***"
End Sub
Leggi anche questo, potresti avere sorprese piacevoli:
https://codekabinett.com/rdumps.php?Lang=2&targetDoc=access-performance-counting-records