jueves, 4 de octubre de 2012

Creacion de reportes con Crystal Reports y DataSet en C# .net y SQL

Existen diferentes maneras la cual puedes crear un reporte en C# pero les explicare una de las formas la cual a mi se me ha facilitado mas.

Supongamos que ya tienes creado tu proyecto y tu formulario con todos tus controles, entonces es obvio que tendras un boton el cual lo deberas utilizar para crear el reporte, yo para resumir solo pondre un boton el cual nos servira al momento de darle clic que nos envie al reporte.

 

Al igual de la misma forma como la que ya deberas de tener creada una tabla dentro de SQL Server la cual es la que quieres para que se muestren en tu reporte.
 
 
 
Como ven en las imagenes tengo solamente 3 personas agregadas en mi tabla de la base datos, asi como pueden tener cientos de datos.
Nuestro siguiente paso sera agregar un DataSet (Conjunto de datos) el cual se agrega de la siguiente manera: Clic derecho a tu solucion donde esta tu proyecto que por lo general esta al lado derecho, agregar-> Agregar nuevo elemento -> Del lado izquierdo das clic a donde dice Datos y selecciona Conjunto de datos, y le pones a tu dataset el nombre que mas te convenga.
 
 

 Ahora dentro de tu Dataset da click derecho despues agregar -> Tabla de datos
 
 

 Puedes modificar el nombre de tu tabla de datos dandole clic a donde aparece el titulo de esta, entonces lo siguiente sera dandole clic derecho a la tabla de datos que creaste despues Agregar -> Columna


Mucho ojo aqui, las columnas que vamos a agregar deben de tener el mismo orden y el mismo nombre como lo tenemos en nuestra tabla de SQL


Ok entonces ya teniendo nuestro Dataset listo y nuestra tabla en SQL nuestro siguiente paso es agregar un nuevo elemento a nuestro proyecto de tipo Crystal Reports el cual esta en la pestaña de Reporting y le ponemos como nos convenga mas.
 
 
Este al momento de crearlo nos arrojara un wizard el cual servira para determinar de donde tomara los datos para mostrar y el diseño, en la primera opcion hay que tildar Usar asistente de informes y elige el Asistente Estandar y le das Aceptar y despues fijense bien en la imagen: Deben de irse a la pestaña de Datos del proyecto, expandir la que dice ADO.NET Datasets y expandir la conexion que nos sale de nuestro proyecto y ahi se encontrara nuestro dataset el cual deben de elegirlo y en la parte del medio sale una flechita apuntando para la derecha, le damos clic y se pasara nuestro dataset al lado de tablas seleccionadas.
 
 
Le damos clic a siguiente y seleccionamos los campos a mostrar dandole clic al boton de dos flechas juntas y le das finalizar.
 
 



Entonces te saldra ya el reporte con los campos de tu dataset que es donde se van a mostrar


Entonces ya teniendo nuestro archivo .rpt creado lo siguiente sera es crear un nuevo elemento de tipo windows form y dentro de este contenedor vamos a insertar un objeto de tipo CrystalReportViewer que esta en el cuadro de herramientas en la seccion de creacion de informes, le damos click y lo arrastramos a nuestro formulario.

 
Hay que poner nuestro objeto CrystalReportViewer como publico en los modificadores para que sea accesible desde la clase de donde lo vamos a mandar llamar.
 
 
Ok ahora ya teniendo eso, nos vamos al evento Clic de nuestro boton que anteriormente asignamos para que al momento de darle clic nos muestre nuestro reporte y vamos a pegar el siguiente codigo que aqui les dejo que va dentro de nuestro evento onclic:
 
 
CrystalReport1 objRpt;
objRpt = new CrystalReport1();
  

String ConnStr = @"Data Source=SQLSRV\TuServidor;Initial Catalog=TuBasedeDatos;Persist Security Info=True;User ID=Tuusuario;Password=Tupassword";

// LA DE ARRIBA ES NUESTRA CADENA DE CONEXION DEL SERVIDOR

