Newsgroup: it.comp.appl.access
Titolo: Problemi con la runtime

Ciao a tutti,
Avendo intenzione di acquistare Visual Studio Tools, ho pensato di
testare un database facendolo girare con la runtime installabile dal CD
di Office 2003.
Il problema è il seguente: se nel PC è presente anche l'installazione
completa di Office va tutto a meraviglia. Se, invece, è installata
solo la runtime, quando vado a lanciare alcuni report ricevo il
messaggio "Uso dell'operatore punto, punto esclamativo odelle parentesi
non valido", o anche "Funzione non disponibile nelle espressioni".
E' come se Access non riconoscesse più alcuni operatori ed alcune
funzioni.
Sapete dirmi perchè e come posso rimediare ?

 funzioni.
Prova nuovamente ad aprire il database sulla macchina dove hai installato la 
versione completa di Office, specificando lo svitch /RUNTIME da riga di 
comando e vedi se il problema si presenta anche in quella occasione.
-- 
PBsoft di Gabriele Bertolucci
www.pbsoft.it
 

"Mirko Caporali"




Hai problemi di Lost References: che librerie hai settato nei riferimenti
del progetto?
Ciao, Simone

 versione completa di Office, specificando lo svitch /RUNTIME da riga di
Già fatto... non cambia niente.
Se la versione completa di Access è installata, allora tutto funziona
correttamente, altrimenti no.
E' come se l'installazione della SOLA runtime non provvedesse ad
installare alcune componenti.

 del progetto?
