Newsgroup: it.comp.appl.access
Titolo: Come leggere i moduli presenti in altri database (probabile errore nell'apertura)

Buongiorno a tutti,
Volevo semplificarmi la vita nella gestione delle funzioni che uso in
vari moduli.
L'idea consisterebbe nell'usare un .mdb come "contenitore" di moduli e
funzioni; e per ogni funzione scrivere la versione in un commento
nella prima linea sotto la definizione, così:
Function prova ()
' 1.00 25/08/2007
...
End Function
Function se_funzionasse()
' 0.91 25/08/2007
...
End Function
In questo modo dovrebbe essere fattibile scrivere un parser che
enumeri i moduli, e per ogni modulo presente importi o esporti
l'omonima funzione più recente confrontata col "contenitore" (oppure
importi l'intero modulo, se non è presente).
Qui c' è il codice, e più sotto il problema:
-----------
Sub provamodulo1()
Dim app As New Application
Dim dbs As DAO.database, cnt As DAO.Container,  doc As DAO.Document
Dim mdl As Access.Module
Dim funzione$, nomemodulo$, database$
Dim lnstart&, numln&
database = "s:\apps\contenitore.mdb"
Set dbs = DBEngine.OpenDatabase(database, , True)
app.OpenCurrentDatabase database
Set dbs = app.CurrentDb
funzione = "fsplit"
nomemodulo = "funzioni_base"
Set cnt = dbs.Containers("Modules")
Set doc = cnt.Documents(nomemodulo)
app.DoCmd.OpenModule 
doc.name
Set mdl = app.Modules(nomemodulo)
MsgBox mdl.Type
MsgBox app.Modules(
doc.name
).CountOfLines
MsgBox app.Modules(
doc.name
).ProcStartLine(funzione, vbext_pk_Proc)
MsgBox app.Modules(
doc.name
).ProcBodyLine(funzione, vbext_pk_Proc)
-----------
Il problema che sto incontrando è che quando apro un db remoto le
proprietà
  .Type e
  .CountOfLines
vengono riconosciute, mentre
  .ProcStartLine(funzione, vbext_pk_Proc) e
  .ProcBodyLine(funzione, vbext_pk_Proc)
restituiscono l'errore "sub o function non definita".
Usando l'oggetto Application relativo all'.mdb corrente va tutto
bene... qualcuno sa dirmi cosa devo correggere?
grazie,
Panathos

 ha scritto nel messaggio
news:1188006404.7...@m37g2000prh.googlegroups.com...
Buongiorno a tutti,












grazie,
Panathos
Il problema è che devi avere 2 Oggetti.... quello da aprire e quello
corrente...!
Tu invece ne hai uno solo perchè riassegni la stessa avariabile e non fai
nemmeno
i cofronti tra i 2...!
Set dbs = DBEngine.OpenDatabase(database, , True)
app.OpenCurrentDatabase database
Set dbs = app.CurrentDb
In ogni casosecondo me ti stai complicando la vita...
Creati un MDE nel quale metti tutte le funzioni Public e lo inserisci nei
riferimenti
del tuo Applicativo, erediti tutte le Funzioni/Sub/Proprietà e Classi se ne
modifichi
la proprietà di publicazione come fosse una DLL...!
Questo non ti evita di doverle ricopiare....?
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.alessandrobaraldi.it
---------------------------------------------------------------------------

 Questo non ti evita di doverle ricopiare....?
Sì, certamente... però preferirei quantomeno acquisire quella tecnica
e capire dove sto sbagliando.
Ciao e grazie,
Panathos

[cut]
Eh, ci devo arrivare a fare i confronti... manco riesco ad aprire
correttamente il db remoto!
Si ho visto...!
[cut]
Ma scusa: la variabile dbs qui si riferisce al CurrentDb di app, cioè
il database remoto.
Sei sicuro... ad orecchio CurrentDb non ti suona male come interpretazione
di
Database Remoto... questo senza guardare l'Help...!
Adesso guarda, o meglio leggi l'help in merito al Metodo CurrentDb
Function CurrentDb() As Database
    Membro di Access.Application
E' normale che CurrentDb è il DB nel quale stai smanettando...
Dbs sarà il Db Remoto che aprirari con il Metodo OpenCurrentDatabase
Sub OpenCurrentDatabase(filepath As String, [Exclusive As Boolean = Falso],
[bstrPassword As String])
    Membro di Access.Application
A questo punto cicli il tuo DBS(il remoto) e confronti con le stesse cose
del CurrentDb...!
[cut]
Ciao e grazie,
Panathos


 ha scritto nel messaggio 
news:1188006404.7...@m37g2000prh.googlegroups.com...
Buongiorno a tutti,
Volevo semplificarmi la vita nella gestione delle funzioni che uso in
vari moduli.
L'idea consisterebbe nell'usare un .mdb come "contenitore" di moduli e
funzioni; e per ogni funzione scrivere la versione in un commento
nella prima linea sotto la definizione, cosě:
cut
Secondo me ti stai complicando la vita....
Non dovresti avere installato Visual SourceSafe insieme ad Access?
Ciao, Carlo

 A questo punto cicli il tuo DBS(il remoto)
Ma è necessario ciclare e matchare il .Name corrispondente?
Io istanzio direttamente gli oggetti che mi occorrono:
Set cnt = dbs1.Containers("Modules")
Set doc = cnt.Documents(nomemodulo)
E comunque stesso risultato di prima... niente da fare.
Riposto il codice modificato qui sotto:
Set dbs = DBEngine.Workspaces(0).OpenDatabase(database, , True)
Set app = CreateObject("Access.Application")
'  inizializzo l'oggetto applicazione
app.OpenCurrentDatabase database
Set dbs1 = OpenDatabase(database, , False)
MsgBox 
dbs1.name
' e fin qui ci siamo
Set cnt = dbs1.Containers("Modules")
Set doc = cnt.Documents(nomemodulo)
app.DoCmd.OpenModule 
doc.name
' anche qui ci siamo, il modulo viene aperto correttamente
Set mdl = app.Modules(
doc.name
)
' ora l'intellisense scrive ".Name" con la maiuscola, appena cambio
linea diventa ".name"... mah
MsgBox mdl.Type
MsgBox app.Modules(
doc.name
).CountOfLines
' qui ottengo i valori corretti
MsgBox mdl.ProcStartLine(funzione, vbext_pk_Proc)
MsgBox mdl.ProcBodyLine(funzione, vbext_pk_Proc)
MsgBox app.Modules(
doc.name
).ProcStartLine(funzione, vbext_pk_Proc)
MsgBox app.Modules(
doc.name
).ProcBodyLine(funzione, vbext_
' niente da fare con queste
P.S.: ho anche provato a ciclare gli insiemi, tanto per vedere che
succedeva... stesso risultato:
Set app = CreateObject("Access.Application")
app.OpenCurrentDatabase dbremoto, False
Set dbs1 = OpenDatabase(dbremoto, , False)
MsgBox 
dbs1.name
For Each cnt In dbs1.Containers
    If 
cnt.name
 = "Modules" Then
        For Each doc In cnt.Documents
            If 
doc.name
 = nomemodulo Then
                MsgBox 
doc.name
                app.DoCmd.OpenModule 
doc.name
                Set mdl = app.Modules(
doc.name
)
                MsgBox mdl.Type
                MsgBox mdl.CountOfLines
                MsgBox mdl.ProcStartLine(funzione, vbext_pk_Proc)
                MsgBox mdl.ProcBodyLine(funzione, vbext_pk_Proc)
            End If
        Next doc
    End If
Next cnt
ciao e spero di arrivarci in fondo...
Panathos

 Non dovresti avere installato Visual SourceSafe insieme ad Access?
Veramente non sapevo neanche cosa fosse, poi ho fatto una ricerchina.
Io non ho la Developer Edition, e a quanto ho letto non è incluso
nell'edizione Free di Visual Studio.
ciao,
Panathos