Newsgroup: it.comp.appl.access
Titolo: Che problema nel NON chiudere recordset aperti ?

Dentro funzioni o procedure, per agire su dati attualmente non visibili 
nella form, si usa il classico
 
MyRs=CurrentDb.OpenRecordset("select COD, DES from ARTICOLI")
...
...
MyRs.close
 
Bon, estetica a parte, cosa cambia se quell'ultima riga non c'e'?
Le risorse allocate durante l'apertura, vengono rilasciate (dalla fine 
della funzione) oppure no?
 
 

Dipende dove é stato definito myRs.
Se é dentro la funzione o dentro modulo e se private o public

 
 
Parlo di definizione MyRS dentro una funzione
Supponiamo la funzione sia Private
E se fosse Public ?
 


Non cambia nulla in una Funzione, le variabili che sono dichiarate internamente ad una Function/Sub sono Private e, teoricamente vengono cancellati i riferimenti alla chiusura...(salvo le variabili STATIC).
Il problema è proprio il RILASCIO risorse, invece del cancellamento dei Riferimenti...!
 
Per rilasciare libera la risorsa, si deve distruggere l'oggetto, per cancellare il riferimento no.
Mi spiego, le variabili funzionano occupando un'area di Memoria, ma poi il Sistema usa i POINTER per ripescarla...
Quando si distrugge l'oggetto l'area è libera nuovamente, quando si cancella solo il POINTER semplicemente si disassocia il PUNTATORE nel programma all'area che si era riservata nella CACHE del programma...
In sostanza finchè non chiudi Access quell'area rimarrà non riutilizzabile ma non più puntabile.
 
Un esempio è questo per capire meglio, invece di puntare ad un OGGETTO specifico come una Form, possiamo sfruttare il suo POINTER con risparmio di peso..., capisco che non sia poi così usuale e comprensibile ma Tecnicamente ineccepibile:
 
In una Classe definisco una Proprietà che espone la FORM CHIAMANTE.
La classe ovviamente avrà il Property(Set e Get) per passare o recuperare la Form chiamante, ma internamente alla Classe invece di Memorizzare l'oggetto FORM, memorizzo solo il POINTER:
 
#If Win64 Then
    Private Function ObjFromPtr(ByVal pObj As LongPtr) As Object
#Else
    Private Function ObjFromPtr(ByVal pObj As Long) As Object
#End If
    Dim Obj                     As Object
    CopyMemory Obj, pObj, 4
    Set ObjFromPtr = Obj
    CopyMemory Obj, 0&, 4
End Function
 
#If VBA7 Then
    #If Win64 Then
        Private mlFormCaller    As LongPtr
    #Else
        Private mlFormCaller    As Long
    #End If
#Else
    Private mlFormCaller        As Long
#End If
 
Public Property Get FormCaller() As Access.Form
     Set FormCaller = ObjFromPtr(mlFormCaller)
End Property
Public Property Set FormCaller(Obj As Access.Form)
     mlFormCaller = ObjPtr(Obj)
End Property
 
Come si può vedere nella Classe NON memorizzo un Oggetto di Tipo Access.Form, ma un Long(LongPtr) che rappresenta il POINTER all'area in cui risiede il mio Oggetto Access.Form
 
 
RIASSUMENDO:
In buona sostanza una volta con i vecchi PC limitati in risorse la cosa era più evidente, oggi molto meno... tuttavia inizia a scrivere funzioni RICORSIVE e magari potresti vederne il limite...
 
@Alex

 funzione) oppure no?
 
Io non ci vedo nulla di "classico" in MyRs.Close, ci vedo solo
qualcosa di inutile.
Inutile anche se tu volessi nella medesima procedura riutilizzare
le stesso nome con un nuovo:
Set MyRs = CurrenrDb.OpenRecordset("altra query")
Che neppure in tale circostanza è necessario premettere MyRs.Close
 
È una della tante prolissità dei programmatori MS, che sanno
costruire degli ottimi linguaggi... che poi non sanno programmare
decentemente.
 
Bruno


Molto interessante
Si e' evidente che con funzioni ricorsive questo aspetto e' molto 
importante, ed anche se Access non e' l'ambiente pensato per questi 
utilizzi, capita di inserire codice che sembra mangiarsi memoria senza 
motivo, in realta' il motivo c'e' (come sempre) solo che non e' 
comprensibile ad una prima ispezione
Ma dove trovare documentazione rispetto a questo argomento?
Oppure sono 'internals' che non sa praticamente nessuno, gelosamente 
custoditi di padre in fillio?