domingo, 17 de junio de 2012

Como Hacer Reporte Crystal Reports y Asp .Net

Recientemente una amiga me pidio ayuda para hacer un reporte rápido con crystal reports y asp .net.

El ejemplo que hice para ella y que hoy comparto con usted hace uso del wizard de visual studio válido para las versiones 2005 y 2008. Sé que habrá quienes digan que esta no es la mejor manera de hacerlo, quienes lo hagan seguramente ya tienen experiencia en esto, sin embargo el ejemplo está dirigido para principiantes. En otra ocasión compartiré otro método. Por lo pronto acá les dejo el enlace del video en youtube y el código fuente:

Imports CrystalDecisions.Shared
Imports CrystalDecisions.CrystalReports.Engine
Partial Class _Default
    Inherits System.Web.UI.Page
    Private Sub configureCRYSTALREPORT()

        Dim myConnectionInfo As New ConnectionInfo()
        myConnectionInfo.ServerName = "NOMBRE_O_IP_DEL_SERVIDOR"
        myConnectionInfo.DatabaseName = "Northwind"
        myConnectionInfo.UserID = "sa"
        myConnectionInfo.Password = "myserver"
        setDBLOGONforREPORT(myConnectionInfo)

    End Sub

    Private Sub setDBLOGONforREPORT(ByVal myconnectioninfo As ConnectionInfo)

        Dim mytableloginfos As New TableLogOnInfos()
        mytableloginfos = CrystalReportViewer1.LogOnInfo

        For Each myTableLogOnInfo As TableLogOnInfo In mytableloginfos
            myTableLogOnInfo.ConnectionInfo = myconnectioninfo
        Next

    End Sub

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

Me han solicitado el código en c#. Acá se los dejo.
using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Web;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        configureCRYSTALREPORT();
    }

    private void configureCRYSTALREPORT()
    {
        ConnectionInfo myConnectionInfo = new ConnectionInfo();
        myConnectionInfo.ServerName = "NOMBRE_O_IP_DEL_SERVIDOR";
        myConnectionInfo.DatabaseName = "Northwind";
        myConnectionInfo.UserID = "sa";
        myConnectionInfo.Password = "mipassword";
        setDBLOGONforREPORT(myConnectionInfo);
 
    }
 
    private void setDBLOGONforREPORT(ConnectionInfo myconnectioninfo)
    {
        TableLogOnInfos mytableloginfos = new TableLogOnInfos();
        mytableloginfos = CrystalReportViewer1.LogOnInfo;
     
        foreach (TableLogOnInfo myTableLogOnInfo  in mytableloginfos)
        {
            myTableLogOnInfo.ConnectionInfo = myconnectioninfo;
        }
     
    }

}
Si desean usar la autenticacion de windows en lugar de autenticacion de sql server cambian las lineas correspondientes al UserID y Password por lo siguiente:
myConnectionInfo.IntegratedSecurity = true;
Para evitar que durante la publicación recuerde los datos de prueba deben activar la opción Discard Saved Data When Loading Reports en las imagenes siguientes muestro como hacerlo

Actualización:
Para Visual Studio 2010 y versiones posteriores es necesario descargar e instalar SAP Crystal Reports, developer version for Microsoft Visual Studio, despues de la instalación el procedimiento a seguir es el mismo.

Saludos.

