Newsgroup: it.comp.appl.access
Titolo: Oggetti Database Invisibili

Secondo voi, perchč un oggetto database cosě definito in un modulo:
Public dbNetCfg As Database
Set dbNetCfg = OpenDatabase(gstrNetCfgPath & gstrNetCfgName)
che funziona egregiamente all'interno della routine che lo ha definito,
quando esce dalla stessa routine, mi diventa invisibile, cioč perde la
definizione, diventa nullo, ecc.?
Grazie

Oh bella, non risponde nessuno.
Ho forse chiesto una cretinata?
Mari

"Mari" chiede:

In effetti hai sollevato un problema ai limiti dell'attinenza con Access.
Anche se dal tuo post non si evince con certezza, sono sicuro che la
definizione Public ... As ... l'hai inserita all'interno della routine.
In questo caso, infatti, avviene che le altre routine possono vedere
l'oggetto finche' la routine che contiene la definizione e' in esecuzione,
ma poi non la vedono piu' perche' gli oggetti definiti all'interno di una
routine  muoiono con la routine stessa.
La definizione la devi mettere in un modulo qualsiasi, all'esterno delle
routine (proprio sotto Option compare...)
Ciao, Sib

In effetti non pare chiaro, ma io la definizione Public ... As ..., l'ho
proprio messa in um modulo, fuori da qualsiasi routine, proprio in un blocco
di definizioni sotto l'option compare...
Ed è qui che mi è sorto il problema...!!!
Scusatemi per l'imprecisione, e grazie se mi date una risposta.
Ma perchè non sarebbe attinente con Access?
Mari ;-)



Ciao, Sib

Option Compare Database
Option Explicit
Public intActualPlant As Integer
Public gstrAppPath As String
Public gstrAppName As String
Public gstrBackEndPath As String
Public gstrBackEndName As String
Public gstrLocCfgName, gstrNetCfgName, gstrNetCfgPath As String
Public dbLocCfg As Database
Public dbNetCfg As Database
Function MainControl()
   Dim dblocal As Database
   Dim intCurrError As Integer, strCurrError As String
   Dim rstDatabasesName, rstDataBasesPath As Recordset
   Dim dbNet As Database
   Dim strBackEndPathNet As String
......
   DoEvents
   DoCmd.Echo True, "Checking Connections..."
   blnLeaveApplication = False
   Set dblocal = CurrentDb()
   gstrAppPath = Left$(dblocal.Name, ap_LastInStr(dblocal.Name, "\"))
   gstrAppName = Mid$(dblocal.Name, ap_LastInStr(dblocal.Name, "\") + 1)
   gstrLocCfgName = ap_GetDatabaseProp(dblocal, "LocalCfgName")
   Set dbLocCfg = OpenDatabase(gstrAppPath & gstrLocCfgName)
   Set rstDatabasesName = dblocal.OpenRecordset("SharedDB", dbOpenSnapshot)
   Set rstDataBasesPath = dbLocCfg.OpenRecordset("DBsPath", dbOpenDynaset)
   gstrNetCfgName = ap_GetDatabaseProp(dblocal, "NetCfgName")
   gstrNetCfgPath = RecuperaDato(dbLocCfg, "NetConfiguration", "NetCfgName",
CStr(gstrNetCfgName), "str", "NetCfgPath")
   Set dbNetCfg = OpenDatabase(gstrNetCfgPath & gstrNetCfgName)
(Qua c'è altro codice...)
   rstDatabasesName.Close
   rstDataBasesPath.Close
   Set dblocal = Nothing
'   Set dbLocCfg = Nothing    --> notare che sono commentate
'   Set dbNetcfg = Nothing    --> notare che sono commentate
   Set dbNet = Nothing
Exit_MainControl_Init:
   Exit Function
Error_MainControl_Init:
   Beep
   MsgBox "The following error occurred: " & Error$ & vbCrLf & _
           vbCrLf & "The system will now be closed down!"
   Application.Quit
   'Resume
End Function
Ed è tutto.
Ora, perchè i databse aperti dbNetCfg e dbLocCfg, uscendo da qui
regolarmente, perdono la definizione?
Perchè a questo punto non posso accedervi quando mi pare?
Grazie Sib
Mari

 Perchè a questo punto non posso accedervi quando mi pare?
O fatto alune prove e mi sono reso conto di quale possa essere il problema.
Qualsiasi operazione che possa reinizializzare il codice (salvataggio di
oggetti, piccole modifiche nelle strutture ecc) azzera tutte le variabili.
Penso che l'unica sia di settare il db in ogni routine e settarlo a nothing
alla fine di ognuna.
Ciao, Sib


Ciao Nicola

 CUT
Devo concordare pienamente con Nicola.
Per quanto, sulla guida di Access, Global e Public siano considerati
sinonimi (anzi, per la verita' Global non c'e' proprio come istruzione di
dichiarazione, ma premendo F1 mentre si e' su global l'help apre la
definizione di Public), il comportamento delle due istruzioni e'
sostanzialmente diverso infatti, a differenza di quanto ho detto a proposito
di Public, Global ha un comportamento piu' stabile e fa conservare il valore
alla variabile anche se si eseguono operazioni di salvataggio e modifica.
Bisognerebbe approfondire la cosa.
Ciao, Sib

Grazie ragazzi ;-))
Ciao
Mari