Crystal Reports e passaggio di parametri a report e sottoreport

April 23rd, 2008 by Delivery Leave a reply »

Con il seguente codice avrete la possibilità di gestire l’autenticazione del report principale e di tutti i sottoreport da esso richiamati, oltre alla possibilità di passare eventuali parametri impostati nel report (nell’esempio vengono letti da quarystring, ma potrebbero benissimo essere parametri di session…). Il mio problema era proprio quello di settare i parametri di connessione dei singoli sottoreport. E’ la funzione “SetDBLogonForSubreports” che svolge questo compito.

Spero possa esservi di aiuto: (prerequisiti: Visual Studio 2005 e CrystalReports)

Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Imports System.IO

Partial Class _Default
    Inherits System.Web.UI.Page
    Private MyReport As ReportDocument
    Private Sub ConfigureCrystalReports()

        'carico il report
        MyReport = New ReportDocument()
        Dim reportPath As String = Server.MapPath("TuoReportMaster.rpt")
        MyReport.Load(reportPath)

        'passo i parametri di connessione al report
        Dim myConnectionInfo As ConnectionInfo = New ConnectionInfo()

        'parametri presenti nel webconfig
        myConnectionInfo.DatabaseName =
        System.Configuration.ConfigurationManager.AppSettings("Database")
        myConnectionInfo.UserID =
        System.Configuration.ConfigurationManager.AppSettings("UserName")
        myConnectionInfo.Password =
        System.Configuration.ConfigurationManager.AppSettings("Password")
        myConnectionInfo.ServerName =
        System.Configuration.ConfigurationManager.AppSettings("Server")

        'autentico il mio report principale
        SetDBLogonForReport(myConnectionInfo, MyReport)

        'autentico tutti i sottoreport richiamati dal report principale
        SetDBLogonForSubreports(myConnectionInfo, MyReport)

        'passo eventuali parametri al report principale
        Dim paramFields As New ParameterFields()
        Dim discreteVal As New ParameterDiscreteValue()
        Dim parametro1 As New ParameterField()
        Dim parametro2 As New ParameterField()

        'passo il primo parametro
        parametro1.ParameterFieldName = "@Parametro1DelReport"
        discreteVal = New ParameterDiscreteValue()
        discreteVal.Value = Request.QueryString("Parametro1")
        'in questo caso leggo da una querysting
        MyReport.SetParameterValue("@Parametro1DelReport", discreteVal.Value)

        'passo il secondo parametro
        parametro2.ParameterFieldName = "@Parametro2DelReport"
        discreteVal = New ParameterDiscreteValue()
        discreteVal.Value = Request.QueryString("Parametro1")
        'secondo parametro anche passato in querysting
        MyReport.SetParameterValue("@Parametro1DelReport", discreteVal.Value)
    End Sub

    Private Sub SetDBLogonForReport(ByVal myConnectionInfo
                    As ConnectionInfo, ByVal myReportDocument As ReportDocument)
        'subroutine che setta i parametri di connessione del report principale
        Dim myTables As Tables = myReportDocument.Database.Table
        Dim myTable As CrystalDecisions.CrystalReports.Engine.Table
        For Each myTable In myTables
            Dim myTableLogonInfo As TableLogOnInfo = myTable.LogOnInfo
            myTableLogonInfo.ConnectionInfo = myConnectionInfo
            myTable.ApplyLogOnInfo(myTableLogonInfo)
        Next
    End Sub

    Private Sub SetDBLogonForSubreports(ByVal myConnectionInfo
                    As ConnectionInfo, ByVal myReportDocument As ReportDocument)
        'subroutine che setta i parametri di connessione di
        'tutti i sottoreport richiamati dal report principale
        Dim mySections As Sections = myReportDocument.ReportDefinition.Sections
        Dim mySection As Section
        For Each mySection In mySections
            Dim myReportObjects As ReportObjects = mySection.ReportObjects
            Dim myReportObject As ReportObject
            For Each myReportObject In myReportObjects
                If myReportObject.Kind = ReportObjectKind.SubreportObject Then
                    Dim mySubreportObject As SubreportObject =
                    CType(myReportObject, SubreportObject)
                    Dim subReportDocument As ReportDocument =
                    mySubreportObject.OpenSubreport mySubreportObject.SubreportName)
                    SetDBLogonForReport(myConnectionInfo, subReportDocument)
                End If
            Next
        Next
    End Sub

    Protected Sub Page_Load(ByVal sender As Object,
                                ByVal e As System.EventArgs) Handles Me.Load

        'richiamo i parametri di configurzione
        ConfigureCrystalReports()

        'esporto il report in pdf
        Dim oStream As New MemoryStream ' // using System.IO
        oStream = MyReport.ExportToStream
                        (CrystalDecisions.Shared.ExportFormatType.PortableDocFormat)
        Response.Clear()
        Response.Buffer = True
        Response.ContentType = "application/pdf"
        Response.BinaryWrite(oStream.ToArray())
        Response.End()
    End Sub

End Class

Se tutto è stato impostato correttamente dovreste vedere il vostro bel pdf saltare fuori :)

Advertisement

Leave a Reply