24 comentarios:

  1. Como hago si no tengo clave ni id en la base de datos y cada vez que genero el reporte me pide estos datos???

    ResponderEliminar
    Respuestas
    1. Si trabajas con autenticación de windows tienes que cambiar los parámetros de conexión. He actualizado el artículo con la respuesta.
      Saludos

      Eliminar
  2. Ola Willian necesito ayuda como con el crystal report lo que pasa es que en la empresa donde lo publico mi proyecto web los salen con los datos de la base de datos con la k hago prueva no salen con la base de datos de ese servidor como haria eso ??? y sabes por que sucede

    ResponderEliminar
    Respuestas
    1. Disculpa, pero no entiendo tu pregunta. ¿Puedes ser mas explicíto? Sería de mucha utilidad que describas con precisión el error. Saludos

      Eliminar
  3. no tengo error pero al momento de llevar mi proyecto final web al cliente con todos los reportes los reportes salen con los datos de la maquina en que estuve trabajando caso es mi laptop ... ese es el detalle man ...

    ResponderEliminar
    Respuestas
    1. lo cual son datos de prueba pero me muestran estos datos de prueba pongo actualizar y nada siguen con esos datos espero puedas ayudarme

      Eliminar
    2. Para evitar que durante la publicación recuerde los datos de prueba debes activar la opción Discard Saved Data When Loading Reports. Actualicé el artículo, en el verás dos imágenes que ilustrar como hacerlo. Espero que eso solucione tu problema, en cualquiera de los casos deja tu comentario.
      Saludos

      Eliminar
  4. bueno intente lo que me dijiste active esa opcion pero aun el problema persiste mmm ... hay alguna tipo de inconveniente si el reporte lo hago por codigo o usando la ayuda del administrador ??? por que lo estoy haciendo con la ayuda del administrador

    ResponderEliminar
    Respuestas
    1. Si con "administrador " te refieres al "asistente o wizard" de crystal reports en visual studio no deberías tener ningún problema. Prueba a Deshabilitar la caché del reportsource. Puedes hacer esto desde las propiedades del mismo.
      Saludos

      Eliminar
  5. Amigo has probado tu codigo en Windows 7. Pues resulta que a mi me funciona excelente en Windows XP, pero en Windows 7 el reporte me pide autenticacion.

    Si sabes alguna solucion porfa escribe a: karzierr@hotmail.com
    karzierr@gmail.com

    Saludos,

    ResponderEliminar
    Respuestas
    1. Si lo he probado en windows 7 ultimate como entorno de desarrollo y windows server 2008 server r2 como servidor de producción y funciona a la perfección.

      Eliminar
  6. hola, estoy tratando de probar el codigo pero tengo el problema, que no puedo visualizar el reporte que puede estar pasando
    saludos

    ResponderEliminar
  7. hola, una preguna mira tengo previamente un reporte hecho en crystal reports pero no se como mandarle los parametros al reporte desde asp.net con C#, debido que dentro de dicho reporte hago una serie de calculos con los datos y una serie de consultas

    ResponderEliminar
    Respuestas
    1. A partir del ejemplo del post puedes hacerlo cambiando (o añadiendo) la sentencia de selección de registros del reporte.
      Esta sentencia debes asignarla a la propiedad RecordSelectionFormula del reporte en cuestión. Esta sentencia es la que el motor de crystal report pondrá en la clausula WHERE cuando envíe la petición al servidor.
      CrystalReportSource1.ReportDocument.RecordSelectionFormula = "{Tabla.CampoCadena}='" + miparamstring + "' AND {Tabla.CampoNumero} = " + MiParamNumber.ToString();

      Espero que esto te ayude, Saludos.

      Existe un método mas eficiente, que es pasar un dataset directamente al reporte; pero por falta de tiempo eso lo trataré en otro post.

      Eliminar
  8. Me gustaría que me ayudes como hacerlo para asp.net 2010

    ResponderEliminar
  9. Como se podría hacer para asp.net 2010 porque no entiendo...gracias

    ResponderEliminar
  10. hola, mi nombre es moises diaz, de Honduras, deseo consultar algo; estoy realizando mi practica profesional y estoy desarrollando un sistema de inventario de TI, pero el jefe kiere que para los reportes, el seleccione los campos que iran en tal reporte, Lo estoy realizando en SQL 2008 y Asp.net C# 2010. este es mi correo moisesdiaz3105@yahoo.es, moisesdiaz3105@gmail.com, moisesdiaz3105@hotmail.com; si pueden hecharme una mano se les agradece de ante mano..

    ResponderEliminar
  11. Gracias!!! con tu ejemplo logre cargar mostrar en asp.net un informe desde un rpt
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
    Dim rd As ReportDocument = New ReportDocument()
    Dim crConnectionInfo As ConnectionInfo
    Dim mytableloginfos As New TableLogOnInfos()

    rd.Load(Server.MapPath("~/Rpt/") + "Reporte.rpt")

    crConnectionInfo = New ConnectionInfo()
    crConnectionInfo.ServerName = "ServerName"
    crConnectionInfo.DatabaseName = "DatabaseName"
    crConnectionInfo.UserID = "UserName"
    crConnectionInfo.Password = "Password"

    rd.ParameterFields("Parametro1").CurrentValues.AddValue(Valor1)
    rd.ParameterFields("Parametro2").CurrentValues.AddValue("Valor2")

    crpViewer1.ReportSource = rd

    mytableloginfos = crpViewer1.LogOnInfo

    For Each myTableLogOnInfo As TableLogOnInfo In mytableloginfos
    myTableLogOnInfo.ConnectionInfo = crConnectionInfo
    Next
    End If
    End Sub

    ResponderEliminar
  12. DISCULPEN ALGUN ME PUEDE FACILITAR INFORMACION PARA HACER LOS REPORTES CON PARAMETROS

    ResponderEliminar