none
VB .Net - Stampa Crystal Report non viene esaguito dall'eseguibile RRS feed

  • Domanda

  • In un mio Progetto nel quale utilizzo Access come DB, ho creato dei Report con Crystal Report per Visual Studio ed ero convinto di avere ormai superato la fase critica del mio lavoro, invece, ... Se avvio il progetto (da dentro Visual studio) riesco a stampare i Report in PDF senza probelemi. Se poi avvio l'Eseguibile, anche in queso caso riesco a stampare i Report in PDF. Insomma, all'apparenza tutto funziona ma qundo tento di utilizzare il File .exe su un diverso PC, nel quale non è installato nè Access, nè Visual studio, ottengo il seguente messaggio:

    "Errore durante il tentativo di compattazione del database nella sub "CompattaDB" (sub che ho creato per ridurre le dimensioni del DB): Recupero della class factory COM per il componente con CLSID (CD7791B9-43FD-42C5EA42-8DD2811F0419) non riuscito a causa del seguente errore: 80040154 Interfaccia non registrata. (Eccezione da HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))"

    E poi comunque compaiono altri messaggi che impediscono il corretto funzionamento del Programma. Su un PC nel quale invece è installato Access, se chiedo la stampa del Report il messaggio che ricevo è

    Errore 53 - Non è stato possibile caricare il File o l'assembly "CrystalDecisions.CrystalReport.Engine, Version=13.0.3500.0 Culture=Neutral, PublicKeyToken=692fbea5524e1304" o una delle dipendenze.Impossibile trovare il file specificato.

    Ero convinto che il File .exe contenesse già tutto quello che serve a far eseguire il programma, ma evidentemente non è così. L'impressione che ho è che potrebbero bastare dei Runtime, e infatti, se sul PC in cui c'èAccess (che quindi si avvia senza errori) installo ilRuntime di Crystal Report per Visual Basic, continua a n on stampare ma ottengo un errore diverso (che adeso non ho sotto mano).

    Cosa devo fare per fare eseguire correttamente il mio progetto su qualsiasi PC (con almeno Windows 7)?

    Aggiungo che, dopo avere installato il Runtime di Access, adesso il programma si avvia regolarmente, ma continua a non stampare il Report. Serve forse anche il runtime di Crystal Report? e quale?

    Qualcuno può aiutarmi?

    Grazie

    domenica 3 febbraio 2019 11:52

