Newsgroup: it.comp.appl.access
Titolo: Riferimenti Diretti o Indiretti? [Test]

Ho notato che la maggior parte di voi per riferirsi ad un controllo o ad un
form, generalmente utilizza, i riferimenti indiretti:
Valore = Forms!NomeForm!NomeControllo.Value
anzichè
Valore = Form_NomeForm.NomeControllo.Value
oppure
Call Forms("NomeForm").SubPubblica
anzichè
Call Form_NomeForm.SubPubblica
Ho testato tutte le soluzioni misurandone il tempo di esecuzione e ho notato
che, utilizzazndo i riferimenti diretti a controlli e forms, a parte il
vantaggio che VBA propone i nome dalla barra popup, i tempi di esecuzione si
riducono all'incirca della metà. Esiste qualche altra ragione che non
conosco per utilizzare i riferimenti inderetti?
Ciao omnitow
Riporto il codice che ho utilizzato per i test
****Nel Form "Maschera1"****
Option Compare Database
Option Explicit
Public Function DammiValore() As Variant
DammiValore = Testo 'TextBox unico controllo del form
End Function
****In un modulo standard****
Option Compare Database
Option Explicit
Private Declare Function timeGetTime _
 Lib "winmm.dll" () As Long
Private lngStartTime As Long
Public Sub StartTimer()
    lngStartTime = timeGetTime()
End Sub
Public Function StopTimer() As Long
    StopTimer = timeGetTime() - lngStartTime
End Function
Sub TestProva()
Const TimeStop As Long = 100000
Dim Valore As Variant, I As Long
StartTimer
For I = I To TimeStop
'*****Codice di prova*****
Next
Debug.Print StopTimer
End Sub
Il riform viene caricato prima di lanciare la function test dall'immediata
I codici che ho testato + i risultati in millesimi di secondo sono i
seguenti:
1 -
'Valore = Forms("Maschera1").Controls("Code").Value '11746
2 -
'Valore = Form_Maschera1.Code.Value '7201
3 -
'Valore = Forms!Maschera1!Code.Value '11326
4 -
'Valore = Forms("Maschera1").DammiValore '15723
5 -
'Valore = Form_Maschera1.DammiValore '9144
6 -
'Valore = Forms!Maschera1.DammiValore '15562

 conosco per utilizzare i riferimenti inderetti?
    No, non credo.
    Probabilmente quello dei riferimenti col punto esclamativo e' un "vizio"
derivante dall'uso di versioni di Access precedenti la 97, quando al posto
di Visual Basic c'era Access Basic.
    Poi un po' la pigrizia, un po' la fretta, un po' la mancanza di
consapevolezza... fanno il resto.
    Personalmente la forma:
        Valore = Form_NomeForm.NomeControllo.Value
in linea di massima la evito e assegno Form_NomeForm ad una variabile
oggetto e scrivo:
        Valore = o.NomeControllo.Value
ottenendo un codice piu' facilmente manutenibile.
--
Ciao :-)
Maurizio
--------
?SPQR(C)
 X
--------

'Valore = Form_Maschera1.Code.Value '7201
ecc.
solo per curiosita', hai anche provato ad invertire la
sequenza, vero?
--
lorenzo coronati
---


Dunque i riferimenti indiretti vanno solo a discapito delle prestazioni?
Ciao omnitow
PS per la cronaca [Test2]
All'insegna dell'economia di codice (e quindi di calli sulle mani,
nient'altro direi... cmq...) dato che la propietà .Value di un controllo è
la propietà predefinita di ogni controllo (che può assumere valori
chiaramente), sorge la domanda:
NomeControllo.Value oppure NomeControllo?
facendo riferimento al codice del mio post precedente
codice testato + risultati in millesimi di secondi:
1-
Valore = Form_Maschera1.Code.Value '7270 / 7230
2-
Valore = Form_Maschera1.Code '7241 / 7280
praticamente identici

"Lorenzo Coronati" <lorenzo.coronati@liberopuntoit> ha scritto nel messaggio
news:3d9d6d6e...@news.edisontel.com...

'***** Codice completo nel modulo standard ******
Option Compare Database
Option Explicit
Private Declare Function timeGetTime _
 Lib "winmm.dll" () As Long
Private lngStartTime As Long
Public Sub StartTimer()
    lngStartTime = timeGetTime()
End Sub
Public Function StopTimer() As Long
    StopTimer = timeGetTime() - lngStartTime
End Function
Sub TestProva()
Const TimeStop As Long = 100000
Dim Valore As String, I As Long
StartTimer
For I = I To TimeStop
'****Codice****
Next
Debug.Print StopTimer
End Sub
'1 -
'Valore = Forms("Maschera1").Controls("Code").Value
'2 -
'Valore = Form_Maschera1.Code.Value
'3 -
'Valore = Forms!Maschera1!Code.Value
'4 -
'Valore = Forms("Maschera1").DammiValore
'5 -
'Valore = Form_Maschera1.DammiValore
'6 -
'Valore = Forms!Maschera1.DammiValore
****** La sequenza del test: ******
-senza modificare nulla tranne la riga '****Codice****
 copio una delle righe di cui sopra all'interno del ciclo
-salvo e compilo il modulo
-lancio TestProva dalla finestra immediata
-copio i risultati altrove
-ripeto la sequenza più volte in ordine diverso
 (i risultati variano nell'ordine delle decine di millesimi)
Anche se i risultati, nettamente differenti, non penso richiedano tutta
questa rigorosità
Ciao omnitow

 praticamente identici
    Quindi aggiungo ai motivi di cui sopra anche quello della velocita'. E
coi database trovarsi ad eseguire una operazione decine di migliaia di volte
non e' cosa rara.


 --------
A parte le c....e
Grazie per le dritte
Ciao omnitow

conosco per utilizzare i riferimenti inderetti?
Per consuetudine: è la notazione che trovi dappertutto, dall'help di Access ai files di esempio
sparsi ovunque per il web.
Differenze prestazionali sono riscontrabili solo testando il codice all'interno di cicli pesanti,
proprio come hai fatto tu.
In queste circostanze la cosa migliore (anzi, raccomandabile) è mettere "in cache" il valore del
controllo in una variabile di memoria prima dell'inizio del ciclo ... le prestazioni saranno molto
superiori rispetto al riferimento (diretto o indiretto non importa) al controllo.
A parte ciò, nella maggioranza dei casi ci si riferisce a controlli appartenenti alla Form o Report
aperti, e in tal caso è più semplice ed elegante utilizzare la notazione Me!<Nomecontrollo> oppure
Me.<Nomecontrollo> piuttosto che Form_NomeForm.NomeControllo.Value oppure
Forms!NomeForm!NomeControllo.Value
Quindi, all'atto pratico utilizzare una o l'altra notazione _qualora non sia preferibile a entrambe
mettere in cache i valori del controllo_ è questione di gusti.
Ciao, Silvio


Il mio intento era propio quello di testare i due metodi in casi estremi,
solamente per decidermi una volta per tutte su che metodo utilizzare. Resta
il fatto perň che passare ad un puntatore il riferimento diretto ad un
oggetto sia piů veloce che passarlo indirittamente. Un'altro pregio de rif.
diretti (come si č detto e non da trascurare direi) č la possibilita di
utilizzare l'intellisense, risparmiando memoria (della capa s'intende), ed
evitando possibili errori di compilazione.
Ciao omnitow

evitando possibili errori di compilazione.
Infatti non voglio convincerti a utilizzare la notazione "classica", ho semplicemente espresso un
parere sul perchè quasi tutti continuino a usarla senza troppe preoccupazioni.
Ciao.