E' uno strumento di sviluppo per la generazione di reports. Distribuito dalla SAP SE, i punti di forza sono la sua semplicità di utilizzo, velocità di realizzazione dei template. Il suo limite è dato dalle basse performance nel caso di una elevata quantità di dati.
Autenticazione ASP.NET su Crystal Reports
Se si vuole in ASP.NET visualizzare un Report di Crystal Reports, è sufficente inserire in una pagina ASP un oggetto CrystalReportViewer e opportunamente configurarlo per collegarlo al report desiderato. Una volta fatto questo, si presenta il problema che all'apertura del report chiede la password e l'utente per autenticarsi nel database da cui il report legge i dati. Se si presenta questo problema, sarà sufficente riprodurre il codice sottostante nella pagina VB dove l'oggetto CrystalReportViewer è stato inserito.
Imports CrystalDecisions.CrystalReports.Engine
Public Class ReportViewer
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim Report As New ReportDocument
'Indico il Report da caricare
Report.Load(Server.MapPath("ReportDaCaricare"), CrystalDecisions.Shared.OpenReportMethod.OpenReportByTempCopy)
'Fornisco utente e password per evitare che vengano chieste all'utente
Report.SetDatabaseLogon("utente", "password")
'Indico il report da aprire
CRViewer.ReportSource = Report
End Sub
End Class
Filtrare i dati da caricare
Molte volte, non si ha la necessità di visualizzare sul report tutti i dati a cui Crystal Report viene collegato, ma si desidera applicare un filtro alla fonte dati, in modo da non caricare tutti i dati. Il comando per poter fare questo è il "SelectionFormula".
Di seguito un esempio:
CRViewer.SelectionFormula=
{comando.ID} = 1 AND {comando.PeriodoDal} >= #01/01/2013 00:00:00# AND {comando.PeriodoAl} <= #31/12/2013 23:59:00#
Va tenuto conto che se si vuole filtrare un campo del DB che contiene date, bisogna usare il # (cancelletto) e ovviamente il campo del DB deve essere di tipo Data.
C'è anche un'altro metodo per filtrare i dati su un Report, ed è tramite l'utilizzo dei parametri. Questo metodo però carica tutti i dati dalla sorgente dati e poi a Report filtra i dati. Se i dati sono pochi da visualizzare non presenta molte differenze con il metodo precedente, ma se al contrario i dati sono molti, appesantisce di molto il caricamento del report, senza considerare che lavorando per parametri, ogni volta che desidero filtrare i dati, sono costretto a impostarli tutti, mentre con il metodo SelectionFormula, posso cambiare il filtro ogni volta che desidero.
Il metodo di filtrare con SelectionFormula, di adatta molto bene a prima che il report venga caricato, mentre filtrare per parametri, si adatta meglio a Report già caricato, ma voglio applicare nil filtro in un secondo momento.
Problemi caricamento pagine in Crystal Reports
Se si stà sviluppando in ASP.NET e si vuole caricare un report sviluppato con Crystal Reports, può capitare che non riesca a caricare oltre la seconda pagine. Per risolvere questo problema, ho adottato la seguente soluzione:
Private Sub CaricaReport()
'Istruzioni per il caricamento del Report
...............
...............
...............
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Session("ReportGiaCaricato") Is Nothing Then
CaricaReport()
Session("ReportGiaCaricato") = 1
End If
End Sub
Private Sub CRViewer_Init(sender As Object, e As System.EventArgs) Handles CRViewer.Init
CaricaReport()
End Sub
Private Sub CRViewer_Unload(sender As Object, e As System.EventArgs) Handles CRViewer.Unload
Session.Remove("ReportGiaCaricaro")
End Sub
Numero progressivo righe
Capita a volte di dover numerare le righe dei nostri report. Ecco la procedura:
1) Crea una formula nominandola ad esempio "Progressivo_Righe"
2) Scrivere la seguente formula:
WhilePrintingRecords;
NumberVar n;
n := n + 1;
3) Inserire la formula appena creata nelle righe di dettaglio