Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263

    VB.NET- Stampare Report Access 2007 tramite Script VB.NET

    Dovrei stampare in .PDF alcuni Report di Access 2007 tramite uno script di VB.NET.
    Visto che Access 2007 consente la stampa con il formato .PDF, ho realizzato una Macro che, quando viene eseguita, fa esattamente quello che chiedo, cioè mi apre a schermo un File .PDF
    Premetto che quello che sto realizzando è un progetto interno alla Rete Locale e che tutti Client hanno installato Access 2007.
    Se non ho capito male quello che ho visto sulla rete, dovrebbe essere possibile eseguire la stessa Macro anche da uno Script VB.NET, ma fino ad ora non ci sono riuscito.
    Per la verità mi sono già arenato all'apertura del DB, che a me non risulta possibile. Ho utilizzato diversi esempi trovati sulla Guida, dei quali quello riportato è solo uno fra tanti:

    codice:
        Dim oAccess As Access.ApplicationClass
    
             'Start Access and open the database.
             oAccess = CreateObject("Access.Application")
             oAccess.Visible = True
    
             'You will need to put the path to your own database here.
             oAccess.OpenCurrentDatabase("C:\Program Files\Microsoft Office
        \OFFICE11\Samples\Northwind.mdb", False)
    
             'Run the macro.
             oAccess.Run("ImportTxtFile")
    
             'Quit Access without saving the database.
             oAccess.DoCmd().Quit(Access.AcQuitOption.acQuitSaveNone)
             System.Runtime.InteropServices.Marshal. _
                ReleaseComObject(oAccess)
             oAccess = Nothing

    che però a me da subito questo errore: Il Tipo Access.ApplicationClass non è definito.
    Altri esempi non mi hanno portato lontano e non vorrei dilungarmi con altri script: all'occorrenza li posterò in seguito.
    Grazie per chi vorrà aiutarmi a risolvere questo problema.

  2. #2
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Replico a me stesso sperando che aiuti qualcuno a darmi i consigli giusti.
    Ho visto qui https://msdn.microsoft.com/en-us/library/3295w01c.aspx che probabilmente per interoperare con Office devo utilizzare una delle seguenti tre versioni di Framework:

    .NET Framework 4
    .NET Framework 4 Client Profile
    .NET Framework 4.5

    È possibile che sia questa la ragione per la quale non riesco ad aprire Access 2007?
    La mia versione di Visual Studio, fresca di installazione, utilizza Una versione diversa, più recente,...
    Però, dopo avere scaricato la versione 4 ho tentato di installarla su Windows 10 ma il sistema dice che è già presente, mentre io non la vedo nell'elenco delle versioni installate (Funzionalità di Windows).
    Di nuovo grazie

  3. #3
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Guarda questo articolo di Microsoft:

    HOW TO: Automatizzare Microsoft Access da Visual Basic .NET
    https://support.microsoft.com/it-it/...?wa=wsignin1.0

    Devi prestare attenzione a non mescolare (come fai tu) early-binding e late-binding.
    Se il progetto (applicazione) deve essere distribuita a terzi è indispensabile usare il late-binding, per evitare i problemi di versioni differenti.

    In questo mio articolo spiego come padroneggiare queste tecniche con successo.
    L'esempio è per Excel (c'è anche per Word e Outlook) ma l'approccio è identico per qualsiasi applicazione Office (cambiano ovviamente solo i comandi specifici dell'applicazione stessa).

    VS2010 - Early-Late Binding in VB.NET con Excel
    http://nuke.vbcorner.net/Projects/NE...S/Default.aspx


  4. #4
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Contavo proprio su una tua risposta gibra: molte grazie.
    Leggerò con attenzione (e spero di capire bene) quello che suggerisci.
    Se malauguratamente non dovessi ottenere quello che mi serve, scriverò una ulteriore risposta.
    Ancora grazie.

  5. #5
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Ho iniziato leggendo "HOW TO: Automatizzare Microsoft Access da Visual Basic .NET" come indicato da gibra e quindi ho copiato dentro un Button il seguente codice:

    codice:
    Imports System.IO
    Imports System.Threading
    Imports Access = Microsoft.Office.Interop.Access
    
    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Dim oAccess As New Access.Application
            'Dim oAccess As Access.Application
    
            ' Start a new instance of Access for Automation:
            oAccess = New Access.ApplicationClass()
    
            ' Open a database in exclusive mode:
            oAccess.OpenCurrentDatabase(filepath:="C:\SisVBNet\DB_Access2007\ArchSis.accdb", Exclusive:=True)
    
        End Sub
    End Class
    ma prima ancora di eseguire il Debug, la stringa "New Access.ApplicationClass()" appare sottolineata in rosso, ad indicare che c'è un errore.
    Ho provato a cambiare versione di .NET Framework ma non ho visto cambiamenti. Ora quello utilizzato è il 4.6.1, il più reente che trovo. Il riferimento a Microsoft Access Object 12.0 è attivo.
    Poi ho provato a riscrivere la stringa togliendo "Class" e l'errore di sottolineatura è scomparso.
    A questo punto ho eseguito il Debug e la Finestra si apre regolarmente ma premendo il Button compare, in corrispondenza della stringa "Dim oAccess As New Access.Application", il seguente messaggio:

    Eccezione non gestita di tipo 'System.Runtime.InteropServices.COMException' in mscorlib.dll

    Ulteriori informazioni: Recupero della class factory COM per il componente con CLSID {73A4C9C1-
    D68D-11D0-98BF-00A0C90DC8D9} non riuscito a causa del seguente errore: 800702e4 Per eseguire
    l'operazione richiesta è necessaria l'esecuzione con privilegi elevati. (Eccezione da HRESULT:
    0x800702E4).


    Se invece lascio integra la stringa

    codice:
    oAccess = New Access.ApplicationClass()
    Il Debug mostra subito che ci saranno errori ma comunque apre la Finestra.
    L'errore evidenziato è il seguente:
    Errore BC31541 Il riferimento alla classe 'ApplicationClass' non è consentito se il relativo assembly è configurato in modo da incorporare i tipi di interoperabilità.
    Dire che sono perplesso è poco, affermare che mi mancano informazioni è ovvio (sono ignorante), ma non so dove trovarle.
    Cosa posso fare?

  6. #6
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Aggiungo ancora che siccome utilizzo Access 2007, non ho a disposizione il Database di esempio Northwind, utilizzato dalla guida per eseguire il programma con tutte le sue sfaccettature

  7. #7
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Devi aggiungere il riferimento Microsoft.Interop.... (a memoria non me lo ricordo, stasera ci guardo).

    Per il database, lo puoi scaricare qui:
    Download details: Access 2000 Tutorial: Northwind Traders Sample Database
    https://web.archive.org/web/20070103...displaylang=EN

  8. #8
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Sbagliato (nel precedente link non trova il download).
    Lo trovi qui:

    Access 2000 Tutorial: Northwind Traders Sample Database
    https://web.archive.org/web/20010515...0/Nwind2K.aspx

  9. #9
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Eccomi qui.

    Devi aggiungere il riferimento a: Microsoft.Office.Interop.Access.Dao
    (togli altri riferimenti eventuali ad Access, non funzionano).

    Poi assicurati di impostare la piattaforma su x86 per poter accedere al database NWIND.MDB (1)


    Il codice diventa questo:
    codice:
    Dim oAccess As Microsoft.Office.Interop.Access.Application
    oAccess = New Microsoft.Office.Interop.Access.Application
    oAccess.DoCmd.OpenReport(ReportName:="Catalog", View:=acViewPreview)



    (1) Quello che ti ho linkato è in formato '97, devi convertirlo in formato 2002-2003. Fai così:

    - Apri MSAccess: File -> Opzioni e in Formato di file predefinito per database vuoto imposta: Access 2002-2003

    - Chiudi MSAccess

    - Estrai il database dal file NWind.exe (se hai 7-zip: clic destro -> Estrai in NWIND\...)

    - Ora fai doppio-clic su nwind.mdb, MSAccess ti chiederà di convertire e ti propone il formato predefinito (che hai definito sopra). Conferma. Chiudi MSAccess

    Adesso possiedi un database NWIND.MDB utilizzabile nel progetto.
    Da qui in poi, puoi proseguire da solo.


  10. #10
    Utente di HTML.it L'avatar di Rickycast
    Registrato dal
    Apr 2007
    residenza
    CHIERI (TO)
    Messaggi
    263
    Buongiorno gibra.
    Come hai spiegato, ho scaricato e convertito il DB nwind nella versione 2002-2003. Si è autoposizionato in ...\user\mionome\documenti\nwind.mdb.
    Quindi, nel Button della Form1 ho copiato il codice che hai indicato con le impostazioni suggerite (x86 in Proprietà di WindowsApplication1, ma sono stato costretto a lasciare il riferimento Microsoft Access 12.0 Object Library, senza il quale avevo degli errori), ed ho ottenuto questo:

    codice:
    Imports Access = Microsoft.Office.Interop.Access.Dao
    
    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Dim oAccess As Microsoft.Office.Interop.Access.Application
            oAccess = New Microsoft.Office.Interop.Access.Application
            oAccess.DoCmd.OpenReport(ReportName:="Catalog", View:=acViewPreview)
    
        End Sub
    End Class

    Subito il codice mi ha avvertito che la stringa "View:=acViewPreview" non è corretta e che dovevo correggerla come segue:

    codice:
    Imports Access = Microsoft.Office.Interop.Access.Dao
    
    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Dim oAccess As Microsoft.Office.Interop.Access.Application
            oAccess = New Microsoft.Office.Interop.Access.Application
            oAccess.DoCmd.OpenReport(ReportName:="Catalog", View:=Microsoft.Office.Interop.Access.AcView.acViewPreview)
    
        End Sub
    End Class

    Immagino inoltre che Catalog dovesse essere convertito nel Path del File nwind.mdb, e così ho fatto:

    codice:
    oAccess.DoCmd.OpenReport(ReportName:="C:\Users\mionome\Documents\Nwind.mdb", View:=Microsoft.Office.Interop.Access.AcView.acViewPreview)

    Ho lanciato il debug e la finestra del Form1 si è aperta correttamente, ma premendo su Button1 ho ottenuto, in corrispondenza della Stringa


    codice:
    oAccess = New Microsoft.Office.Interop.Access.Application

    il messaggio:

    "Eccezione non gestita di tipo 'System.Runtime.InteropServices.COMException' in mscorlib.dll

    Ulteriori informazioni: Recupero della class factory COM per il componente con CLSID {73A4C9C1-D68D-11D0-98BF-00A0C90DC8D9} non riuscito a causa del seguente errore: 800702e4 Per eseguire l'operazione richiesta è necessaria l'esecuzione con privilegi elevati. (Eccezione da HRESULT: 0x800702E4).
    "

    Ho anche impostato nelle Proprietà di MSACCESS.EXE "Esegui come Amministratore", ma nulla è cambiato. Oltre non sono riuscito ad andare.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.