miércoles, 21 de enero de 2009

Conectar un reporte de Crystal con SQL Server 2005 desde Visual Basic.NET

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.

image

damos click en “Aceptar” y nos aparece la siguiente ventana

image

luego Click en el menú “Proyecto”

image

Click en “Agregar nuevo elemento”

image

En la siguiente ventana nos aparecen las plantillas que actualmente tenemos instaladas

image

damos Click en “Agregar” y nos aparece el asistente de reportes

image

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”

image

y ya estamos listos para comenzar

image

luego damos click derecho en la parte superior izquierda sobre el icono que dice “Campos de la base de datos”

image

Luego en la opción “Asistente de base de datos…”

image

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.

image

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.

image

expandimos el nodo “OLE DB(ADO)”

image

Seleccionamos el proveedor para SQL Server ydamos Click en siguiente

image

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.

image

llenamos los datos, seleccionamos la base de datos Northwind que es la que utilizaremos en el ejemplo y damos Click en “Siguiente”

image

desde aquí seleccionamos las tablas que necesitaremos para mostrar datos en nuestro reporte

image

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

image

diseñamos nuestro reporte esta parte la saltaremos porque solamente estamos tratando la conexión con el reporte no el diseño ;-)

image

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”

image

Presionamos “F7” para que nos muestre el código del formulario actual

image

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

image

Espero que les sea de utilidad y espero sus comentarios pueden descargar el ejemplo de Aqui.

Atte.

Cristhian Velasquez.