SqlConnection myConnection = new SqlConnection(ConnStr); // TIENEN QUE UTILIZAR EN EL USING LA CLASE DE System.Data.SqlClient

String Query = "SELECT * FROM EjemploReportes"; // ESTE ES NUESTRO QUERY

SqlDataAdapter adapter = new SqlDataAdapter(Query, ConnStr);
 
Reportes Ds = new Reportes(); // ESTE ES EL NOMBRE DE NUESTRO DATASET
adapter.Fill(Ds, "Reportes"); // ESTE Reportes ES EL NOMBRE DE NUESTRA TABLA DE DATOS QUE ESTA DENTRO DE NUESTRO DATASET


objRpt.SetDataSource(Ds);    
frmReporte rpt = new frmReporte(); // ES EL FORM DONDE ESTA NUESTRO CRYSTAL REPORT VIEWER
rpt.crystalReportViewer1.ReportSource = objRpt; // ESTE ES NUESTRO REPORT VIEWER
rpt.ShowDialog(); // AQUI LO MUESTRA

 
 
 
OK, ese es nuestro codigo que va dentro, ahora compilamos nuestro proyecto y damos clic al boton y listo tenemos nuestro reporte basico sencillo.
 
 
 
Cualquier duda error o comentario es valido, espero les haya servido de algo.
 
Saludos.
 
Misael Ontiveros