Tutte le risposte

  • Per quello che ricordo:

    1) Compilare con: CPU di destinazione x86 e non x64 o AnyCPU

    2) Installare sul PC, dove devi eseguire il programma:

        A) Access Database Engine, io utilizzavo il 2010 esiste anche il 2016, credo.

            è più leggero del Runtime di Access e dovrebbe essere sufficiente

        B) Crystal Report Runtime 32bit, credo che l'ultimo sia il 13.0.23

    Una o più di queste cose dovrebbe risolvere

    Fammi sapere

    Ciao



    domenica 3 febbraio 2019 14:13
  • Specifico che le prove le sto facendo su una versione virtuale di Windows 10, ma anche su un diverso PC i risultati sono sempre gli stessi.

    Ho installato il runtime di Access, come ho detto ed ho evitato il primo problema, quindi ho installato CRforVS redist 64 (windows 10 è a 64) e non mi ha più dato l'errore di precedente ma invece mi ha dato questo:

    Errorre 5 - L'inizializzatore di tipi di "CrystalDecision.CrystalReport.Engine,ReportDocument" ha generato un'eccezione

    Adesso disinstallo quello che ho fatto e installo quello che suggerisci, ma ho qualche dubbio sul runtime a 32 bit.

    Secondo te, è possibile che con un installer che carichi tutto il necessario, si eviutino i problemi?

    Grazie. ti faccio sapere.


    domenica 3 febbraio 2019 15:24
  • Quando installi un programma che usa componenti che non sono parte del framework devi ovviamente installarli sulla macchina di destinazione. Se per installare il runtime di access o le interop di access, e i driver della Jet database engine che è ciò che .net usa per parlare con Access oltre ai driver di Crystal reports ti basta copiare delle librerie (.dll) che sei in grado di individuare sulla macchina dove compili l'Exe, puoi inserire tali DLL nel tuo progetto come Content e modificarne la clausola di "compilazione" a Copy Always in modo che vengano copiate sulla tua cartella Bin\Debug o Bin\Release, e a questo punto puoi usare InnoSetup per creare un Setup eseguibile che ti installa tutto sulla macchina di destinazione.

    Per l'uso di Innosetup puoi guardare questo:

    http://www.sabrinacosolo.com/multiclock-generare-linstaller-con-innosetup/

    saluti


    Sabrina C. - http://www.dotnetwork.it

    domenica 3 febbraio 2019 16:41
  • Molte grazie Sabrina. Sicuramente la strada da seguire è quella che indichi tu, ma credo ci sia un problema diverso, almeno i questa fase. Riepilogo brevemente il mio obiettivo: devo fornire ai miei Users dei File .pdf che contengano le informazioni relative ad ordini di merci o simili, che loro stessi compilano a seconda delle necessità.

    Ho scelto di utilizzare Crystal report per la costruzione dei report e poi con questo semplice script, ne genero la creazione:

                ' Stampa l'Ordine in PDF
                ' *********************************************************************************************************
                DestReport = "C:\MiaDiredctory\Ordini\OrdCli_" & OrCodCli & " del " & Now.ToString("ddMMyy") & ".pdf"
                NomeReport = "ReportOrdiniCli.rpt"
                Origine = PathOrigine & NomeReport
    
                GeneraPDF(DestReport, Origine)    
    
    e quindi
    
        Public Sub GeneraPDF(ByVal Destinazione As String, ByVal Origine As String)
            Try
    
                Dim Rpt As New ReportDocument
                Dim DOp As New DiskFileDestinationOptions
    
                Rpt.Load(Origine, CrystalDecisions.[Shared].OpenReportMethod.OpenReportByDefault)
                DOp.DiskFileName = Destinazione
                With Rpt.ExportOptions
                    .DestinationOptions = DOp
                    .ExportDestinationType = ExportDestinationType.DiskFile
                    .ExportFormatType = ExportFormatType.PortableDocFormat
                End With
                Rpt.Refresh()
                Application.DoEvents()
                Rpt.Export()
    
                ' Aspetta che il Report venga creato e poi lo apre a video in PDF
                ' *************************************************************************************************************
                Do Until System.IO.File.Exists(Destinazione) = True
                    Thread.Sleep(100)
                Loop
    
                Process.Start(Destinazione)
    
            Catch ex As Exception
                MessageBox.Show("Errore nella Sub ''GeneraPDF'' della Form ''FunzioniComuni'': " & Err.Number & " - " & Err.Description)
            End Try
        End Sub
      
    

    Però, purtroppo, "PathOrigine" contiene il path dei Report così come sono stati creati (nel mio caso C:\MiaDirectory\MioProgetto\MioProgetto\Report.rpt) che ovviamente non è la Directory dell'eseguibile. E non so se ci sono soluzioni, a meno che tu non possa indicarmi che script usare per stampare i report in PDF senza questa procedura perversa che chiede il path dei Report.

    Se non sono stato chiaro fammelo sapere che mi dilungo ancora di più. Dovrei proprio arrivare in fondo a questo tomento e anche al più presto.

    Grazie in anticipo

    domenica 3 febbraio 2019 18:32
  • La sola cosa che mi viene in mente è che tu crei il tuo report su una cartella fissa che sia presente su tutti i computer, come ad esempio

    Public Documents\MiaApp\Reports

    Public documents è una cartella su cui tutti gli utenti di un pc hanno diritto di leggere e scrivere quindi è adatta a ospitare dati che tu generi dalla tua applicazione o dati di configurazione a livello applicativo.

    quindi se il report lo generi su quella cartella e poi lo copi sulla stessa cartella quando installi la tua procedura dovrebbe funzionare correttamente.

    Public documents usualmente è in C:\Users\Public\Documents che puoi ottenere con questo codice:

    Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments);
    

    ciao


    Sabrina C. - http://www.dotnetwork.it

    domenica 3 febbraio 2019 23:03
  • P.s. ad ogni modo un altro modo per risolvere il problema è usare un componente per la generazione dei PDF fatto bene, io uso questo:

    https://help.syncfusion.com/file-formats/pdf/overview

    saluti


    Sabrina C. - http://www.dotnetwork.it

    domenica 3 febbraio 2019 23:05
  • Scusami se cerco di capire meglio. Io i report li ho generati in Crystal Report in un Progetto Visual Studio. Quindi tu suggerisci di copiare i report in una cartella posizionata così: C:\Users\Public\Documents\MiaCartella e nel mio progetto faccio riferimento a quello specifico report?

    Adesso provo e poi ti faccio sapere.

    Ho anche dato un'occhiata a syncfusion; io però non faccio software per mestiere, sviluppo piccole cose solo per noi, che siamo una realtà minuscola. Purtroppo quei prezzi sono inavvicinabili.

    Ero però convinto che se avessi inserito in una Form un "CrystalReportViewer" che contenesse il mio Report, avrebbe dovuto essere più facile stamparlo. Solo che non so proprio come si possa fare. Sicuramente tu hai qualche idea in proposito. Aspetto un suggerimento.

    Grazie


    lunedì 4 febbraio 2019 16:31
  • Scusami ancora ma mi sono reso conto solo adesso che posso avere la versione di Syncfusion per le piccole aziende senza pagare nulla. Io ho scaricato la Report Platform, spero sia quella giusta.

    Syncfusion è analogo a Crystal Report? Dopo averlo installato lo trovo dentro Visual Studio? Ovviamente spero ci sia un qualche tutorial,...

    Saluti.

    lunedì 4 febbraio 2019 17:09
  • Come volevasi dimostrare, non ho capito. Ho creato una cartella "Report" così: C:\Users\Public\Report\ e dentro Report ho copiato i miei report. Sui PC in cui ho Visual Studio funziona anche il File.exe, sugli altri no e mi da il seguente errore:

    Errore 5 - L'inizializzatore di tipo di 'CrystalDecision.CrystalReports.Engine.ReportDocument' ha generato un'eccezione

    Però devo dire che non ho usato la stringa che tu mi hai postato

    Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments);

    perché non ho capito come usarla.

    Io ho semplicemente scritto:

    Public Const PathOrigine As String = "C:\Users\Public\Report\"
    Come avrei dovuto fare?

    lunedì 4 febbraio 2019 17:50
  • ..... quindi se il report lo generi su quella cartella e poi lo copi sulla stessa cartella quando installi la tua procedura dovrebbe funzionare correttamente.

    Public documents usualmente è in C:\Users\Public\Documents che puoi ottenere con questo codice:

    Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments);

    ciao


    Sabrina C. - http://www.dotnetwork.it

    Ciao Sabrina.  Probabilmente ho capito come usare la stringa che mi hai indicato. Ho fatto così:

            Rpt.Load(Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments) & "\ReportVariaCli.rpt", CrystalDecisions.[Shared].OpenReportMethod.OpenReportByTempCopy)
    

    ma l'errore che ottengo è sempre lo stesso.

    Aiutooo!!!

    martedì 5 febbraio 2019 01:02
  • Non ho seguito ma se il problema che ti è rimasto è solo CR prova così:

    nella cartella Riferimenti dell'eseguibile trovi i riferimenti a CR tasto dx e alle proprietà di ogni riferimento metti Copia localmente TRUE. L'eseguibile cerca prima sulla sua stessa directory il necessario. Dovrebbe funzionare anche se li copi a manina.

    martedì 5 febbraio 2019 04:17
  • Grazie CelestinoV. (quanto sei mattiniero!!!)

    Adesso provo. Aggiungo ancora che ho potuto installare Visual Studio su un altro PC e l'eseguibile funziona.

    È quindi evidente che Visual Studio installa o consente di riferirsi a qualche componentre che diversamente non è accessibile.

    Se questa ulteriore informazione fa venire in mente a qualcuno dove potrebbe essere il problema, grazie in anticipo.

    Saluti.

    martedì 5 febbraio 2019 07:57
  • ...   nella cartella Riferimenti dell'eseguibile trovi i riferimenti a CR tasto dx e alle proprietà di ogni riferimento metti Copia localmente TRUE. L'eseguibile cerca prima sulla sua stessa directory il necessario. Dovrebbe funzionare anche se li copi a manina.

    Sono già tutti contrassegnati come True.

    Però ho osservato che ciascuno di questi riferimenti  (nel PC con Visual Studio) viene installato così:

    C:\Program Files (x86)\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Common\SAP BusinessObjects Enterprise XI 4.0\win32_x86\dotnet\CrystalDecisions.Windows.Forms.dll

    dove è evidente che viene utilizzata la versione "win32_x86" mentre nei PC senza Visual Studio, avendo io installato il Runtime 64, non ci sono queste dll

    Adesso banalmente le copio nella Directory e poi provo.

    Ti tengo al corrente.

    Saluti

    martedì 5 febbraio 2019 08:49
  • Credo di avere RISOLTO, ma non vorrei cantare vittoria troppo presto. Riassumo quello che ho fatto sul PC Client nel quale non sono installati né Visual Studio, né Access (nel mio caso 2007), né Acrobat.

    1 - Ovviamente ho installato il Runtime di Access, ma va bene anche Access Database Engine.

    2 - Ho installato sia il Runtime 64 che 32 di Crystal Report.

    3 - Come ha suggerito Sabrina, ho posizionato i miei Report qui "C:\Users\Public\Documents\Report\" e ovviamente il path necessario a reperire i report deve essere congruente.

    4 - Constatato che comunque il Runtime "CRRuntime_32bit_13_0_24" non installa tutte le dll che invece vengono installate automaticamente quando si installa Crystal Report in Visual Studio, ho brutalmente copiato tutto il contenuto di "C:\Program Files (x86)\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Common\SAP BusinessObjects Enterprise XI 4.0\win32_x86\dotnet" del PC di origine nella stessa directory del PC destinazione. Il Runtime "CRRuntime_32bit_13_0_24" infatti installa solo una dll, mentre ne servono molte di più.

    5 - Ho eseguito la compilazione con CPU di destinazione x86 e non x64 o AnyCPU (come suggerito da Super Boccio) ed ho prelevato il file .exe da "C:\MiaDirectory\MiaSubDirectory\MioProgetto\bin\Release\"

    Così, per adesso, funziona.

    Se, come immagino qualcuno ha delle osservazioni da farmi, ben vengano. Sarebbe utile poter trovare Runtime di Crystal report che installasee tutte le dll da solo, ma non so dove e come trovarlo.

    Aspetto (con ansia) le vostre risposte.

    Saluti.

    P.S.: Adesso devo creare un complicato Installer. Proverò ad usare InnoSetup, ma l'ultima volta che l'ho fatto è stato molto tempo fa e con VB6. Accetto consigli.

    martedì 5 febbraio 2019 10:17
  • Direi che hai fatto una cosa di buon senso, usando un po' il McGyver che è in tutti noi e hai risolto brillantemente.

    Per crystal l'unico luogo ove guardare è il sito di SAP, non ho idea se c'è un installer per le librerie client.

    Per il resto direi bravissimo.

    Un suggerimento: Guarda il programma licenza Community di Syncfusion e vedi se puoi rientrarvi.

    saluti


    Sabrina C. - http://www.dotnetwork.it

    martedì 5 febbraio 2019 11:40
  • Scusa tu ho risposto prima all'ultimo messaggio e non avevo visto: La PDF engine che ti permette di creare i PDF al volo è una libreria da referenziare, il Report Viewer e il Report Generator sono molto simili e forse possono importare sia un report access che un report crystal anche perché usano l'estensione RPT.

    se hai installato la libreria syncfusion, puoi usare la loro utility che trovi facendo tasto destro sul menu di aggiunta Reference di Visual studio ti da una dialog dove puoi selezionare PDF engine e aggiunge i reference necessari al tuo progetto.

    saluti


    Sabrina C. - http://www.dotnetwork.it

    martedì 5 febbraio 2019 11:51
  • Grazie Sabrina, sia per i complimenti che per i suggerimenti. Io però sono di coccio e anche ancora molto ignorante in materia. E poi comunque l'età non aiuta (sabato sono arrivato a 72) per cui non è che ho capito molto della tua ultima risposta.

    Non ho ancora installato nulla di syncfusion perchè mi sono incapponito a trovare la soluzione di cui sopra (e ho fatto bene). Appena avrò installato syncfusion mi farò vivo. Dve ti posso scrivere per essere certo che mi vedrai?

    Adesso comunque devo affrontare InnoSetup e non mi ricordo più molto neanche di questo; ricordo che può creare un file che incorpora quello che c'è da copiare e/o creare e poi lo fa nel posto giusto, ma non so se può avviare un file eseguibile come i diversi Runtime che devo utilizzare. Mi puoi dare qualche indicazione?

    Saluti.

    martedì 5 febbraio 2019 13:07
  • Di solito passo spesso qui sul forum per dare risposte, ma puoi comunque trovarmi sul Blog tecnico che scrivo.

    Ti posto il link agli articoli che parlano di stampe, sono pochi perché io non faccio quasi mai report (per mia fortuna) ma mi piace sempre rispondere a chi ha domande su ogni argomento.

    http://www.sabrinacosolo.com/?s=report

    Saluti


    Sabrina C. - http://www.dotnetwork.it

    martedì 5 febbraio 2019 14:12
  • Ciao Sabrina. Infatti ti ho anche scritto sul tuo Blog, che ho visitato grazie al Link che mi hai pstato relativamente a InnoSetup. Ho visto che tu lanci da dentro il Setup la ricerca del Framework 4.5; probabilmente dovrei farlo anch'io per il Framework 3.5 e per il 4.7. Purtoppo io conosco solo VB e non C#, quindi ti chiedo, se converto il codice C# in VB con i traduttori automatici, funzionerà? e poi, io avrei bisogno, a questo punto, di lanciare anche il Crystal Report Runtime e Access Runtime da dentro il Setup, in modo che non debba costringere i miei utilizzatori a lanciare i Runtime a mano. Questo si può fare? e come? (analogamente a quello che hai fatto tu con la ricerca del Framework, immagino). In più dovrei anche poter installare PRIMA il Crystal Report Runtime e POI fare il setup, perchè nel setup copio alcune dll in una cartella che viene creata dal Crystal report Runtime.

    Spero di essere stato chiaro e sintetico.Saluti,

    P.S.: comunque, adesso che li posso stampare, i miei Report funzionano proprio bene; non lo immaginavo neppure, ma nei PC nei quali non ho nessun gestore di PDF, ci pensa Microsoft Edge!!

    mercoledì 6 febbraio 2019 22:28