La Güeb de Joaquín
Programación Visual Basic .NET
Crystal Reports
Como se utiliza Crystal Reports en VB .NET
Sumario
Este documento describe como se emplea el control Crystal Reports en Visual Basic NET
Índice de contenidos
Como se utiliza Crystal Reports en VB .NET... 1
En documentos Windows... 1
A) Utilizar un control CristalReportViewer ... 2
b) Impresión directa en la impresora... 3
c) Generando un fichero con formato PDF ... 3
En documentos ASP NET... 5
A) Utilizar un control CristalReportViewer ... 5
b) Impresión directa en la impresora... 6
c) Generando un fichero con formato PDF ... 6
Fecha de última impresión: 23/02/2005 22:48:09
Autor.: joaquin Medina Serrano ([email protected])
URL de este documento:
http://jms32.eresmas.net/tacticos/programacion/
VBNet/VBN03/alg_CrystalReports/ CrystalReportsyNET.pdf
En documentos Windows
En principio para utilizar Crystal Reports hay que importar los espacios de nombres
Imports CrystalDecisions.CrystalReports.Engine Imports CrystalDecisions.Shared
A continuación hay que generar el informe, cosa que no voy a explicar aquí como se hace,
porque si no sabes como se hace no debes leer este documento porque que no entenderás ni
nada de nada
A) Utilizar un control CristalReportViewer
Después de haberlo dejado en el formulario, y suponiendo que el control se llame
CristalReportViewer1, y que el informe se llame CrystalReportAutores el código que hay que
incluir es el siguiente.
La función siguiente es un poco especial, en el sentido de que los datos que se cargan en el
control no son los que selecciona el informe, sino que los pasamos en un DataSet y ese
conjunto de datos son los que se representan en el informe. Por ejemplo, supongamos que el
informe imprime todos los autores de libros de España, con esta función podemos utilizar el
mismo informe para imprimir únicamente los autores de Zaragoza, o los de Valencia, según
los datos que se pasen en el DataSet del parámetro.
Mostrar una vista previa con un control CrystalReportViewer
Public Sub Accion_ImprimirDatosVistaPrevia( _ ByRef ConjuntoDeDatos As DataSet)
CrystalReportViewer1.Visible = True
Dim miInforme As New CrystalReportAutores miInforme.SetDataSource(ConjuntoDeDatos) CrystalReportViewer1.ReportSource = miInforme End Sub
El código siguiente es el que presenta la ayuda MSDN, realiza el mismo trabajo pero tiene el
inconveniente de que estamos accediendo a un recurso que esta en una dirección física del
disco, con lo que la portabilidad del código es menor
Mostrar una vista previa según la ayuda MSDN (mejor no emplear)
' Ayuda MSDN, entrada
' Opciones de enlace de informes de Windows Forms Viewers
' Imports CrystalDecisions.CrystalReports.Engine Public WithEvents oRpt As ReportDocument
Public Sub Accion_imprimirDatos( _
ByRef ConjuntoDeDatos As DataSet)
CrystalReportViewer1.Visible = True oRpt = New ReportDocument
oRpt.Load("../informes/CrystalReportAutores.rpt")
'Utilizar el modelo de objetos Report Engine 'para pasar conjuntos de datos llenos al informe oRpt.SetDataSource(ConjuntoDeDatos)
' enlazar el objeto de informe con datos a ' Web Forms Viewer
CrystalReportViewer1.ReportSource = oRpt End Sub
b) Impresión directa en la impresora
Imprimir directamente en la impresora predeterminada
Protected Overrides Sub Accion_ImprimirDirectoEnImpresora() Dim oDataSet As New DataSet
oDataSet.Merge(Me.AuthorData)
Dim MiInforme As New CrystalReportAutores
' enganchar los datos a imprimir MiInforme.SetDataSource(oDataSet)
' Imprimir el informe. Establecer los parámetros
‘ startPageN y endPageN en 0 para imprimir todas las páginas. MiInforme.PrintToPrinter(1, False, 0, 0)
End Sub
c) Generando un fichero con formato PDF
Por ultimo tenemos otra opción que consiste en imprimir el informe en un documento PDF o
RTF, y guardarlo en disco. La forma de hacerlo se muestra en la siguiente función, como en
los ejemplos anteriores se pasa el conjunto de datos que se quieren imprimir
Imprimir en un fichero PDF
'/** ****************************************************** ' Función : InformeCrystal_Forms_ImprimirDatosFormatoPDF '--- ' Propósito ...:
' Genera un fichero FDF a partir de un informe Cristal ' Parámetros ...:
' Necesita recibir a través de los parámetros ' * El conjunto de datos a imprimir (DataSet)
' * El informe que utiliza para imprimir(Crystal Report) ' * El nombre del fichero para el documento PDF
' Observación ...:
' Solo funciona con Formularios Windows
' Necesita una referencia al espacio de nombres ' * CrystalDecisions.Shared
' * CrystalDecisions.CrystalReports.Engine
'--- '*/
Public Sub InformeCrystal_Forms_ImprimirDatosFormatoPDF( _ ByVal pConjuntoDeDatos As System.Data.DataSet, _ ByVal pInformeCrystal As _
CrystalDecisions.CrystalReports.Engine.ReportDocument, _ ByVal pNombreFichero As System.String)
Try
' indicamos que el destino será un archivo del disco Dim diskOpts As New CrystalDecisions.Shared. _ DiskFileDestinationOptions
' establecer el nombre del archivo de disco diskOpts.DiskFileName = pNombreFichero
'establecer el formato de exportación With pInformeCrystal.ExportOptions 'opciones de archivo de disco .DestinationOptions = diskOpts ' documento PDF .ExportFormatType = CrystalDecisions.Shared. _ ExportFormatType.PortableDocFormat ' documento rtf '.ExportFormatType = ExportFormatType.RichText ' documento Doc '.ExportFormatType = ExportFormatType.WordForWindows ' en disco .ExportDestinationType = CrystalDecisions.Shared. _ ExportDestinationType.DiskFile End With ' exportamos el informe pInformeCrystal.Export()
' informar de que se ha hecho sin problemas MessageBox.Show( _
"Terminada la grabación en disco del fichero" & _ ControlChars.CrLf & "[" & pNombreFichero & "]", _ "Proceso de Grabacion", _ MessageBoxButtons.OK, _ MessageBoxIcon.Information, _ MessageBoxDefaultButton.Button1, _ MessageBoxOptions.DefaultDesktopOnly) ' continua en el Finally '--- ' ayuda MSDN ' Entrada [ExportToDisk]
'El siguiente ejemplo exporta el informe a disco 'como documento RTF.
'[Visual Basic]
' Report.ExportToDisk(ExportFormatType.RichText, "report.rtf") '---
Catch ex As Exception
' informar de la excepcion antes de enviarla hacia arriba MessageBox.Show( _
"ERROR" & ControlChars.CrLf & _
"Durante el proceso de generación del documento PDF" & _ " ha aparecido el siguiente error:" & _
ControlChars.CrLf & ex.Message, _ "Proceso de Grabacion", _
MessageBoxButtons.OK, _ MessageBoxIcon.Error, _
MessageBoxDefaultButton.Button1, _ MessageBoxOptions.DefaultDesktopOnly)
' lanzar el error hacia arriba Throw
Finally
' cargarme las variables empleadas ' cerrar el informe
If Not pInformeCrystal Is Nothing Then pInformeCrystal.Close()
pInformeCrystal = Nothing End If
If Not pConjuntoDeDatos Is Nothing Then pConjuntoDeDatos = Nothing
End If
If Not pNombreFichero Is Nothing Then pNombreFichero = Nothing
End If End Try
End Sub
En documentos ASP NET
También se pueden emplear el control CrystalReport en documentos ASP Net pero el código
tiene algunas diferencias sutiles.
A) Utilizar un control CristalReportViewer
Mostrar una vista previa con un control CrystalReportViewer
Public Sub Accion_ImprimirDatosVistaPrevia( _ ByRef ConjuntoDeDatos As DataSet)
CrystalReportViewer1.Visible = True
Dim miInforme As New CrystalReportAutoresWeb miInforme.SetDataSource(ConjuntoDeDatos) CrystalReportViewer1.ReportSource = miInforme End Sub
b) Impresión directa en la impresora
### FALTA ###
Esta mal hay un error
Public Sub Accion_ImprimirImpresora( _ ByRef ConjuntoDeDatos As DataSet)
'--- ' no consigo hacerla funionar
' me da el problema de que no reconoce la impresora por defecto Exit Sub
'---
Dim miInforme As New CrystalReportAutoresWeb ' enganchar los datos a imprimir
miInforme.SetDataSource(ConjuntoDeDatos)
' Seleccionar la impresora.
miInforme.PrintOptions.PrinterName = String.Empty
' Imprimir el informe. Establecer los parámetros
' startPageN y endPageN en 0 para imprimir todas las páginas. miInforme.PrintToPrinter(1, False, 0, 0)
End Sub
c) Generando un fichero con formato PDF
En realidad no es un fichero, sino una descarga directa al navegador de un documento PDF
Es una de las partes más difíciles
Aún no estoy convencido de que este código este libre de errores,
Funcion preparatoria
Public Sub Accion_imprimirDatos_FormatoPDF() ' instancia de un nuevo informe
Dim MiInforme As New CrystalReportAutoresWeb ' enganchar los datos a imprimir
MiInforme.SetDataSource(oDataSet)
' llamar a la funcion que hace el trabajo ExportToPDF(MiInforme)
Exportar en formato PDF
Private Sub ExportToPDF(ByVal oRpt As ReportDocument)
'--- ' origen de este código (18/02/2005)
' http://www.devx.com/tips/Tip/18010 ' Export Crystal Reports to PDF
' Use this code when you're developing Web pages and you need to ' export Crystal Reports to PDF without creating their own files. ' The undocument FormatEngine property of ReportDocument class ' (you can see it using ObjectBrowser or ILDASM) gets the job done: '---
Dim crExportOptions As ExportOptions
crExportOptions = oRpt.ExportOptions
With crExportOptions
.FormatOptions = New PdfRtfWordFormatOptions
.ExportFormatType = ExportFormatType.PortableDocFormat End With
Dim req As ExportRequestContext = New ExportRequestContext req.ExportInfo = crExportOptions Dim st As System.IO.Stream st = oRpt.FormatEngine.ExportToStream(req) Response.ClearContent() Response.ClearHeaders() Response.ContentType = "application/pdf" Dim ln As Integer = 0 ln = CInt(st.Length) Dim b(ln) As Byte st.Read(b, 0, ln) Response.BinaryWrite(b) Response.End() End Sub