61 comentarios:

  1. Muchisimas gracias amigo, me fue de gran ayuda tu explicacion, muy claro todo, te agradezco que haya posteado esto!!, un gran saludo amigo!!!

    ResponderEliminar
  2. Amigo, tienes algun tutorial para hacer un formulario web con asp .net con c# que almacene datos en BD, espero tu respuesta amigo!

    ResponderEliminar
    Respuestas
    1. De hecho si tengo unos proyectos creados en asp.net con C# para insertar datos en SQL, es bastante sencillo tambien y similar a este, voy a buscarlo y hago el tutorial amigo para que te sirva de ayuda, saludos.

      Eliminar
  3. Ok amigo, muchas gracias espero el link amigo, gracias!

    ResponderEliminar
  4. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
    Respuestas
    1. En la cadena de conexion si te fijas ahi le pones tu usuario y la contraseña, claro que si cambias esos datos en tu SQL tambien debe de cambiar en ese fragmento de codigo.

      Eliminar
  5. Hola muchisimas gracias por el tutorial me daba un problema en visual studio 2012 con crystal report 2012 pero era por la version del net framework en verdad agradezco mucho que hayas impartido de tus conocimientos pues me ayudaron mucho

    ResponderEliminar
    Respuestas
    1. Que bueno Rocio me da mucho gusto que te haya servido de ayuda.

      Eliminar
  6. Hola amigo una duda cuando corro el programa me sale un error me dice " No hay Código fuente disponible la pila de llamadas solo contiene Código externo" y no se que significa eso, podrías ayudarme te los agradecería mucho

    ResponderEliminar
    Respuestas
    1. Que tal amigo, nunca he batallado con ese tipo de error que me mencionas pero intenta hacerlo creando un proyecto nuevo de windows form desde cero, a lo mejor quisiste empalmar este con un proyecto que ya tenias y por ahí hiciste un paso mal o quizá no tomo los cambios en tu proyecto, primero has lo que te menciono y me dices si te sirvió para ir descartando posibles errores.

      Eliminar
    2. Muy buen post, el problema que tiene Alexis era de versiòn y/o conflicto de librerìas, se soluciona con la descarga de la pàgina de Crystal Report el Crystal Report para Visual Studio CRforVS_13_0_7 y luego el Crystal Report Runtime. En el mismo orden se instala y ahì deberìa solucionarse.

      Eliminar
    3. Excelente amigo Franklin, entonces Alexis ahí nuestro compañero te dio la solución al problema, instala el software y nos cuentas que tal.

      Eliminar
    4. Este comentario ha sido eliminado por el autor.

      Eliminar
    5. Yo tengo el mismo error alguien me podría ayudar de favor se los agradecería mucho.

      Eliminar
    6. Descarga de la pàgina de Crystal Report el Crystal Report para Visual Studio CRforVS_13_0_7 y luego el Crystal Report Runtime. En el mismo orden se instala y ahì deberìa solucionarse.

      Eliminar
  7. Hola quisiera saber si se puede llevar a Visual Basic pero con base de datos de Mysql

    ResponderEliminar
    Respuestas
    1. Creo que si se puede, lo unico que cambiara es la cadena de conexion y los adaptadores que se utilizaran para conectar a la base de datos. Por ejemplo: Dim myData As New DataSet
      Dim conn As New MySqlConnection
      Dim cmd As New MySqlCommand
      Dim myAdapter As New MySqlDataAdapter

      conn.ConnectionString = "server=127.0.0.1;" _
      & "uid=root;" _
      & "pwd=12345;" _
      & "database=world"

      Try
      conn.Open()
      cmd.CommandText = "SELECT city.name AS cityName, city.population AS CityPopulation, " _
      & "country.name, country.population, country.continent " _
      & "FROM country, city ORDER BY country.continent, country.name"
      cmd.Connection = conn

      myAdapter.SelectCommand = cmd
      myAdapter.Fill(myData)

      Eliminar
  8. tengo el siguiente procedimiento para llenar como adaptaria este que tengo:
    Private Sub llenar_reporte()
    Dim ConStr As String
    Me.DataBindings.Clear()
    'ConStr = "server='" + servidor + "'; user id=root; password='" + palabra + "'; database='" + gesti + "'"
    'Call bd()
    ConStr = cadena
    Dim a As String
    a = num_mario
    Dim conexion As New MySqlConnection(ConStr)
    'variable dataset
    Dim Ds As New Data.DataSet("det_trasp")
    'variable tabla
    Dim Tabla As New DataTable
    'adaptador que sirve de enlace intermedio entre la aplicación y la
    'base de datos
    Dim Da As New MySqlDataAdapter("select * from det_trasp where num='" + a + "'", conexion)
    'capturamos errores
    Try
    'ejecutamos la query que tiene el DataAdapter
    Dim Cmd As New MySqlCommandBuilder(Da)

    'llenamos la tabla
    Da.Fill(Tabla)
    'mostramos datos

    'pone las columnas en tamaño automatico

    Catch ex As MySqlException
    'en caso de error
    MsgBox(ex.Message)

    Finally

    'finalmente eliminamos objetos de memoria
    conexion = Nothing
    Ds = Nothing
    Tabla = Nothing
    Da = Nothing
    End Try
    End Sub

    ResponderEliminar
  9. Este procedimiento uso para llenar un datagridview como ven llena el dataset en la variable tabla, mi base de datos que uso es mysql ya la conexion esta echa, en realidad solo falta poder llenar el crystalrepots1

    ResponderEliminar
  10. No soy un experto en Visual Basic la verdad pero mas o menos creo que seria asi:

    Private Sub llenar_reporte()
    Dim ConStr As String
    Me.DataBindings.Clear()
    ConStr = "server='" + TUSERVIDORDEMYSQL + "'; user id=USUARIO; password='" + PASSWORD + "'; database='" + TUBASEDEDATOS + "'"
    Call bd()
    ConStr = cadena
    Dim a As String
    a = num_mario
    Dim conexion As New MySqlConnection(ConStr)
    'variable dataset
    Dim Ds As New Data.DataSet("NOMBRE_DE_TU_DATASET")
    'variable tabla
    Dim Tabla As New DataTable
    'adaptador que sirve de enlace intermedio entre la aplicación y la
    'base de datos
    Dim Da As New MySqlDataAdapter("TU_SENTENCIA_DE_SQL", conexion)
    'capturamos errores
    Try
    'ejecutamos la query que tiene el DataAdapter
    Dim Cmd As New MySqlCommandBuilder(Da)
    'llenamos la tabla
    Da.Fill(Tabla)
    'AQUI TRATAMOS DE ENVIAR LOS DATOS AL REPORTE'
    objRpt.SetDataSource(Ds);
    frmReporte rpt = new frmReporte(); '// ES EL FORM DONDE ESTA NUESTRO CRYSTAL REPORT VIEWER
    rpt.crystalReportViewer1.ReportSource = objRpt; '// ESTE ES NUESTRO REPORT VIEWER
    rpt.ShowDialog();
    'mostramos datos
    'pone las columnas en tamaño automatico
    Catch ex As MySqlException
    'en caso de error
    MsgBox(ex.Message)
    Finally
    'finalmente eliminamos objetos de memoria
    conexion = Nothing
    Ds = Nothing
    Tabla = Nothing
    Da = Nothing
    End Try
    End Sub

    Hay que identificar bien tu nombre del servidor, el nombre de tu dataset, tu base datos y los datos.. de hecho en los comentarios te es muy claro pues te especifica que es lo que hace cada linea de código y que datos debes de poner, solamente ahí tendrías que cambiar quizá cuando llames al crystalreportviewer

    ResponderEliminar
  11. Te dejo algunos links de ayuda:
    http://dev.mysql.com/doc/refman/5.0/en/connector-net-programming-crystal.html
    http://www.elguille.info/colabora/puntoNET/ElMoreno_CrystalVB.htm
    http://www.codeproject.com/Articles/9781/How-to-Load-and-Display-Crystal-Reports-in-VB-NET

    ResponderEliminar
  12. Gracias por compartir tus conocimientos de manera amena y explicada, por tomarte esa molestia.

    Saludos me ayuste mucho.
    Gracias.

    ResponderEliminar
  13. No se puede cargar el archivo o ensamblado 'file:///C:\Program Files (x86)\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Common\SAP BusinessObjects Enterprise XI 4.0\win32_x86\dotnet1\crdb_adoplus.dll' ni una de sus dependencias. El sistema no puede encontrar el archivo especificado.
    me sale este eerrror

    ResponderEliminar
    Respuestas
    1. Que tal Elizabeth, el error te marca debido que puede a ser a dos cosas, 1: Que no tengas instalado el .NET Framework 4.0 en tu computadora o 2: Que no tengas instalada ninguna versión del Framework para Crystal Reports, instala o re-instala el Framework 4.0 de Windows y también el Framework para Crystal, de hecho el Framework de Crystal esta en uno de mis temas publicados aquí en este blog el cual tambien pongo el link para la descarga si gustas buscarlo :)

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
    3. Lo único que deben hacer es ir a su archivo de configuración, generalmente llamado app.config y modificar la siguiente línea:

      Reemplazar por:




      Espero te haya servido, te dejo el link de ayuda tambien:
      http://www.qualityinfosolutions.com/solucion-al-error-no-se-puede-cargar-el-archivo-o-ensamblado-crdb_adoplus-dll-cystal-report-visual-studio/

      Eliminar
  14. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  15. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  16. jejejeje gracias te amare toda la vida :*

    ResponderEliminar
  17. Buenos dìas, actualmente estoy trabajando en version 11.5,,, pero se tuvo que desinstalar la version y montar la v13, pero tengo errores de codigo, uno ya lo solucione que es cambiar ek control 'crystalreportviewer' por el control 'reportviewer' pero tengo un lio con el metodo 'ReportSource',,, ya no lo distingue,,, en version 13 cual lo sustituye, o algun ejemplo,,, por favor colaborenme.

    mi mail es: montilla.eduardoe@gmail.com

    ResponderEliminar
    Respuestas
    1. Que tal mi amigo, una disculpa apenas voy checando mi cuenta por cuestiones de estas fechas de celebrar, primero unas preguntas: ¿Que framework estas usando o tienes instalado en tu pc y que tipo de arquitectura y windows manejas? Saludos.

      Eliminar
  18. buenas Noches misael

    He seguido tu tutorial para hacer reporte con Crystal report en vs2010, todo ha salido muy bien en el desarrollo, el problema es que cuando despliego mi app en el pc cliente me arroja el siguiente error

    {"No se puede cargar el archivo o ensamblado 'file:///C:\\Program Files (x86)\\SAP BusinessObjects\\Crystal Reports for .NET Framework 4.0\\Common\\SAP BusinessObjects Enterprise XI 4.0\\win32_x86\\dotnet1\\crdb_adoplus.dll' ni una de sus dependencias. El sistema no puede encontrar el archivo especificado.":"file:///C:\\Program Files (x86)\\SAP BusinessObjects\\Crystal Reports for .NET Framework 4.0\\Common\\SAP BusinessObjects Enterprise XI 4.0\\win32
    _x86\\dotnet1\\crdb_adoplus.dll"}

    esto solo sucede con el programa objeto cuando abro algun reporte , a mi entender creo que tiene que ver con alguna dll del cristal report.

    Favor pasame el link donde explica los de los netframework para cristal report , gracias de ante mano.....


    ResponderEliminar
    Respuestas
    1. Hola que tal, la solución a ese problema es la siguiente:
      Tienes que agregar las siguientes lineas en tu archivo App.config de la solución de tu proyecto.





      Yo también tuve el mismo problema que me comentas y la solución fue esa, intenta hacerla y me dices que tal si te funciono, si no para ir viendo poco a poco y resolverlo.

      Eliminar
    2. Que raro no se porque el código se pone en blanco, no se publica, pero mira te dejo una pagina donde describe el error y pone la solucion, como te comento fue lo que yo hice cuando me salio ese mismo error:

      http://www.qualityinfosolutions.com/solucion-al-error-no-se-puede-cargar-el-archivo-o-ensamblado-crdb_adoplus-dll-cystal-report-visual-studio/

      Haces la solución y me dices que tal si te funciono, si no para ir viendo poco a poco la resolución a tu problema.

      Eliminar
  19. oye puedes ayudar me sale este error "no se ah podido encontrar la tabla 'datatable1' error en el archivo temp despues muchos numeros"

    ResponderEliminar
    Respuestas
    1. Hola! Primero checa bien si tu cadena de conexión desde Visual a SQL sea la correcta y este bien el enlace, muchas veces pasa por eso porque no esta bien la cadena de conexión, también checa que datatable1 exista dentro de tu proyecto porque quizá le pusiste otro nombre al objeto.

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
    3. Excelente aporte amigo!
      Para los que les da el error

      No se puede cargar el archivo o ensamblado ‘file: ... crdb_adoplus.dll

      Vayan al archivo App.Config del proyecto y cambien la línea Linea a reemplazar por:
      Como debe quedar

      Y listo!

      Eliminar
  20. y como le hago para conectarlo por medio de Npgsql, el único error que me marca es en la palabra ReportSource........

    ResponderEliminar
  21. Te marca error porque probablemente no se le esta pasando ninguno dato al reporte para poder llenarlo, si estas utilizando PostgreSQL primero que nada tienes que agregar la las referencias de las .dlls para conectarse al PostgreSQL,creo que son Npgsql.dll, policy.2.0.Npgsql.dll, Mono.Security.dll, y pues hacer el mismo procedimiento para llenado del DataSet pero por lógica tu cadena de conexion asi como el codigo para poder ejecutar tu query y te regrese datos para el llenado pues cambiaria.

    ResponderEliminar
    Respuestas
    1. si.....pude resolver ese asunto, pero me dice al tratar de entrar al formulario que no pudo conectarse a la base de datos.....algún error en el temp.....realmente desconozco de esto.......

      Eliminar
    2. Ok entiendo, y haciendo un debug con un breakpoint en la linea donde se encuentra el código: "objRpt.SetDataSource(Ds)" puedes verificar que el objeto Ds traiga datos? Porque si te marca que no se pudo conectar a la BD probablemente tengas algun dato mal en la cadena de conexion y es por eso que no te hace el llenado del DataSet,si puedes haz un debug hasta ese punto y verifica que traiga datos, si no trae datos ve a un punto anterior y verifica que la BD haga su conexion a tu BD correctamente, por ahi debe de estar el detalle.

      Eliminar
  22. Excelente tutoríal! Solo tengo una duda, tengo dos parámetros de fechas para un rango. Fechainicio y fechafinal. Dónde debe ir eso??

    ResponderEliminar
  23. Esos parámetros van directamente en la sentencia SQL de tu Query, por ejemplo SELECT * FROM TABLA_SQL WHERE FECHAINICIO BETWEEN 'FECHA1' AND 'FECHA2' Por lo cual tu Fecha1 corresponde a tu fecha de inicio y Fecha2 a tu fecha final, claro que esos datos los tienes que mandar directamente desde tu form al controlador o a la clase donde tengas el método para cachar las fechas y calcular el reporte.

    ResponderEliminar
  24. Estoy haciendo una aplicación en Visual Basic 2015, Access 2016 y SAP Crystal Reports. Toda la aplicación me funciona perfectamente, el gran problema que tengo es que cuando creo el instalador e implemento el sistema en otro equipo los reportes me los muestra en blanco :'( alguna sugerencia que me puedan dar!!!

    ResponderEliminar
    Respuestas
    1. Me paso algo parecido una ves ese mismo detalle pero con SQL y era porque el servidor donde estaba alojada SQL Server no aceptaba conexiones remotas, la solucion fue que habilite esa opcion y listo, quiza te este pasando algo similar con la BD que tienes de Access, o puede ser que el Firewall este bloqueando la peticion.

      Eliminar
    2. Incluso instalé la aplicación en mi PC en C:\Program Files\etc\etc...
      Todo el manejo con la DB funciona perfectamente, inserciones, actualizaciones, eliminar, búsqueda, etc. El problema que tengo es que, cuando genero reportes, estos se quedan apuntando a la ruta de la base de datos en la carpeta del proyecto (Debug). Por ejemplo si le meto datos manualmente a la DB que esta en la carpeta del proyecto y pruebo generar reportes ahí si me los crea, pero cuando pruebo con las datos ingresados en la base de datos de la aplicación al instalarse ahí si no muestra nada. HELP ME.

      Eliminar
    3. Ah pues ahí tienes tú problema que siempre estás apuntando a una dirección y no tiene que ser así, debes utilizar la librería Path que está en System.IO si no mal recuerdo y definir una carpeta predeterminada en tu proyecto.

      Eliminar
  25. Todo bien con una tabla, pero que tal si quieres hacer un reporte donde "jales" campos de 5 tablas???

    ResponderEliminar
    Respuestas
    1. Si son 5 sentencias diferentes y necesitas cargar el detalle por separado de cada tabla puedes utilizar mas DataSets para el llenado de información solamente pues tienes que llenar cada correspondiente con su tabla y ya con eso puedes poner los datos en el reporte, o quizá a lo mejor necesitas hacer uso de uniones de tablas y las ponga en una sola.

      Eliminar
  26. Y para hacer el tiket a una sola persona???

    ResponderEliminar
    Respuestas
    1. Podrías ser un poco más específico? Es que no entendí de que a solo una persona.

      Eliminar
  27. Hola muchas gracias por el comentario, si me imagino jeje es un proyecto del 2011 ahorita ya la metodología es muy diferente.

    ResponderEliminar
  28. MI HERMANO, PLENO 2020 Y ME FUNCIONO DE LUJO, ME SACASTE DE UN GRAN APURO! ESTO ES JUSTO LO QUE ESTABA BUSCANDO... SIMPLEMENTE QUERIA LLENAR EL REPORTE MEDIANTE DATASET Y CODIGO Y NO POR ASISTENTE PARA NO ESTAR ACTUALIZANDO LA CONEXION Y DE IGUAL MANERA APLICAR PARAMETROS DE FILTRACION! MUCHAS GRACIAS! UN SALUDO!

    ResponderEliminar
    Respuestas
    1. Que buena onda, hace ya 8 años de este post pero pues que bueno que te haya funcionado a la perfección, saludos! ;)

      Eliminar
    2. Gracias! me ayudaste mucho!
      ya logre generar todo tal como quería realizarlo e incluso acabe el sistema jaja.

      Eliminar
  29. Muchas gracias amigo por este gran post, he tenido grandes problemas de compatibilidad y buscando buscando pues encontre esta alternativa al problema que tenia con los informes. Bendiciones.

    ResponderEliminar