Bravissimo... il problema sta proprio qui
... solo che ora il mi è sorto un altro problema "collegato" piuttosto
antipatico. Mi spiego.
Il database in questione, in talune routines, esporta dati in files
excel, pertanto tra i riferimenti vi è quello alla libreria di
Microsoft Excel.
Ora, togliendo tale riferimento, riesce a girare in modalità runtime
(in un PC senza Office), ma (per ovvi motivi) non può essere
compilato, nè quindi generare un file .mde.
In sintesi, mi sembra di essere difronte ad un bivio:
a) Genero un file mde che gira solo parzialmente in modalità runtime
b) Rinuncio al file mde e faccio girare in runtime il file mdb senza
riferimenti ad excel e quindi impossibilitato, in ogni caso, ad
usufruire di tale applicazione
Entrambe le alternative mi appaiono pessime.
Posto, che non capisco come mai il riferimento ad Excel possa creare un
tale problema (visto peraltro che l'ho messo per ultimo), sapete se
esiste una via di uscita da questa situazione ?

"Mirko Caporali" <
Posto, che non capisco come mai il riferimento ad Excel possa creare un
tale problema (visto peraltro che l'ho messo per ultimo), sapete se
esiste una via di uscita da questa situazione ?
Sě: utilizzare "l'associazione tardiva ... vedi Help di Access per i
dettagli.
Ciao, Simone

 dettagli.
Correggetemi se sbaglio, ma il late binding dovrebbe NON funzionare nel caso 
gli oggetti COM di Excel non sono comunque registrati in Windows.
Che io utilizzi early binding o late binding, quando vado ad istanziare una 
certa classe, le relative referenze devono essere presenti nel registry, 
giusto?


 giusto?
Naturalmente: ma infatti se Excel è installato, le relative dipendenze
saranno registrate eccome nel registry.
Ciao, Simone

 saranno registrate eccome nel registry.
Ok, ma allora non capisco da dove possano generarsi i problemi di "Lost 
Reference" ai quali hai accennato nel tuo precedente post.
Se io dichiaro un riferimento nel VBA, la classe riferita deve comunque 
esistere, sia che io stia lavorando con il runtime sia che stia lavorando 
con la versione completa di Access.
Probabilmente mi sta sfuggendo qualcosa.


 Reference" ai quali hai accennato nel tuo precedente post.
Problema storico di Access:
Se specifichi una libreria di oggetti nel progetto (ad esempio
c:\........................\Graph9.olb) per esigenze di programmazione e per
qualche motivo questa libreria non viene piů *trovata* sul PC di
destinazione dell'applicativo, si verificano errori bizzarri: l'intera
applicazione non funziona piů.
In gergo questa situazione viene definita "Lost references".
Utilizzando il "late binding" puoi sfruttare il modello a oggetti di altre
applicazioni (da Graph a World o Excel ad esempio) senza dichiarare alcunchč
nella lista dei riferimenti: quindi il suddetto problema non puň
manifestarsi.
Ciao, Simone

 manifestarsi.
Ok anche qui.
Riprendendo il tuo esempio, dimmi se interpreto correttamente la tua 
affermazione: con il late binding l'applicazione non incorre piů in 
comportamenti "bizzari" ma restituisce comunque un errore quando con la 
CreateObject cerco di istanziare la libreria 
c:\........................\Graph9.olb
Giusto?


 In gergo questa situazione viene definita "Lost reference
Innanzi tutto, grazie per il prezioso aiuto...
Ne approfitto per porti una questione.
Ho provato con "createObject" per lavorare in un file excel, ma mi
sembra di poter operare solo su files Excel creati ExNovo, e non su
File Excel già presenti (correggimi se sbaglio).
In alternativa, avrei pensato di creare riferimenti dinamici in questo
modo:
' Prima Parte codice
References.AddFromFile ("C:\Programmi\Microsoft
Office\Office11\Excel.exe")
Dim Ref As Reference
Set Ref = References!Access
' Seconda parte codice
StrPercorso = "C:\pippo.xls"
Set EXCE = New Excel.Application
Set FileExce = EXCE.Workbooks.Add(StrPercorso)
Set Fogliolav = FileExce.Worksheets!input
però, non capisco perchè le 2 parti di codice prese singolarmente
funzionano, ma assieme NO. Si verifica quanto segue:
Se il riferimento alla libreria di EXCEL non è presente, ACCESS
scorrendo la routine ignora completamente la prima parte e (leggendo la
seconda) mi dice che faccio riferimento ad una libreria sconosciuta.
Mi sai consigliare ancora?

 Mi sai consigliare ancora?
Dubito che Access ignori la prima parte. Piuttosto, come ho scritto 
all'inizio, Access non ti restituisce alcun errore quando aggiunge un 
riferimento all'eseguibile di Excel, anche se non gli serve a niente perché 
quel file non contiene una libreria di tipi istanziabile.
L'errore relativo alla libreria sconosciuta lo hai perché evidentemente non 
hai messo il riferimento alla Microsoft Excel Object Library, quindi quando 
fai una new exec.application Access non sa che pesci pigliare.
Non ci puoi fare niente: se vuoi creare un oggetto di tipo Exec.Application, 
sulla macchina DEVE essere installato Excel.
Il fatto che tu poi utilizzi il late binding o l'early binding non cambia la 
sostanza delle cose. Tuttavia, come ti ha detto Simone Calligaris, con il 
late binding puoi evitare che accadano comportamenti strani della tua 
procedura Access.


 procedura Access.
Il vostro aiuto mi si sta rivelando preziosissimo... devo solo prendere
confidenza con questa tecnica (finora mai usata), che penso di adottare
sempre d'ora in poi, visti i notevoli vantaggi si si intende
distribuire la runtime.
E poi... non dovrebbe creare problemi se nel PC è istallata una
versione di Excel antecedente alla 11 (questa volta spero di non
sbagliarmi).
Ciao, e grazie ancora

 > File Excel già presenti (correggimi se sbaglio).
Scusa se ti disturbo ancora.
Non riesco ad aprire e modificare un file Excel già esistente.
Supponiamo di avere un file excel (mario1.xls) in una certa posizione e
di voler intervenire su di esso.
Per fare ciò ho scritto la seguente routine:
Dim ExcelSheet As Object
Set ExcelSheet = GetObject("c:\MARIO1.XLS", "Excel.Sheet")
ExcelSheet.Sheets("foglio").Cells(1, 1).Value = "Prova modifica cella"
ExcelSheet.SaveAs "C:\MARIO1.XLS"
ExcelSheet.Application.Quit
Set ExcelSheet = Nothing
ma, NON gira.
Mi puoi dire come posso fare ?

 sbagliarmi).
Credo di no, ma non ho un ambiente che mi permetta di provarlo.


 Mi puoi dire come posso fare ?
Il problema è la classe che hai passato alla GetObject.
Dovrebbe essere "Excel.Application", ma, nel dubbio, ti consiglio di non 
mettere il parametro e lasciare che Access recuperi da solo il nome della 
classe dal sistema operativo.
Io ho provato questo codice e funziona tranquillamente:
    Dim myXLS As Object
    Set myXLS = GetObject("C:\prova.xls")
    myXLS.Worksheets("Foglio1").Cells(1, 1).Value = "una frase di prova"
    Set myXLS = Nothing
Saluti.


 degli oggetti tipizzati.
Ho fatto così:
dim EXCE as abject
set EXCE = createobject("excel.application")
... e poi, via dicendo...
Va tutto alla perfezione!
Grazie ancora, mi hai dato un gran bella "imboccata"

 Giusto?
Cos'č, un test?     ;-)
Non ho scritto nulla del genere: ho semplicemente consigliato di usare il
"late binding", che all'atto pratico s'implementa (nella maggior parte dei
casi) dichiarando semplicemente una variabile di tipo Object invece che
specifica; lasciando ad Access il compito di "rincorrere" la libreria
corretta.
Ciao, Simone

 Cos'č, un test?     ;-)


 Libreria.olb nel computer di destinazione?
No, non è importante, altrimenti l'associazione tardiva non servirebbe a
nulla: è Access che si fa carico di rintracciare nel registry la libreria
giusta.
Ciao, Simone

 Libreria.olb nel computer di destinazione?
Attenzione: non sei tu che "vai a mettere" la libreria olb sul computer di
destinazione ... sarà l'installer dell'applicazione (world, Excel per ex.) a
farlo e occuparsi della registrazione.
Ciao, Simone