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



Facebook
LinkedIn
Twitter
RSS