25 comentarios:

  1. hola mira soy nuevo en esto de programar en vb net y bueno estoy queriendo hacer un reporte pero el problema es que no puedo establecer la coneccion de la base de datos tu ocupas la bas master northwind y bueno yo no ocupo esa ocupo una que esta en la siguiente ruta \net\inv_tri\trdb la pregunta como hago para establecer esa conexion te agradecere la ayuda.
    mil gracias

    ResponderEliminar
  2. Entonces es una base de datos que no esta dentro del servidor de datos SQLServer si no que es una base de datos que simplementa la copias como elemento incrustado?'?

    ResponderEliminar
  3. Hola!
    Como hacer un codigo fuente de un boton para mandar a imprimir el reporte de otro formulario??

    ResponderEliminar
  4. Si podés enviame el código a mi correo:
    balmo_campos@hotmail.com
    Please!

    ResponderEliminar
  5. me gustaria que si podes colocar la parte que te saltastes de esta seccion de crystalreport porque de ahí no entiendo mucho

    ResponderEliminar
  6. hola pues yo quisiera saber la parte que se salto porq creo q ese es mi problema porq cuando le doy correr me dice que el reporte no ha sido cargado y no se q es el error ya que el codigo no me da ningun error.
    mi correo es karlaescobar21@hotmail.com
    Muchas gracias

    ResponderEliminar
  7. Hola Cristhian, mi pregunta porque utilizas OLE DB provider for SQL y no SQL NATVE, ya que teniendo el mismo usuario y contraseña con el sql native no me deja ingresar me manda error de logon y con el PROVIDER acceso sin problema.

    ResponderEliminar
  8. Hola Crystian, una consula estoy trabajando crystal reports del visual studio. net 2005 y sql servers 2005 satandard, por el crystal reports me coneto perfectamete pero no puedo mi base de datos creada, no se a q se debe el problema espero me ayuden . gracias
    saludos carlos

    ResponderEliminar
  9. HOLA, EL PROBLEMA QUE TENGO ES QUE ME PUEDO CONECTAR A LA BASE DE DATOS CON EL USUARIO SA PERO SIN EMBARGO DOLO PUEDO VER LAS TABLAS, NO ME PERMITE VER NI LAS VISTAS NI LOS PROCEDIMIENTOS ALMACENADOS, OJALA ME PUEDAS AYUDAR MI CORREO edilaq@hotmail.com

    ResponderEliminar
  10. Hola, Tengo un problema y no se como hacer para que funcione resulta que estoy trabajando en una aplicación vb.net 2005 y sql server 2005 cuando genero los reportes funciona perfectamente en XP pero al ser instalado en Windows Vista me muestra un error de que no se encuentra el proveedor especificado o que es posible que no este instalado Correctamente entonces no se como hacer para que se genere mejor dicho cual podria ser el problema
    Gracias

    ResponderEliminar
  11. Para poder ayudar por favor den mas detalles del problema y con gusto les ayudare. Gracias.

    ResponderEliminar
  12. Muy buena tu explicacion, excelente...
    yo que no veia el crystal desde la version 4.6,
    me adapte rapidisimo gracias a tu ejemplo.

    Gracias por tu blog.

    ResponderEliminar
  13. Hola:
    Tengo el mismo problema que el ultimo anonimo comenta, se trata de que en win xp mis reportes de crystal 8.5 funcionan perfectamente, sin embargo desde la semana pasada estan presentando el siguiente error:"no se encuentra el proveedor especificado o que es posible que no este instalado Correctamente". algunos reportes funcionan correctamnente, sin embargo se dañaron la mayoria. trabajo crystal reports, vs .net 2005, sql server 2005.
    Tiene usted idea de que pueda ser? por favor escribame a willyeruiz@hotmail.com Mil gracias de antemano por su colaboracion.

    ResponderEliminar
  14. Hola:
    En el comentario anterior se me olvidaba comentarte que el error solo ocurre en win vista. en Win XP y Win 7 funciona correctamente.

    ResponderEliminar
  15. Hola:
    Tengo el mismo problema que el ultimo anonimo comenta, se trata de que en WIN XP y WIN 7 mis reportes de crystal 8.5 funcionan perfectamente, sin embargo desde la semana pasada estan presentando el siguiente error en WIN VISTA: "no se encuentra el proveedor especificado o que es posible que no este instalado Correctamente". algunos reportes funcionan correctamnente, sin embargo se dañaron la mayoria. trabajo crystal reports, vs .net 2005, sql server 2005.
    Tiene usted idea de que pueda ser? por favor escribame a willyeruiz@hotmail.com Mil gracias de antemano por su colaboracion.

    ResponderEliminar
  16. Hola tengo Visual Studio 2010 y Cristal Report de SAP, en el equipo de desarrollo me sale todo bien, y cargo los dll en la carpeta bin bien... El problema es cuando lo publico al IIS, ahí sale un error de coenxión con la base de datos, no entiendo porque comete ese error ya que en el sevidor da para conectarse con la base de datos con otros objetos. Alguna solución?

    ResponderEliminar
  17. MUy buen ejemplo gracias, una pregunta y si deseo aplicar un filtro al resultado a mostrarse en mi reporte como le pasa la consulta

    ResponderEliminar
    Respuestas
    1. Seria igual, solamente que habria que agregarle parametros al reporte e igualmente enviarle los valores de ese parametros desde donde se llame al reporte.

      Eliminar
  18. Hola Cristhian, oie muy agradecida por la información que publicaste, implementé tu código y solo tengo un pequeño problema: Cuando mando la impresión del reporte en vista preliminar, me muestra un mensaje en la parte superior que dice "Referencia a objeto no establecida como instancia de un objeto", sin embargo Si me muestra los datos correctos en el reporte, y si le cambio el zoom me marca "No se ha podido cargar el informe", e insisto, pese al mensaje, si me muestra la información correcta. Que puede ser?

    ResponderEliminar
  19. Hola Angel, me podrias indicar a cual conexion te refieres o si te muestra algun error para poder revisarlo.

    ResponderEliminar
  20. Hola Angel, si me ayudas indicando que version de visual estas utilizando al igual que la version de SQL para tratar de replicar lo que tu dices, poder entender mejor y buscar una solucion eficiente te lo agradeceria. Gracias por visitar mi blog.

    ResponderEliminar
  21. hola colega tyengo un problema con crystal reports, cuando creo el archivo de instalacion con c# y sql server 2014 me va todo bien pero cuando genero el reporte me dice no se ha podido cargar el informe por favor si puedes ayudarme gracias

    ResponderEliminar
  22. me podrías enviar una imagen del error que genera? para poder tener mas detalle del problema

    ResponderEliminar