Newsgroup: it.comp.appl.access
Titolo: Come avviare una funzione dentro progetto Access "dal di fuori" ?

Devo avviare, da dentro una procedura fatta in c#, una funzione presente 
dentro un progetto Access, per stampare un documento
Ad esempio il file si chiama PROGETTO1.MDE, dentro al quale e' presente 
una funzione del tipo
 
FUNCTION STAMPA(byval NOME_REPORT as string , byval NOME_STAMPANTE as 
string)
 
Come fare per avviare la funzione STAMPA, passando i due parametri, 
partendo da una procedura esterna?

Si fa come faresti da qualsiasi altro linguaggio...VBA incluso, ovvero sfruttando l'interfaccia COM accedendo all'oggetto Database(specifico) appoggiandoti al provider giusto... attenzione a JET O ACE OLEDB, a seconda sia un MDB/ACCDB e da lì accedi alle Funzioni Dichiarate PUBLIC...
 
@Alex

Ciao, 
se devi eseguire una funzione o sub scritta in vba devi passare per l'oggetto com Access.Application da istanziare all'interno della procedura c#.
Dopo di ciò apri il db che contiene il codice (public) che vuoi eseguire e lo richiami attraverso il metodo Run dello stesso oggetto Application (
https://msdn.microsoft.com/en-us/vba/access-vba/articles/application-run-method-access
).
Alcune note di cronaca:
il giochetto non funziona se access non è installato nel sistema;
Nemmeno con Access runtime funziona;
Nel progetto c# deve essere presente il riferimento alla libreria di oggetti di access per .Net .
In questo caso (lanciare codice vba da .net) non c'entra l'uso dei provider oledb che servono invece ad accedere ai dati, almeno se ho capito bene la tua domanda.
Ciao
Mat.

Si si hai perfettamente ragione... il provider non serve proprio dovendo accedere al modello oggetti COM... ed ovviamente non può andare con il Runtime che non fa da SERVER di Automazione.
 
Basta aggiungere il riferimento aalle librerie Access ed aprire l'oggetto Database per poi accedere ai metodi... usando appunto RUN...
 
Aggiungo qualche altro riferimento 
 
https://support.microsoft.com/en-us/help/317114/how-to-automate-microsoft-access-by-using-visual-c
 
https://bytes.com/topic/c-sharp/answers/255310-run-microsoft-access-module-vs-net-c
 
 
@Alex


Urca, quindi da eseguibile fatto in C# -NON- e' possibile eseguire una 
funzione dentro un mde+runtime ?
Ehhh questo e' un bel problemone
Non posso lanciare una seconda istanza della procedura passandogli come 
parametri di ingresso i dati per stampare, perche' dentro al programma 
c'e' una routine per evitare di avviare piu' di una volta il programma
Solusssioni?
 
 


Certo che a volte mi perdo in un bicchier d'acqua
Posso pero' avviare l'mde e passargli come parametro iniziale oltre al 
nome report e nome stampante anche un flag SALTA_CONTROLLO_DOPPIA_ISTANZA
Se presente, il controllo doppia/tripla istanza verra' inibito
Ovviamente a fine stampa la procedura dovra' spegnersi


Avevo suggerito in qualche 3D indietro di usare i MUTEX... strumento del Sistema Operativo preposto anche a questo.
 
https://www.experts-exchange.com/articles/2104/Avoiding-running-multiple-instances-of-an-application.html
 
 
Fossi in te, per fargli eseguire una Determinata funzione all'avvio userei un CMD Parameter in fase di lancio...
 
https://stackoverflow.com/questions/27904046/ms-access-how-to-determine-the-command-line-parameters-that-the-current-instanc
 
 
https://msdn.microsoft.com/en-us/library/office/aa211469(v=office.11).aspx
 
 
Usando una buona programmazione VBA lato Client, il rilevamento della stringa di comando, che potrebbe anche essere MULTIPARAMETRO, ti consente di fare tutto... o quasi.
 
@Alex

Qualcuno ha provato a connettersi ad Access da C# con JETEntityFrameWorkProvider ...?
 
@Alex


Si, grazie
Interessante il link sull'uso dei mutex, ora me lo leggo
Credo comunque andro' di parametro iniziale

 
Mai usato

 @Alex
 
Ciao @Alex,
nemmeno io lo uso, quando ho iniziato con entity framework avevo abbandonato i dati su access un po' in favore di sql server.
Spiace,
ciao
Mat.


Indubbiamente meglio, ma su piccole APP locali... mi sembrava una bella cosa... non l'ho provato nemmeno io... leggevo solo e mi sembra sia da sfruttare...
 
@Alex


Ti dirò,
quando ho cominciato ad adottare sql server per i dati anch'io tornavo al buon vecchio mdb per le piccole cose, ma poi la piccola app con trè/quattro tabelle  cominciava a lievitare (perché il cliente ti dice sempre la metà di quello che gli serve...) e io mi pentivo della mia scelta.
Ormai sql server è ampiamente supportato da l'hardware moderno (e anche quello un po' meno), la versione express è pure gratis, si installa praticamente da solo... io sinceramente non tornerei indietro, ma è questione di "gusti".
Il mio sogno: Access con un ambiente di sviluppo .Net, vba mi va un po' stretto ogni tanto, starò mica ingrassando :)
Ciao
Mat.


Per piccole cose, puoi considerare Firebird
L'eseguibile per installare l'ultima versione e' 9 Mbyte
Installarlo richiede 10 secondi netti
Per usarlo da dentro Visual Studio basta aggiungere una sola dll
Ed e' un vero db server, con le copie a caldo, il monitoraggio tabelle, 
eventi custom che puoi scrivere per realizzare funzioni personalizzate
Oltre a questo e' aggratisse, tutto opensource, pure i driver odbc il 
provider Dot net ed altri
Per usarlo con Access basta installare il server ed il driver odbc, 15 
secondi in tutto
Come direbbe Crozza, consigliabilissssimo