Una pregunta muy frecuente en internet es cual es la cadena de conexión que se debe utilizar para conectar un reporte de crystal con SQL Server.
Un poco de teoría
Crystal Reports es el mecanismo “Oficial” de creación de reportes en Visual Studio 2005. uno de los problemas que presenta estos reportes es que vienen incluidos en Visual Studio pero no se cuenta con el SDK correspondiente para poder experimentar o aprender un poco sobre esta excelente herramienta. Existen muchas formas de conectarse y usar los reportes de crystal en el caso del ejemplo hare una conexión utilizando OLE DB(ADO) y autenticacion de SQL Server.
Como muestra decidí hacer un ejemplo el cual pudiera compartir con muchos desarrolladores igual a mi que alguna vez tuvieron ese problema.
El siguiente ejemplo es desarrollado con:
- Visual Studio 2005 Profesional
- Crystal Reports Versión incluida en Visual Studio 2005
- SQl Server 2005 Express
- Base de datos NorthWind
Para empezar crearemos un proyecto de Visual Studio al cual llamaremos “Reportes”, ustedes pueden utilizar el nombre que deseen.
damos click en “Aceptar” y nos aparece la siguiente ventana
luego Click en el menú “Proyecto”
Click en “Agregar nuevo elemento”
En la siguiente ventana nos aparecen las plantillas que actualmente tenemos instaladas
damos Click en “Agregar” y nos aparece el asistente de reportes
nos aparecen 3 opciones
1- Usar asistente de informes que nos muestra un asistente que nos va guiando paso a paso en la creacion de un informe con unas plantillas prediseñadas con las que cuenta.
2- Como un informe en Blanco esta opcion se recomienda para usuarios experimentados, pero no se preocupen es muy sencilla de usar y una vez lo usas veras que sencillo es.
3- A partir de un informe existente esta opcion nos sirve para reutilizar plantillas o informes que ya hemos creado con anterioridad y solo queremos hacer unos pequeños cambios
seleccionamos la opción “Como informe en Blanco”
y ya estamos listos para comenzar
luego damos click derecho en la parte superior izquierda sobre el icono que dice “Campos de la base de datos”
Luego en la opción “Asistente de base de datos…”
el cual nos muestra el explorador de orígenes de datos desde la cual podemos crear una conexión con nuestro origen de datos o usar una existente.
expandimos el nodo “Crear nueva conexión” dentro de la cual veremos una gran variedad de origenes de datos a los que nos podemos conectar desde nuestro reporte de crystal.
expandimos el nodo “OLE DB(ADO)”
Seleccionamos el proveedor para SQL Server ydamos Click en siguiente
se nos muestra una lista desplegable
1- Servidor nos muestra las instancias de SQL instaladas en nuestra PC o en la red Local si así fuera el caso pero también podemos escribir un Dominio donde este alojado nuestro origen de datos o Base de Datos así como también una dirección IP y hasta incluso un numero de puerto por si no utilizáramos el puerto que trae por defecto SQL Server que es el 1433.
2- Id. del usuario esta opción solo es necesaria si usamos autenticación de SQL server para conectarnos al origen de datos que en nuestro caso así lo estamos haciendo pero es mas recomendable utilizar la seguridad integrada.
3- Contraseña solo es necesaria si indicamos un Id. de usuario.
4- Base de datos es la base de datos desde donde se mostraran los datos en el reporte.
5- Seguridad Integrada esta casilla la marcamos si vamos a utilizar la seguridad integrada de Windows en vez de autenticación SQL Server.
llenamos los datos, seleccionamos la base de datos Northwind que es la que utilizaremos en el ejemplo y damos Click en “Siguiente”
desde aquí seleccionamos las tablas que necesitaremos para mostrar datos en nuestro reporte
Seleccionamos la tabla “Products” damos click en el botón seleccionado a la izquierda se muestran las tablas u objetos de los que podemos seleccionar para usar con nuestro reporte y en la parte derecha las opciones que estarán disponibles cuando estemos desarrollando nuestro reporte. Luego que ya tenemos las tablas que necesitaremos damos click en “Aceptar”. Y ya nos aparecen los campos de las tablas antes seleccionadas disponibles para poder usar en nuestro reporte de ejemplo
diseñamos nuestro reporte esta parte la saltaremos porque solamente estamos tratando la conexión con el reporte no el diseño ;-)
una vez tenemos listo el reporte lo guardamos lo cerramos y nos vamos al diseñador de Windows Form de Visual Studio 2005 e insertamos una instancia de la clase “CrystalReportViewer”
Presionamos “F7” para que nos muestre el código del formulario actual
Escribimos algo de código
Imports CrystalDecisions.ReportSource
Imports CrystalDecisions.Shared
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.CrystalReports
Imports CrystalDecisions.Windows
Imports CrystalDecisions.Windows.Forms
Imports System.Windows.Forms
Public Class Form1
Private MyPath As String
Private informe As New ReportDocument
Private Sub MostrarReporte()
'debes de remplazar la informacion userid
'y password por el que tengas en tu maquina o servidor
Dim DataBaseName As String = "Northwind"
Dim UserID As String = "sa"
Dim Password As String = "123456"
Dim ServerName As String = "127.0.0.1, 1433"
Dim IntegratedSecurity As Boolean = False
Try
Dim NombreReporte As String = "RptProductos.rpt"
Dim miConexionInfo As ConnectionInfo = New ConnectionInfo()
miConexionInfo.DatabaseName = DataBaseName
miConexionInfo.UserID = UserID
miConexionInfo.Password = Password
miConexionInfo.ServerName = ServerName
miConexionInfo.IntegratedSecurity = IntegratedSecurity
If informe.IsLoaded Then
informe.Close()
informe.Dispose()
End If
informe = New ReportDocument()
Dim reportPath As String = Application.StartupPath & "\" & NombreReporte
informe.Load(reportPath)
Loguearse(miConexionInfo, informe)
With Me.CrystalReportViewer1
.DisplayGroupTree = False
.Zoom(75)
End With
Me.CrystalReportViewer1.Refresh()
Me.CrystalReportViewer1.ReportSource = informe
Catch ex As Exception
Windows.Forms.Cursor.Current = Cursors.Default
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Try
Exit Sub
End Try
End Sub
Public Sub Loguearse(ByVal myConnectionInfo As ConnectionInfo, ByVal myReportDocument As ReportDocument)
Dim myTables As Tables=myReportDocument.Database.Tables
For Each myTable As CrystalDecisions.CrystalReports.Engine.Table In myTables
Dim myTableLogonInfo As TableLogOnInfo = myTable.LogOnInfo
myTableLogonInfo.ConnectionInfo = myConnectionInfo
myTable.ApplyLogOnInfo(myTableLogonInfo)
Next
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
MostrarReporte()
End Sub
End Class
Y nuestro reporte con conexión a SQL Server ya esta listo
Espero que les sea de utilidad y espero sus comentarios pueden descargar el ejemplo de Aqui.
Atte.
Cristhian Velasquez.