sábado, enero 24, 2009

Creación de Reportes con Crystal Reports en Visual Studio 2005/2008

 

Este pequeño tutor de como crear un reporte en Crystal Reports desde Visual Studio 2005/2008, lo hago porque he recibido muchas consultas de como hacerlo de la mejor forma, quizás hiera algunas susceptibilidades, pero espero que entiendan que también hay otras maneras de hacer las cosas.

En primer lugar en este tutor les voy a indicar como crear el reporte de la manera mas larga, pero también, es la mejor manera para tener el control total sobre lo que queremos mostrar en el reporte.

La manera mas fácil de crear un reporte es agregar al proyecto un nuevo ítem de tipo reporte de Crystal Reports, y conectarse  a la base de datos desde el explorador de servidores del Visual Studio, seleccionar las tablas y arrastrarlas sobre el diseñador del reporte.

Si, esta es la manera mas fácil, pero también la que mas problemas nos puede dar al momento de empezar a cambiar campos a mostrar o al tratar de agregar una condición o filtro a los datos que queremos mostrar en el reporte.

La anterior es una buena técnica, siempre y cuando el reporte sea sencillo y detectemos que no tendrá cambios.

A continuación describo la manera en yo creo mis reportes tanto para web como para windows. A muchos les parecerá mas larga pero les aseguro que no tendrán problemas en el futuro pues tienen todo controlado ustedes.

Voy a utilizar un proyecto Windows Forms y una base de datos Sql Server 2008, pero se van a dar cuenta que lo pueden hacer con cualquier tipo de base de datos.

No voy a entrar en detalles del tipo de conexión a la base de datos ni las instrucciones para traer los datos.

A continuación muestro la forma con los datos que vamos a utilizar para nuestro reporte:

image

Bueno la idea de nuestro proyecto es que poder tener un reporte con estos datos, lo primero que vamos a hacer es agregar a nuestro proyecto un objeto dataset, que es el que nos va a servir para poder crear nuestro reporte en Crystal Reports.

image

Clic derecho en el nombre del proyecto, del menú seleccionamos la opción Add, y luego New Item… para que nos aparezca la siguiente pantalla y poder escoger el objeto a adicionar a nuestro proyecto.

image

Escogemos adicionar un objeto dataset que nos servirá como fuente de datos para el reporte y poder crear nuestro reporte como queremos. Le damos un nombre a nuestro dataSet, por lo general yo lo llamo igual que el reporte con el prefijo ds, entonces nuestro dataset se va a llamar dsPersonas.xsd

image

Al darle clic al boton Add nos muestra la ventana de diseño en la cual vamos a agregar un datatable con sus respectivos campos que son los que necesitamos para dibujar el reporte. Al estar aquí, damos clic derecho sobre la superficie para poder agregar el datatable :

image

image

Nos muestra el datatable creado, podemos cambiar el nombre que coloca por defecto, haciendo clic sobre el nombre y se coloca en modo de edicion para poder cambiarlo.

image

Para agregar los diferentes campos de nuestro datatable, seguimos los siguientes paso:

1. Clic derecho en el área de los campos del datatable y los vamos agregando.

image

2. al seleccionar Agregar Columna:

image nos permite colocarle el nombre a la columna, este nombre DEBE ser igual al nombre que vamos a devolver en nuestra consulta SQL a la Base de datos.

3. image En la ventana de propiedades de la columna que estamos agregando, podemos asignar el tipo de campo y su longitud en caso de ser una cadena ( String) y que sea requerido. Mi recomendación es que se apeguen a los mismos tipos de datos que están definidos en la base de datos.

4. En proceso de agregar los campos necesarios para el reporte:

image

Si me preguntan si es se pueden agregar campos que no se van a utilizar en el reporte, la respuesta es SI, porque es posible que ya tengamos la consulta realizada que nos sirve para nuestro  reporte y solo es crearlo a partir de la consulta que  ya existe, y como la consulta nos devuelve datos que no vamos a colocar ene l reporte, de todas formas tenemos que crear esos campos en nuestro datatable.

5. Aqui esta nuestro datatable completo para empezar a generar nuestro reporte:

image

Quizás me pensaran: “es mucho trabajo” pero piensen en esto, este sistema si mas tarde necesitan agregar un nuevo campo es simplemente venir agregar el campo y actualizar la fuente de datos del reporte para tener acceso a ese nuevo campo que acabamos de crear, por el otro método, eso no es tan fácil, es mejor agregar el campo y volver a crear el reporte. Aclaración: “yo, particularmente, no he sabido, o no he logrado como hacerlo cuando lo intente”.

6. Creamos el reporte en crystal reports, nuevamente clic derecho en el nombre del proyecto, Add, New Item..,  en la ventana que aparece, seleccionamos Reporting y escogemos el tipo de reporte Crystal Report:

image

Asignamos un nombre al reporte que se guarda con la extensión .rpt, y clic al botón Add para crear el reporte en nuestro proyecto.

image

Aparece la siguiente pantalla para seleccionar el tipo de reporte a crear, en la parte izquierda señalado en el circulo rojo aparece una nueva barra de herramientas con la cual vamos a trabajar al adicionar los campos al reporte, en la parte derecha, he resaltado en el circulo rojo que se agregan al proyecto de manera automática las referencias necesarias para que funcionen los reporte de Crystal Reports en nuestro proyecto.

De la ventana, seleccionamos la segunda opción, crear un reporte en blanco “As a Blank Report

image

Al darle clic al boton OK de la pantalla anterior nos muestra el reporte en blanco como aparece en la imagen anterior.

La sección de Report Header, colocaremos lo que queremos que aparezca solo en la primera hoja del reporte.

En la sección  Page Header, colocaremos los que queremos se muestre en la cabecera de todas las paginas del reporte, aquí colocaremos los títulos de las columnas, por ejemplo.

En la sección Details, colocaremos el detalle de las columnas del reporte

La sección Report Footer, es la contraparte de la del Page Header, aquí podríamos colocar los números de pagina del reporte, por ejemplo.

La sección Page Footer es la contraparte de Report header.

Ya teniendo claro esto, lo siguiente es seleccionar la fuente de datos de nuestro reporte, aquí es donde entra a jugar el dataset que creamos en pasos anteriores, pues no necesitamos tener la conexión a la base de datos abierta para diseñar nuestro reporte.

image

Damos Clic derecho en el Field Explorer en la entrada Database Field, al aparecer el menú contextual de la imagen seleccionamos Database Expert… para ir a seleccionar nuestra fuente de datos.

image

En esta ventana, expandimos Project Data, luego ADO.NET DataSets, aquí nos van a aparecer todos los dataset que tengamos creados en nuestro proyecto, en nuestro caso solo aparece dsPersonas, que es el que hemos creado en pasos anteriores.

Seleccionamos el datatable  y damos clic en el botón image  para pasar los datos a la parte derecha de la ventana en la cual va a exponer los campos del datable para poder incluirlos en nuestro reporte.

image 

Hacemos clic en el botón OK para empezar a diseñar nuestro reporte. Al hacer esto, ya contamos con los campos del dataset en el Field Explorer:

image

Ahora simplemente es arrastrar los campos al área del reporte y colocarlos de la manera como deseamos se vea el reporte.

image

Seleccionamos la Toolbox (barra de herramientas de crystal) y de allí escogemos el control text object y lo arrastramos a la sección de page header para colocar el titulo del reporte allí, en la imagen están seleccionados en círculos rojos todos los controles mencionados.

image

Al arrastrar un campo del datatable y soltarlo en la sección de detalle de manera automática coloca un control de texto para el titulo del control que acabamos de arrastrar.

image Para corregir el texto del titulo, lo seleccionamos, le damos clic derecho al control y escogemos del menú la opción “Edit Text Object”, lo que nos permite cambiar el texto del titulo.

image

La imagen nos muestra como queda nuestro reporte, no es el alcance de este tutor, indicar como colocar los diferentes atributos de presentación grafica del reporte.

En nuestro formulario windows (web forms) o en nuestro formulario web (web forms) agregamos un control CrystalReportViewwer , el cual nos servirá para mostrar nuestro reporte en pantalla y poder imprimirlo o exportarlo a algún formato como PDF o Excel.

En el boton Imprimir de nuestro formulario, el codigo que voy a colocar para ir a la base de datos, realizar la consulta de los datos, colocarlos en un datatable y este datatable pasarlo a la propiedad datasource del reporte.

A continuacion el codigo del boton imprimir:

Private Sub btnImprimir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImprimir.Click
        Dim oCnn As New OleDbConnection  ‘ Objeto de conexion a la base de datos
        Dim daDatos As New OleDbDataAdapter ‘ Objeto Adaptador para leer datos de la Base de datos
        Dim cmdExec As New OleDbCommand ‘ objeto comando para ejecutar sentencias sql
        Dim dtDatos As New DataTable ‘ datatable para recibir los datos de la base de datos
        Dim sbQuery As New StringBuilder ‘ StringBuilder para armar cadenas
        Try

            oCnn.ConnectionString = "Provider=SQLNCLI10;Server=ralvarado;Database=MiBD;Uid=sa; Pwd=XXX;"
            oCnn.Open()
            cmdExec = oCnn.CreateCommand
            cmdExec.Connection = oCnn

            sbQuery.Append("SELECT Consecutivo  ")
            sbQuery.Append("      ,IdentificacionPersona  ")
            sbQuery.Append("      ,TipoPersona  ")
            sbQuery.Append("      ,Grupo  ")
            sbQuery.Append("      ,PrimerNombre  ")
            sbQuery.Append("      ,PrimerApellido  ")
            sbQuery.Append("      ,SegundoApellido  ")
            sbQuery.Append("      ,Sexo  ")
            sbQuery.Append("      ,Profesion  ")
            sbQuery.Append("      ,Direccion1  ")
            sbQuery.Append("      ,Direccion2  ")
            sbQuery.Append("      ,TelFijo1  ")
            sbQuery.Append("      ,TelFijo2  ")
            sbQuery.Append("      ,TelMovil  ")
            sbQuery.Append("      ,PaginaWeb  ")
            sbQuery.Append("      ,ZonaPostal  ")
            sbQuery.Append("      ,Fax  ")
            sbQuery.Append("      ,Email1  ")
            sbQuery.Append("      ,Email2  ")
            sbQuery.Append("      ,FechaNacimiento  ")
            sbQuery.Append("            FROM Persona   ")
            cmdExec.CommandText = sbQuery.ToString

            daDatos = New OleDbDataAdapter(cmdExec)
            daDatos.Fill(dtDatos)

            Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument
            ' Asigno el reporte
            CrReport = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
            CrReport.Load(Application.StartupPath & "\crPersonas.rpt")
            CrReport.SetDataSource(dtDatos)

            CrystalReportViewer1.ReportSource = CrReport

        Catch ex As Exception
            MessageBox.Show("excepcion: " & ex.Message, "Mostrando Reporte")
        End Try

    End Sub

Observen que al llenar los datos en dtDatos, simplemente debo asignarle este objeto al Reporte en su método SetDataSource. Con esto puede ser cualquier base de datos, siempre y cuando los datos correspondan a la estructura del dataset creado como fuente de datos del reporte.

Si en algún momento nuestro reporte cambia que hay que agregarle un nuevo campo, simplemente vamos a nuestro dataset y le agregamos el campo, luego vamos al reporte y lo abrimos y verificamos nuestra fuente de datos para que nuestro nuevo campo aparezca en al lista, luego es simplemente incluirlo en el reporte.

image

Bueno espero haber sido claro en como crear un reporte con Crystal Report y les aseguro que no van a tener problemas al momento de modificaciones en el reporte.

 

Hasta la próxima!!!!!!.

219 comentarios:

1 – 200 de 219   Más recientes›   Más nuevas»
ezex dijo...

Muy bueno amigo!
Me viene perfecto .. gracias sensei =)

Anónimo dijo...

¿Hola habria algo para hacer reportes en Windows Mobile en vb.net?

Roberto Alvarado dijo...

Hola,

Existe algo para reportes par Windows Mobile, pero nada como Crystal reports.

El complemento es de terceros, es de pago y se llama PrinterCE.

Saludos,

edwin dijo...

esper me funcion lo voy a probar gracias x tu aporte brother sigue asi

Juan Manuel dijo...

Ejecuté tal cual tu tutorial, sin embargo, al abrir el webform y asu vez éste tratar de conectarse al reporte, genera el siguiente error:

Logon failed. Details: crdb_adoplus : Object reference not set to an instance of an object. Error in File C:\DOCUME~1\jmanuel\LOCALS~1\Temp\CrystalReport3 {75A6E5BB-8816-4F32-95BE-56C413245172}.rpt: Unable to connect: incorrect log on parameters.

Al parecer está pidiendo credenciales de conexión con el reporte, tienes alguna idea de qué puede ser?

Unknown dijo...

Hola,
Al parecer algun objeto lo creaste pero no lo inicializaste, o sea le falta el "new object":
Dim objeto as Object = new Object

Anónimo dijo...

hola tengo problemas cuando hago un INNER JOIN, que mas se le haria al DATASET???, mi objetivo es un reporte donde utilice varias tablas. gracias

Unknown dijo...

Hola,
No veo cual es el problema, si en el dataset que es el datasource del reporte se encuentran los campos que traes en la consulta con INNER JOIN no debes tener problemas.

Saludos,

Anónimo dijo...

No pana, el problema surge cuando agrego los campos de la otra tabla en el reporte (claro si los pone el dataset), osea q si mando a mostrar campos de mas de una tabla no muestra nada. y ya e manipulado las opciones de relaciones en el dataset.

Unknown dijo...

Hola
Si entendi bien, estas intentando agregar datos de dos DataTable de un mismo DataSet al mismo reporte. Eso no es posible, debes colocar lso datos del segundo Datatable en un nuevo reporte que lo colocas como un subreporte del reporte principal.

Saludos,

Anónimo dijo...

Ya pana, arregle mi problema, el asunto es que si se utilizan INNER JOIN en el SELECT, no ay que añadir en las tablas que se crean en el DATASET las tablas que interbienen en el SELECT. Osea que un una sola tabla se ponen todos los campos (del DATASET) que se van a mandar a inprimir en el reporte. Espero no haber confundido a la gente.

Gracias Roberto. Muy buen aporte.

Juan dijo...

hola soy juan de Ecuador.
Siguiendo el mismo esquema (q porcierto esta comprencible y a sido de mucha ayuda). Mi pregunta seria como cargo una imagen desde la base de datos, cuando mi campo es de tipo IMAGE y esta en sql2005 (creo q la bd no es de importancia)

Anónimo dijo...

Tengo un problema no se como empiezas a usar el visual studio no se si usar el ejemplo en visual basico o en visual studio.. ademas no tengo todas las plantillas q tu tienes..
Por favor necesito ayuda..

revista.azulceleste dijo...

lo he hecho todo al pie de la letra, sin embargo dispongo de la plantilla de crystal reports en el pc, pero no puedo cargarla al basic, le he dado vueltas y vueltas, me puedes guiar para cargar la plantilla en el visual basic express 2005?

Unknown dijo...

Hola,

No se y no estoy seguro si VB Experes soporta Crystal reports, debes ir a la pagina de Microsoft y revisar en las caracteristicas de la version Express que tienes si Crystal reports esta soportado.

Saludos,

Anónimo dijo...

Hola que tal, estoy tratando de hacer un reporte con Visual Studio 2005 Academic utilizando Crystal Reports en Web Forms, el problema es que no sé como cargar el control a la caja de herramientas para seleccionarlo y poder utilizarlo. Me aparece inhabilitado!! Lo probé con Windows Forms y ahi si me aparece en la caja de herramientas sin ningún problema... Pero lo necesito utilizar en Web Forms..
Me podrías asesorar en qué pudiera estar pasando?
Te lo agradecería MIL!!!!
GRACIAS!!!

Unknown dijo...

Hola

A mi me sale una pestaña de Crystal reports en el toolbar de VS2005, desde alli arrastro un control "CrystalReportViewer" al web form y listo.

Revisa si la version academic te permite usar Crystal reports en aplicaciones web.

Saludos,

Anónimo dijo...

Hola de nuevo!

Te agradezco la atención a mi pregunta y la respuesta, ya chequé y si la acepta. No se que pueda estar pasando... Tengo el Crystal Report 9 instalado, e instalé tambien el Crystal Reports Viewer 2008,estoy utilizando Web Forms con aspx, pero no logro habilitar el control. Al momento de dar click derecho en la caja de herramientas y agregar elementos, los controles del crystal report aparecen en la pestaña de Componentes COM y no en los de Componentes .NET Framework, crees que esto también sea algún problema? O cómo puedo instalar el Control o componente "CrystalReportViewer"...?? Más aun probé en agregar nuevo elemento + reporte de crystal report .rpt, y no me da la opcion ni para explorar ni buscar, unicamente la de platillas en línea. Crees que exista una solución? =(

GRACIAS NUEVAMENTE POR TU TIEMPO Y RESPUESTA!!
Saludos =)

Jonathan dijo...

Hola que tal, oye tengo una duda, en mi reporte utilizo estas secciones: cabecera de reporte(pongo datos que nunca cambian),detalles(los detalles) y pie de informe(pongo el subtotal, iva, total)que siempre quiero que vaya al último de mi reporte el cúal siempre va a contener una sola hoja, mi problema es que cuando mi detalle tiene un solo registro la informacíón del Pie de Reporte se sube unos renglones como que ajustandose al contenido, no quiero eso, lo que quiero que independientemente de los registros en el detalle, aparezca casi al final de la Hoja de mi reporte, que no se mueva esa información de pie de reporte.
Espero sus comentarios,gracias.

Unknown dijo...

Hola Karen

Intenta agregar la referencia de crystal reports a la solucion desde COM y revisa si ya puedes o no mostrar y arrastrar el reportViewer desde la caja de herramientas.

Hola Jonathan,

Hay dos formas: la primera es que coloques en el pie del informe, no el pie de pagina la informacion, si es siempre una pagina esto es valido, si son mas de 1 pagina solo parecera al final del reporte.

La otra opcion es que la seccion del cuerpo la coloques tan grande asi no se impriman registros, de tal manera que el pie de pagina del reporte lo coloque en la parte inferior de la hoja impresa.

Anónimo dijo...

Hola de nuevo =)

Primeramente te agradezco tu respuesta.

Ya intenté hacer lo que me comentas y si me aparecen las referencias del crystalreport, hasta de control crystalreportiewer.

Las agrego, pero nada de nada...

Es mas ni me aparece la plantilla del crystal report, al momendo de elegir agregar nuevo elemento....

Mmm alguna otra opción?A qué crees que se deba? Ya le di muchas vueltas snif..snif =(

O con qué otra herramienta pudiera yo generar mis reportes, tales reportes son para generar notificaciones a algunos acreditados, mostrando el no de sus mensualidades vencidas, deuda del mes y el total a pagar y yap =)

Pero ooooooh auxilioooo jajaj la verdad si ya hasta perdi la cabeza... =0

MIL GRACIAS POR TUS RESPUESTAS Y TIEMPO ROBERTO!!!!!!!!

Unknown dijo...

Hola Karen

Bajate el runtime de Crystal reports de la pagina de MS y lo intalas en tu pc a ver si eso soluciona el inconveniente. La verdad no se porque no te permite o no te muestra los controles de Crystal Reports.

Saludos,

Anónimo dijo...

Hola Roberto!

Disculpa la demora en responder. Bajé e intstalé el runtime y demás pasos, si me dejo agregar la librería, además la puedo utilizar en el código ya...pero aun así el control no se me habilita..!!

Ya desistí de esto jaja la verdad, porque tampoco sé que pudiera estar pasando.

Por el momento al parecer utilizaré ReportViewer... que opinas?

Está demás que te agradezca tu apoyo, respuestas y ayuda, que si me sirvieron :) pues aprendí nuevas cosas.

Estamos en contacto y mil saludos!!

jonas dijo...

buenas amigo me parece excelente tu tutorial, ya que soy nuevo en esto y mis jefes me tienen presionado para que lo aprenda ssin curso sino por mi cuenta... tengo una duda tal vez te parezca estupida pero como te dije nunca habia trabajado en esto.. en si cuando en el tutorial dices En el boton Imprimir de nuestro formulario..a que te refieres en donde esta?...disculpa mi ignorancia pero me podrias decir en donde esta?

jonas dijo...

de antemano muchas gracias

Unknown dijo...

Hola Jonas

En la barra de herramienta del reportViewer hay un boton de imprimir. A ese me refiero.

jonas dijo...

aunque todo me aparece en gris le doy boton derecho en ver codigo?

Unknown dijo...

Hola

Lo que quise decir es lo siguiente: en una aplicacion windows por lo general hay un boton Imprimir, en ese boton se coloca el codigo para llamar el reporte de Crystal o sea el reportviewer.

En aplicaciones web por lo general son reportes y forman parte de un boton o de un menu, entonces el codigo para llamar el report viewer se coloca alli.

jonas dijo...

gracias.. no se has escuchado de un sistema contable llamado profit plus contabilidad 3.1...para esa aplicacion es que necesito hacer el reporte o en su defecto agregarle mas campos pero no hallo la manera de realizarlo...

Anónimo dijo...

Saludos, muy buen tutorial, la explicacion paso a paso estubo excelente, muchas gracias :):):):):):)

Unknown dijo...

Hola Jonas,

No he escuchado de ese software que mencionas, debe ser en tu pais, aqui en el mio no se conoce.

Pero intenta hacer el reporte y cuando tengas una pregunta especifica me avisas y tratare de resolverla.

oscar alejandro dijo...

Hola dime podras poner un ejemplo con mas tablas. ? tengo que hacer un reporte pero esta en relacion a muchas tablas, entonces creo se genera un conflicto por los keys al parecer, a ver si podrias brindar esa informacion muchas gracias. Incluye Encabezados y detalles algo asi .. lo ms pronto porfavor gracias

Unknown dijo...

Hola Oscar,

No entiendo a que te refieres con mas tablas, si hago una consulta en al que intervengan mas tablas las uno con INNER JOIN y se las devuelvo al reporte.

O en un DataSet puedo tener diferentes conjuntos de datos en diferentes datatables y pasarselas de igual manera al reporte y en el reporte escoger de que tabla voy a mostrar los datos.


Saludos,

Sergio Cossa dijo...

Hola!
muy bueno el post... y me funciona
sólo que no sé por qué me pide el login antes de mostrarme el reporte.
Me dice que el servidor es el dataset y me pide un password...
¿¿?? Ni idea, nunca le puse
Y ya no me lo muestra.
El dataset viene cargado con la tabla a mostrar.
Tienes idea qué pasa?
Un gran saludo desde Argentina

Unknown dijo...

Hola Sergio,

Debes colocar una propiedad del reportViewer a false.

La propiedad se llama como Authenticated Server o algo asi... si no la encuentras me avisas y yo te digo exactamente cual es.

Saludos,

AdyIr dijo...

Excelente amigo mil gracias

Anónimo dijo...

Blogger Roberto Alvarado dijo...

Hola Sergio,

Debes colocar una propiedad del reportViewer a false.

La propiedad se llama como Authenticated Server o algo asi... si no la encuentras me avisas y yo te digo exactamente cual es.

Saludos,


buenas me gustaria saber cual es bien la propiedad, ya que tengo el mismo problema que sergio

muchas gracias
Juan

Unknown dijo...

Hola Juan

La propiedad se llama "EnabledDatabaseLoginPrompt" la colocas a false.

Saludos,


RAT

Unknown dijo...

Que tal !! me parece excelente tu manual y funciona perfecto...Oye Roberto ... te platico lo que intento hacer ahora... Necesito poner una tabla mas en el data set con otro tipo de informacion, sin embargo mi duda esta en el codigo de vb ... en esta parte : "CrReport.SetDataSource(dtDatos)" ... aqui, paso la información para una sola tabla , ¿como puedo hacer para llenar la segunda tabla que quiero colocar en el data set?. es posible hacerlo o tienes algun ejemplo ?

Gladys dijo...

Buenas y como se haria en tal caso que en vez de usar sql se usase access???

Unknown dijo...

Hola Gladys,

Es identico, lo unico que cambia es que la conexion a la base de datos es con Access, el proceso de crear el reporte sigue siendo valido de acuerdo a los datos de tu aplciacion.

Saludos,

Roberto Alvarado

Gladys dijo...

sabes que cuando trato de adaptarlo a mis necesidads, por eso fue que pregunte que pasaba cuando se queria trabajar con acces en vez de sql me da un error en esta linea: Dim sbQuery As New StringBuilder ‘ StringBuilder para armar cadenas
soy nueva en esto, y no se si sea una novatada o no, pero hasta donde se en access solo existen los commandbuilders, 1º pregunta, por ende tu stringbuilder para mi caso seria commandbuilder????, ahora 2º pregunta me dice que append no pertenece a commandbuilder como debo hacer en este caso?? por fis si me puedes prestar ayuda ya que he revisado de todo para crear los reportes y sólo los he logrado llenar con los datos directamente de mki tabla y no con los dataset de mi grid en mi form... y gracias

Gladys dijo...

hola, ya lo solucionè, era problema de "novatada" ahora te comento sigo como al principio sin nada, porque lo probé y me sigue saliendo vacio???? porque será si mi tabla esta llena con los datos que necesito mostrar.,...

Gladys dijo...

otra vez yop :>, sabes, c uando voy a correr el reporte me sale un mensaje de MOSTRANDO REPORTE el cual dice: exception no se han especificado valores para algunos de los parámetros requeridos...

sergio dijo...

Hola Roberto te saludo desde Guatemala, desde hace unos años mi inicie programando con VB6 y como sabras tiene un reporteador que es muy facil y flexible, pues ahora quiero pasarme a vb2008 y exactamente mi problema es el de los reportes en el tutorial se explica perfecto, ahora mi duda es si por ejemplo distribuyo mi aplicacion en vb2008 con los reportes en crystal es necesario que el cliente adquiera la licencia de crystal o solo yo necesito tenerla? De antemano te doy mil gracias

Unknown dijo...

Hola Sergio, no es necesario que le cliente compre el Crystal reports, solo ene l instalador debes incluir los medios de instalacion del runtime de CR.

Saludos,

sergio dijo...

Muchas Gracias por la respuesta.

Miriam dijo...

Hola sergio mi pregunta es como crear un data set que me devuelva la consulta x medio de query ya que veo que solo muestra la tabla seleccionada que esta en la base de datos, pero lo que yo requiero es una consulta de varias tablas la cual genero x query.

Unknown dijo...

Hola Miriam,

Si te fijas en el articulo, yo explico como crear un dataset que es la base para crear el reporte, ese dataset lo armas como tu lo necesitas, que serian las columnas que tu necesitas o armas en tu consulta sql para los datos del reporte.

Saludos,

milik dijo...

hola esta xebere tu blog de reporte pero deseo que me ayudes en un tema sobre la diferencia de un reporte dinamico y general y si tubieras ejemplos mejor o enlaces si puedes enviarmelo a mi correo:
mili4784@hotmail.com
gracias
un saludo....
milik

Anónimo dijo...

Hola,

No entiendo a que te refieres con un reporte dinamico, ese es un reporte dinamico pues depende de los parametros que s ereciben y se pasan a la consulta asi mismo arroja los datos que finalmente llenan el reporte.

Saludos,

Anónimo dijo...

muy bien todo pero y para C# se puede hacer esto ?

Unknown dijo...

Hola,

Para C# es identico, logicamente con la sintaxis correcta para C#

Saludos,

Anónimo dijo...

me imagino que así es, pero la pregunta entonces es:
¿Y como es entonces la sintaxis correcta para hacer esto en C#?

Ele dijo...

Ruco Estupido, no me sirvio de nada tu pinche tutor

Guille dijo...

Hola primero muchas gracias por el tuto y segundo, lo hice al pie de la letra y me tira error en la coneccion de la base de datos.
Uso sql2005 express y puse lo siguiente en la cadena de coneccion:
oCnn.ConnectionString = "Provider=SQLNCLI; " & _
"Initial Catalog=Tesis; " & _
"Data Source=(local)\SQLEXPRESS; " & _
"integrated security=SSPI; persist security info=True;"
pero me dice que hay un error de inicio de seccion del usuario (xxx). no se puede abrir la base de datos XXX por inicio de sesion, me podrias ayudar en esto????

Unknown dijo...

Hola cuando abres el SQl Management Studio, alli aparece la ruta o nombre exacto del servidor, coloca esa ruta en la cadena de conexion.

Saludos,

De aqui y de allá dijo...

Hola:
Gracias por el post, lo primero, es de gran utilidad. Me surge una duda, que igual está mas relacionada con el acceso a datos que con el reporte en si. Tengo un acceso a datos creado con el diseñador de datasets (dataset tipado) y quiero crear un reporte que consta de varias tablas relacionadas, incluyendo calculos de tiempos y porcentajes en base a algunos datos de esas tablas.
Mi duda es como coger los datos del dataset tipado, realizar esos calculos y "volcarlos" en el datset creado a mano para mostrarlo en el Reporte.

De aqui y de allá dijo...

Otra duda quetengo es si al tener el dataset tipado ya no debería crear un dataset a mano.

Unknown dijo...

Hola,
Si ya tienes creados datasets tipados no veo necesidad de crear otro para el reporte, puedes crear el reporte partiendo de lo que tienes, pero, si el reporte necesita unas cosas y tus datos estan en varios dataset es mejor crear uno y llenarlo de acuerdo a lo que se va a imprimir en el reporte.

Para tomar los datos de un dataset y pasarlos a otro dataset que sea el que utilices para el eporte es simplemente agregar una fila a la tabla y luego asignar el avlro de cada columna.

Anónimo dijo...

Hola, el codigo esta muy bien explicado, pero al final me bota un error: " No se ha podido cargar el informe"
E ensayado con diferentes bases de datos (todas en Mysql), y cambio cositas en mi proyecto, pero nada me funciona :(
Espero q puedas ayudarme con esto
De antemano muchas gracias

Unknown dijo...

Hola

El problema es que el reporte no se puede cargar, pero ese es el mensaje de error? deberia decirte otro tipo de error que indique la razon por al cual no se ha podido cargar el reporte.

Unknown dijo...

Dios le bendiga don Roberto.
Gracias por su aopoyo, su ejemplo esta muy bueno. Tengo una consulta que hacerle:

1. Tengo un form1 donde paso dos fechas como parametros a una consulta en access a modo de procedimiento almacenado, traigo los datos de esta forma y los veo en un datagridview, igual a su ejemplo de vista previa, pero cuando deseo ver el reporte con los datos almacenados en una datatable, lo hago asi con su ejemplo:

Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument
' Asigno el reporte
CrReport = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
CrReport.Load(Application.StartupPath & "\Crystalreport1.rpt")
CrReport.SetDataSource(dtDatos)

Me.CrystalReportViewer1.ReportSource = CrReport

este codigo lo escribo en el load del form2 que contiene el crystaviewer, pero en la instruccion CrReport.Load(Application.StartupPath & "\Crystalreport1.rpt")
me genera error load report failed

Qué cree que puede ser?

Saludos desde Nicaragua,
Carlos.

Unknown dijo...

utilicé tambien la instruccion

CrReport.Load(System.AppDomain.CurrentDomain.BaseDirectory & "\CrystalReport1.Rpt")

pero genera el mismo error.

Saludos y gracias...Carlos

Unknown dijo...

don Roberto:

Application.StartupPath me retorna:

C:\Documents and Settings\A0AT02176\Desktop\nueva fecha\nuevafecha\bin\Debug...

que es donde se encuentra el .exe de la aplicacion, pero si deseo cargar el .rpt deberia de llegar hasta

C:\Documents and Settings\A0AT02176\Desktop\nueva fecha\nuevafecha\Crystalreport1.rpt

pero el caso es staruppath busca el .rpt en \bin\debug no en \nuevafecha\.Crystalreport1.rpt

Unknown dijo...

Hola Carlos,

El reporte, debes colocarlo en la misma carpete en donde se encuentra el .exe, por eso utilizo esa ruta.

Saludos,

Unknown dijo...

Dios le bendiga don Roberto
Gracias por su apoyo.

Ya resolví el problema y tenía usted razón, era simple lo del llamado al reporte, aunque no me gusta mucho que los reportes tengan que estar en \bin\debug.. pero si, su ejemplo es bastante bueno.
Pero fijese que los datos una vez cargados en el datatable, pueden ser vistos en el reporte solamente pasando el objdatatable como parámetro.

Adaptador.Fill(odatatable) objreporte.SetDataSource(odatatable)

Sólo un problema, cuando cargo el reporte entre rangos de fecha, lo cierro y vuelvo a realizar una nueva búsqueda por fechas o entre el rango anterior, los registros aparecen duplicados en el reporte.

He probado con objformulario.Dispose() 'el que form que contiene el reporte

objreporte.Dispose()'el objeto reporte

objformulario = Nothing
objreporte = Nothing

Pero el problema persiste

Saludos, Carlos

Anónimo dijo...

hola, espero y sigan revisando aqui..
tego una duda.
quiero hacer el reporte pero con relacion a 2 tablas, el problema es que ya lo hice pero al momento de sacar el reporte no me apaecen los camos de todas las tablas, si no que faltan...
si me pudieran ayudar gracias

Unknown dijo...

Buenos dias don Roberto. Gracias por su apoyo.

Permitame hacerle una consulta con respecto a smartdevices.
Tengo una aplicacion hecha en vb.net2008. Especificamente cuando cierro la aplicacion y la vuelvo a abrir para un nuevo registro, siempre me aparecen los formularios previamente utilizados, con la informacion del registro anterior.

Unknown dijo...

He tratado de que al momento de cerrar un form y volver a abrirlo que en el load limpiar los controles, otro ha sido el destruir los form con .dispose() pero en ambos casos, el problema persiste. Por otro lado, veo en setting-memory-applications- que los forms se cargan como procesos independientes en memoria. Ante esto, intento 'matar' cada proceso para superar el problema que le comento pero no logro nada...

Unknown dijo...

Me gustaria saber su comentario.

De antemano, gracias por su tiempo y por su ayuda.

Saludos desde Nicaragua,
Carlos.

Unknown dijo...

Hola Carlos,

No sera que el evento load del formulario tu estas llenando los datos, y por eso te aparecen cada vez que inicias la aplicacion los datos?

Saludos,

Unknown dijo...

gracias por responder tan pronto.
Don Roberto mire:

La aplicacion es de pedido y venta directa utilizando un Symbol MC35
Claro, lleno datos desde el load.. suponga que llego a x negocio a levantar pedido para el viernes.. abro mi aplicacion registro y me voy, cierro la aplicacion, voy al negocio Y y abro nuevamente la aplicacion pero los forms tienen la informacion del negocio x..

Unknown dijo...

Carlos, entonces, antes de llenar los datos, debes colocar para que solicite el nuevo almacen a visitar, luego si, cargas los datos en los controles.

Saludos

Unknown dijo...

a como le comento, utilice .dispose() para destruir los forms al momento de cerrar la aplicacion, utilizo .clear para limpiar controles (list por ej), y tambien .kill para destruir los procesos porque los forms individuales los veo como procesos en memory - aplicaciones del mc35 pero todavia no doy..usted no se ha encontrado con esto? programo con visual basic.net

Unknown dijo...

Carlos, entonces, antes de llenar los datos, debes colocar para que solicite el nuevo almacen a visitar, luego si, cargas los datos en los controles.

casi no le entendi a su comentario. que debo colocar?.. pero estoy tratando de ver lo que me dice

Unknown dijo...

Cuando ingreses a la aplicacion pide que seleccione el cliente al cual va a visitar, luego que lo haya seleccionado entonces si cargas los datos de acuerdo al cliente seleccionado.

Anónimo dijo...

Excelente aporte, es dificil encontrar tutoriales asi de pedagogicos, haz hecho un trabajo muy bueno, Muchisimas Gracias, esto vale oro, esperamos que continues asi...!!!

Anónimo dijo...

necesito saber como hago para cambiar erl sexo de un empleado que se guarda con "M" y lo quiero mostrar en el reporte como masculino

Unknown dijo...

Hola,
para dentro del reporte recibes un campo con un valro "M" y lo quieres mostrar como "Masculino".

Creas una variable dentro del reporte, en el codigo de la variable preguntas si es "M" , entonces que coloque la palabra "Masculino", la programacion es un Visual basic sencillo.

Anónimo dijo...

Hola, cuando mi reporte hecho en Crystal reports tiene como fuente de datos a un dataset tipado, no muestra los datos, pero cuando tiene como fuente de datos una tabla en SqlServer sí los muestra. ¿Qué puede estar pasando?

Unknown dijo...

Hola,
Cuando tiene fuente de datos una tabal es porque arrastras desde el explorador de servidores las tablas, cuando lo haces con un datset, debes llenar el dataset con lsod atos, seguramenet no lo estas haciendo y por eso tu reporte sale vacio.

Saludos,

Anónimo dijo...

Hola Roberto, he verificado que el dataset contiene datos, voy a agregar un poco de código fuente, está hecho en Visual Studio 2008, lenguaje C Sharp:

...
private dsSolicitudCitologico ds;
//Este es el dataset
...

textBox1.Text = Convert.ToString(ds.Tables[0].Rows[0][2]);
//Esto para verificar que el dataset contiene datos, en textBox1 aparece el dato

RptSolicitudCitologico rpt;
rpt = new RptSolicitudCitologico();
//Este es el reporte

rpt.SetDataSource(ds);
//Asigno el dataset al reporte

this.crVistaImpresion.ReportSource = rpt;
//Asigno el reporte al visualizador

Anónimo dijo...
Este blog ha sido eliminado por un administrador de blog.
Fede B dijo...

Hola ... veo que realmente das buenas soluciones a cada problema , es por eso que quiero preguntarte "como debo hacer para que me funciones Cristal Report en Visual Studio 2010 en Español " .. Gracias !!

Unknown dijo...

Hola Fede,

En primera instancia Crystal reports no se instala en VS2010 como lo hacia anteriormente en la instalacion del producto, la primera vez que seleccionas crear un nuevo reporte, te da la opcion de ir a la pagina web y descargar el software para ser instalado, luego que lo tengas instalado en tu PC ya no debes tener problemas para generar o crear un reporte de Crystal Report.

Si tu problema es otro comentamelo a ver si puedo ayudar a solucinarlo.

Saludos,

Fede B dijo...

Hola Roberto .. Gracias por responder. Ya intente bajar Cristal Report desde la pagina que me abre Visual Studio 2010. Pero al momento de crearlo (cuando me pregunta que tipo de informe quiero .. ) ; Visual Studio deja de funcionar y solo se reinicia . Por otro lado , quiero utilizar Report1 pero no puedo instanciarlo .. no se si fui claro , pero agradeceria la ayuda ..

Unknown dijo...

don roberto

Unknown dijo...

Dios le bendiga, Saludos nuevamente desde Nicaragua.
Le comentaba hace unos meses, que estoy desarrollando una aplicacion pequenna sobre levantado de pedidos en vb.net2008team system.. pero mi forma de sincronizar la info es por medio de la generacion de archivos .txt via usb...

Unknown dijo...

no s'e si esto es considerado una aplicacion movil, pues para serlo tendria que sincronizar info con acceso a internet? por otro lado, cuales son las ventajas de movil .net vrs. otras, he leido pero siempre hay diversidad de comentarioas al respecto... ha encontrado ventajas notorias de microsoft? una de ellas , la documentacion

Unknown dijo...

tendr'a algun articulo relacionado a esto del auge de las aplicaciones moviles y hablar del lado de microsoft? ..Tambien tengo cierto problema con la forma de como trabajar con acceso a internet, estoy indagando por mi cuenta pero veo que hay que tener un web server, pagar el servicio de telefonia para poder enviar info via webservices! no s'e por donde empiezo

Unknown dijo...

estoy usando un symbol mc35 con windows mobile 6.0

Unknown dijo...

Hola Carlos,

Este comentario debiste haberlo colocado en alguno de los articulos de WIdnows mobile, no es este de Reportes.
Si vas a trabajar con un service debe estar en un hosting, y claro debes parlo, pero si la empresa tiene internet y una IP publica, lo puedes colocar en esa IP y no gastas en Hosting.
Una aplicacion es considerada movil si puede funcionar sin estar conectada dentro de la red de la compañia y que se pueda ejecutar desde cualquier lugar (con restricciones).

Anónimo dijo...

el ejemplo me salio super bien, pero ahora quiero agregar varias datatble a mi dataset para utilizar en mi report, se puede realizar esto?? hasta ahora no lo puede hacer

Unknown dijo...

Hola

Claro que puedes utilizar varios datatable en el dataSet que te sirve para crear el reporte.

Unknown dijo...

Por mas que intento me sale la excepcion de que no se puede cargar el Informe u___u

Dim conexion As New SqlClient.SqlConnection
Dim comando As New SqlClient.SqlCommand
Dim adaptor As New SqlClient.SqlDataAdapter
Dim dataset As New DataSet


Try
conexion.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\EDY\Documents\Visual Studio 2010\Projects\CinthiaDesarrolloDeAplicaciones2\CinthiaDesarrolloDeAplicaciones\bin\Debug\BDcinthia.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
comando.CommandText = " SELECT * FROM Nomina"
conexion.Open()
comando.Connection = conexion
adaptor.SelectCommand = comando
adaptor.Fill(dataset, "0")

Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument
CrReport = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
CrReport.Load(Application.StartupPath & "CrystalReport2.rpt")
CrReport.SetDataSource(dataset)
CrystalReportViewer1.ReportSource = CrReport
Catch ex As Exception
MessageBox.Show("excepcion: " & ex.Message, "Mostrando Reporte")
End Try
End Sub

En el debuger me aparece esto

Excepción del tipo 'CrystalDecisions.Shared.CrystalReportsException' en CrystalDecisions.CrystalReports.Engine.dll ... crees q se deba a eso?

Eduardo dijo...

Cuando lo corro me da la exepcion de que no se pudo cargar el informe y no sale nada mas.

Dim conexion As New SqlClient.SqlConnection
Dim comando As New SqlClient.SqlCommand
Dim adaptor As New SqlClient.SqlDataAdapter
Dim dataset As New DataSet


Try
conexion.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=...\CinthiaDesarrolloDeAplicaciones\bin\Debug\BDcinthia.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
comando.CommandText = " SELECT * FROM Nomina"
conexion.Open()
comando.Connection = conexion
adaptor.SelectCommand = comando
adaptor.Fill(dataset, "0")

Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument
CrReport = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
CrReport.Load(Application.StartupPath & "CrystalReport2.rpt")
CrReport.SetDataSource(dataset)
CrystalReportViewer1.ReportSource = CrReport
Catch ex As Exception
MessageBox.Show("excepcion: " & ex.Message, "Mostrando Reporte")
End Try


En el Debuger me aparece esto tendra algo que ver??..
Excepción del tipo 'CrystalDecisions.Shared.CrystalReportsException' en CrystalDecisions.CrystalReports.Engine.dll

Aparte, segun veo contigo son 5 referencias a crystal reports, a mi solo me aparecen 4.

Unknown dijo...

Hola Eduardo,

Verificaste que el archivo del reporte, o sea el .rpt se encuentre en la misma carpeta que el .exe? Porque ese puede ser el error.

Si lo etsas ejecuatndo, el reporte debe estar en ..\bin\debug de acuerdo al codigo que me enviaste.

Saludos,

Eduardo dijo...

Pues ya movi el rpt a donde se encuentra el exe y me marca el mismo error =(

Eduardo dijo...

Ya no me marca el error jaja, pero no me carga los datos jeje..

Unknown dijo...

Hola Eduardo,

Verificaste que el Datatable que le pasas al dasource del reporte tiene datos?

Eduardo dijo...

Lo siento por tardar en contestar, si contiene datos, solo aparecen los encabezados pero no aparecen los datos

RAFAEL13 dijo...

Cordial saludo Roberto Alvaro, excelente tutorial, es lo que estaba buscando para hacer un reporte de este estilo ya que siempre los creo es con el diseñador, pero tengo algnas dudas que espero me pueda ayudar a solucionar, las cuales son:
1. Estoy trabajando con una base de datos sql y VS2008, y trabajo utilizando el bindingsource y tableadapters, bueno yo ya tengo el dataset y todos los datatables de las tablas que se me crean cuando llevo el origen de datos a visual, igual tendria que crearlos o con estos ya me funcionaria?, en este dataset ya estan relacionadas las tablas logicamente.

2.en el diseño de reporte uno debe arrastar los campos con los que quiere la informacion, pero no me queda claro si uno crea un nuevo dataset y unos nuevos datatable, entonces solo se arrastraria los campos pero no traen informacion al contarrio cuando uno arrastra los campos del dataset del origen de datos que vienen con un label de titulo y en el detalle del crystal queda la informacion.
3. no hay problema que muestre informacion de varias tablas que estan relacionadas no hay problema me mostrara la informacion.

Muchas gracias señor alvaro y disculpe la molestia

Unknown dijo...

Hola Rafael!

1. si puedes utilizar tus datasets ya creados para diseñar el reporte

2. Como tu tienes ya creados lso datasets, solo debes utilizar los campos de estos, no volver a crear nuevos datasets.

3. NO hay problema, puedes mostrar informacion de todas las tablas que necesites.

Unknown dijo...

hola roberto te molesto con lo siguiente, yo estoy trabajando con conexion odbc, se puede seguir el mismo procedimiento o ya cambia mucho, gracias.

Unknown dijo...

Hola Rafael,

La forma de coenctarse a la base de datos no debe influir en la consulta, lo que debes verificar es si tu consulta esta devolviendo datos y si el datatable esta lleno con datos cuando se lo pasas al datasource del reporte.

Saludos,

nicoke dijo...

Muchas Gracias por esto... me ha servido de mucho. pero tengo una inquietud, el reporte me funciona a la perfección, pero como lo hago para cuando se agrega un registro y quisiera ir a mirar el reporte para ver como ingreso el dato nuevo?... no lo logro hacer, solo se me actualiza cuando entro y salgo de la aplcación.

Gracias.

Unknown dijo...

Hola nicoke

debe ser la forma enq ue actualizas el datasource del reporte y por eso no te actualiza los datos del reporte hasta que no salgas y vuelvas a entrar, eso sucede mucho si has hecho el reporte arrastrando al tabla al reporte y no como lo explico en el articulo.

Dale un Update o cierra y vuelve a abrior la conexion para que se actulice n los datos

nicoke dijo...

Muchas Gracias por tu respuesta Roberto, pero mi problema no tenía nada que ver con eso. sino que con la conexión. aunque suene raro. Te Explico: mi conexión era: "Data Source=.\SQLEXPRESS;AttachDbFilename=""C:\Documents and Settings....base.mdf"";Integrated Security=True;Connect Timeout=30;User Instance=True"

después de probar y hacer miles de cosas, a la conexión q tenía le saque las doble "" para q quedará asi:

"C:\Documents and Settings......base.mdf"...

y me funciono a la perfección, ahora por que fallaba.. es lo q me he perguntado por harto tiempo...
je

Gracias!!!!

nicoke dijo...

Hola.. Tegno un nuevo problema ahora.. y ojala me puedan ayudar.

Sucede que al crear la setup para instalar la aplicación en otro pc, lo instala sin problemas, me crea el .exe mas la carpeta donde guardo al base de datos .mdf que uso. pero cuando trato de entrar al sistema desde el loginm me tira el siguiente mensaje de error:

"No se logro coenctar a la base de datos, error relacionado con la red.........
(provider: Interfaces de Red SQL, error:26 - Error al buscar el servidor o instancia espeficado)"

He buscado en algunos foros y hablan de habilitar algo para conexiones remotas, pero en mi caso, es sólo un archivo en forma local.

Ojala y puedan ayudarme,
Gracias

Unknown dijo...

Hola Nikoke

Si utilizas una base de datos SQL, receiurda que es un servidor, solo con pasar el archivo .mdf y el .ldf no garantiza que tengas la base de datos disponible, debes tener un servidor de SQL Server y restaurar o atachar la base de datos alli.

nicoke dijo...

Muchas Gracias Roberto por responder.

Y cual sería la mejor opcion en mi caso, ya q no puedo estar instalando sql server en cada cliente en el cual necesito que funcione esta aplicación???. la idea sería instalar el programa, adjuntar la base y ya!.

y nuevamente gracias por tu ayuda.

Unknown dijo...

Hola Nikoke,

Si tu base de datos es SQL Server, necesariamente necesitas un servidor de base de datos para tu programa, si el programa lo estas instalando en la red LAN de tu ofician por ejemplo no hay necesidad de attach la base de datos, solo colocar la cadena de conexion a al abse de datos para ADO.NET en el app.config y toamrla desde alli para toda la aplciacion.

Saludos,

alobaton dijo...
Este comentario ha sido eliminado por el autor.
alobaton dijo...

Gracias por el aporte, modifiqué el código para manejar dos tablas en el data set y funcionó perfecto

Saludos desde México

Alejandro Lobatón

EPICENTROSUPERSONICO dijo...
Este comentario ha sido eliminado por el autor.
EPICENTROSUPERSONICO dijo...

hola.. sabes no logro modificar el codigo que dejas ahi escrito..yo tengo la siguiente forma de conectarme.
Dim cs As String = "Data Source=192.168.0.1\SQLEXPRESS;Initial Catalog=SanIsidro1;User ID=mash12; Password=mash045346"

Dim query As String = "SELECT Codigo, Nombre, Direccion, Telefono, Cargo " & _
"FROM empleados "


Using cn As New SqlConnection(cs)
cn.Open()

Dim cmd As New SqlCommand(query, cn)

Dim da As New SqlDataAdapter(cmd)
Dim dt As New DataTable
da.Fill(dt)

Data.DataSource = dt

End Using

PARA QUE CUMPLA LA FUNCION DE ESTE.
Private Sub btnImprimir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImprimir.Click
Dim oCnn As New OleDbConnection ‘ Objeto de conexion a la base de datos
Dim daDatos As New OleDbDataAdapter ‘ Objeto Adaptador para leer datos de la Base de datos
Dim cmdExec As New OleDbCommand ‘ objeto comando para ejecutar sentencias sql
Dim dtDatos As New DataTable ‘ datatable para recibir los datos de la base de datos
Dim sbQuery As New StringBuilder ‘ StringBuilder para armar cadenas
Try

oCnn.ConnectionString = "Provider=SQLNCLI10;Server=ralvarado;Database=MiBD;Uid=sa; Pwd=XXX;"
oCnn.Open()
cmdExec = oCnn.CreateCommand
cmdExec.Connection = oCnn

sbQuery.Append("SELECT Consecutivo ")
sbQuery.Append(" ,IdentificacionPersona ")
sbQuery.Append(" ,TipoPersona ")
sbQuery.Append(" ,Grupo ")
sbQuery.Append(" ,PrimerNombre ")
sbQuery.Append(" ,PrimerApellido ")
sbQuery.Append(" ,SegundoApellido ")
sbQuery.Append(" ,Sexo ")
sbQuery.Append(" ,Profesion ")
sbQuery.Append(" ,Direccion1 ")
sbQuery.Append(" ,Direccion2 ")
sbQuery.Append(" ,TelFijo1 ")
sbQuery.Append(" ,TelFijo2 ")
sbQuery.Append(" ,TelMovil ")
sbQuery.Append(" ,PaginaWeb ")
sbQuery.Append(" ,ZonaPostal ")
sbQuery.Append(" ,Fax ")
sbQuery.Append(" ,Email1 ")
sbQuery.Append(" ,Email2 ")
sbQuery.Append(" ,FechaNacimiento ")
sbQuery.Append(" FROM Persona ")
cmdExec.CommandText = sbQuery.ToString

daDatos = New OleDbDataAdapter(cmdExec)
daDatos.Fill(dtDatos)

Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument
' Asigno el reporte
CrReport = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
CrReport.Load(Application.StartupPath & "\crPersonas.rpt")
CrReport.SetDataSource(dtDatos)

CrystalReportViewer1.ReportSource = CrReport

Catch ex As Exception
MessageBox.Show("excepcion: " & ex.Message, "Mostrando Reporte")
End Try

End Sub

Ingrid dijo...

hola!
gracias por el aporte, si me ayudo mucho, aunque tengo un problema...
lo estoy implementando en c# y no me reconoce linea: CrystalReportViewer1.ReportSource = CrReport;

no se si tenga qe cambiar el CrystalReportViewer por otra cosa?
o agregar algun tipo de referencias...
agradeceria mucho su ayuda...

Anónimo dijo...

Hola,

Al agregar un reporte como indicas, no me muestra el cuadro donde debo elegir el tipo de reporte que deseo.

Por favor ayudame si sabes a que se debe este error. Las referencias que muestras en la imagen son las mismas que tengo y he instalado el crystal reports nuevamente.

Gracias

Unknown dijo...

Ingrid,

En C# no debes hacer ,los objetos son los mismos que en VB.NET, sin embargo si me dices el emnsaje del error quizas pueda ayudarte mejor.

Unknown dijo...

Anonimo, no entiendo lo del tipo de reporte, eso aparece creo que en el wizard, aqui estamos haciendo todo manual.

Anónimo dijo...

Hola nuevamente,
Citas en tus instrucciones: "Aparece la siguiente pantalla para seleccionar el tipo de reporte a crear, en la parte izquierda...", a lo que me refiero con mi comentario anterior es que luego de agregar el reporte, no se muestra la pantalla para seleccionar el tipo de reporte. Sabes a que se debe este problema????

Gracias!!

Ingrid dijo...

ya lo resolví, gracias
solo era cuestion de agragar la forma en la qe usaba el crystalReportViewer1

Ingrid dijo...

Aunque ahora tengo otra duda, como incluir los datos de varias tablas a la vez en un mismo reporte??
pero sin utilizar ningun tipo de join ya que las tablas no tienen relacion alguna...

Unknown dijo...

Hola Ingrid,

Agregale al dataset mas datatables y alli llenas los datos adiconales, para llenar las tablas las llenas colocando las sentencias sql separadas por punto y como ; y esto llena por cada resultado un datatable del dataset que definas para el reporte.

Saludos,

MNURENA dijo...

hola Roberto, bueno sabes que, yo quiero hacer lo mismo pero ahm yo trabajo en capas, entonces en una capa (de negocios) tengo las funciones que devuelven los datos de lo que pido, tengo una funcion tipo DATASET, eh aqui un ejemplo
Public Function VerRVenExtSP(ByVal Fini As Date, ByVal FFin As Date) As DataSet
Dim ds As New DataSet
Dim dllBD As New Capa_Datos.Conex
dllBD.INICIACONEX()
Dim dpt As New SqlDataAdapter("UST_REPORT_VENEXTSINP", dllBD.cn)
dpt.SelectCommand.CommandType = CommandType.StoredProcedure
dpt.SelectCommand.Parameters.AddWithValue("@FECHINI", Fini)
dpt.SelectCommand.Parameters.AddWithValue("@FECHFIN", Fini)
dpt.Fill(ds, "VenExSinP")
dllBD.CERRARCONEX()
VerRVenExtSP = ds
dllBD = Nothing
ds = Nothing
dpt = Nothing
End Function

bueno ahora estoy probando la opcion que mencionas en este post para llenar este dataset tipado con estos datos pero no logro hacerlo, no es el mismo modo del q tu trabajas, espero me peudas ayudar con este problema, no se como asignar los resultados de esta funcion que probiene de esta capa negocio, como lo ago en un datagrid. porfavor dame un alcance. y si seria de la misma forma para asignarlo a un crystalreport

Unknown dijo...

Hola Mikito,

Simplemente debes tomar tu dataset y pasarselo al ReportDatasource del reporte.

Aqui lo Importante es que ese dataset tenga la misma estructura del dataset con el cual definiste el reporte, si son diferentes hay problemas.

Saludos,

Anónimo dijo...

PORFA ALGUIEN ME PUEDE AYUDAR BRINDANDOLO EN C# ESKE SOY NOVATA EN ESTO DE LA PROGRAMACION PLEASE!!!! ME MEGAURGE

Unknown dijo...

Hola

Para hacerlo en C#, lo que debes hacer es simplemnte ajustarte a la sintexis C#, las definiciones de campos antes y luego la variable, el resto de cosas, los objetos y clases son iguales, pues es el mismo Framework el que utilizamos.

Si tienes un error puntual, me avisas y te ayudo con el.

Saludos,

Anónimo dijo...

hola, una pregunta, si trabajo 2 tablas, personal y pais
y deseo mostrar en el reporte el nombre del personal y el nombre del pais de ese personal como lo haria?
la relacion es la siguiente:

La tabla Personal contiene el foreing Key "cod_Pais".
Y la tabla Pais, contiene el primary key.

Si solo selecciono los campos de la Tabla Personal, me muestra el codigo del Pais, como haria para que me muestre el Nombre del Pais.
En el Datagridview lo he logrado usando el inner join, pero la consulta es como lo haria para mostrarlo en los reportes.

Muchisimas gracias, este ha sido el mejor ejemplo para crear reportes q he visto en internet

Anónimo dijo...

hola, tngo otra duda, declaro esto:
Dim sbQuery As New StringBuilder , no me reconoce , yo tabajo con SQL SERVER 2008 y Visual Studio 2008

Anónimo dijo...

hola, lo del StringBuilder, lo solucione importando "System.text"

ahora cuando le doy clic al boton generar reporte me sale el siguiente mensaje:
"excepcion: No se ha podido cargar el informe."

Cesar Guillen dijo...

Saludos!!

Excelente Tutor para crystal report, pero tengo una inquietud. Intento mandarle parametros a un reporte de crystal report utilizando un formulario Web (aspx), ninguna programacion me ha funcionado y aunque indique los parametros en programacion, siempre me sale un web form solicitando el parametro.

existe Alguna forma funcional para mandar parametros a los reportes de crystal report utilizando un website?

en mis ultimas pruebas use el codigo del siguiente link (tampoco funciona): http://www.c-sharpcorner.com/UploadFile/mahesh/paramInCR11012006132839PM/paramInCR.aspx

LKSDG dijo...

Como puedo correr un programa winforms de vb 2010 y con crystal reports en una maquina que no tenga instalado crystal reports?? que librerias debo buscar o que paquete debo agregar??

De antemano muchas gracias.

Unknown dijo...

Hola

Para ejecutar los reportes debes instalar Crystal Report Runtime, lo encuentras en la pagina de SAP para bajarlo e instalarlo.

Saludos,

Joel Francisco Barrera F dijo...

hola

muy bueno ese tutorial me gustaria saber como seria el codigo para hacerlo en c sharp

Unknown dijo...

hola Joel,

Realmente para pasarlo a C# es muy sencillo la diferencia esta en como definir las variables y los puntos y comas al final de las lineas, asi como las llaves

Anónimo dijo...

hola, ojala k este tema siga vigente, pork tengo una preguntita, ksi no se de nada crystal report, pro necesito usarlo para que el contenido de un datagrid que llene con una consulta se pase a un crystal report, segun he leido se tiene que crear un datatable o algo asi con el contenido del datagrid, pro no se cmo hacerlo, espero me pueda ayudar y si no es mucho abuso pues k me explike como hacer el datatable, estoy con visual.net 2008, muchas gracias de antemano, un gran saludo :)

Anónimo dijo...

que tal. si estuvo bueno pero no logro resolver mi problem,a

Anónimo dijo...

amm si me ayudo un pokito, alquien me podria ayudar es k de una base de datos de libros quiero consultar un libro y el resultado imprimirlo..espero su respuestra y muchas gracias

Unknown dijo...

Hola,

para crear el datatable en el tutorial lo explico, solo debes colocar la sentencia sql para llenar la grilla donde se llenan los datos del reporte.

Saludos,

Anónimo dijo...

HOLA ROBERTO ACABO DE IMPLEMENTAR TU EJEMPLO PERO ME SALTA UN ERROR DICE EL REPORTE NO SE PUEDE CREAR

Unknown dijo...

Hola,

Estas seguro que las rutas dodne se encuentra el reporte es correcta?

Saludos

lowellpelikno dijo...

hola siguiendo con el mismo problema de el error de que no se a podido cargar el reporte te pongo mi codigo para ver si me puedes ayudar a encontrar el error
Dim oConexion As OleDbConnection
oConexion = New OleDbConnection()
oConexion.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= D:\PROYECTOS Y PROGRAMAS EN VE2005\UCAH\PROCAMPO2.mdb"
' crear adaptador
oDataAdapter = New OleDbDataAdapter("SELECT * FROM PRODUCTOR ", oConexion)
' crear commandbuilder
Dim oCB As OleDbCommandBuilder = New OleDbCommandBuilder(oDataAdapter)
' crear dataset
oDataset = New DataSet()
oConexion.Open()
oDataAdapter.Fill(oDataset, "PRODUCTOR")
' crear commandbuilder
' una vez desconectados, recorrer la tabla del dataset
Dim oTabla As DataTable
oTabla = oDataset.Tables("PRODUCTOR")

' cmdExec.CommandText = sbQuery.ToString

'daDatos = New OleDb.OleDbDataAdapter(oDataAdapter)
'daDatos.Fill(dtDatos)

Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument
' Asigno el reporte
CrReport = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
CrReport.Load(Application.StartupPath & "D:\PROYECTOS Y PROGRAMAS EN VE2005\REPORTECONCRYSTALREPORT\REPORTECONCRYSTALREPORT\CrystalReport1.rpt")
CrReport.SetDataSource(oTabla)

CrystalReportViewer1.ReportSource = CrReport

Catch ex As Exception
MessageBox.Show("excepcion: " & ex.Message, "Mostrando Reporte")
End Try

Unknown dijo...

hola,

El reporte no lo encuentras porque estas usando Application.StartupPath y despues le colocas una ruta a mano, entonces tienes una ruta que no existe, verifica esto, ademas que el archivo .rpt este realmente en la ruta correcta.

Saludos,

lowellpelikno dijo...

entonces cual seria la ruta del reporte

Unknown dijo...

Application.StartupPath devuelve la ruta en la cual esta ejecutandose el .exe, si deseas tener una ruta diferentes entonces le quitas eso, y colocas la ruta que tu desees

lowellpelikno dijo...

ya logre que me lo muestre

cambiando lo siguinte

CrReport.Load(Application.StartupPath & "D:\PROYECTOS Y PROGRAMAS EN VE2005\REPORTECONCRYSTALREPORT\REPORTECONCRYSTALREPORT\CrystalReport1.rpt

solo le quite el Application.StartupPath &
y quedo asi

CrReport.Load("D:\PROYECTOS Y PROGRAMAS EN VE2005\REPORTECONCRYSTALREPORT\REPORTECONCRYSTALREPORT\CrystalReport1.rpt")

gracias por el tuto solo una duda mas como puedo poner la hoja para que este horizontalmente.

Unknown dijo...

Hola
En las propiedades del reporte le dices que la orientacion es horizontal, no vertical. Si no te vas a las propiedades d ela impresora y lo haces alli.
Saludos

Tanky dijo...

Hola Roberto:
Tengo el siguiente código:

Dim daDatos As New OleDbDataAdapter ' Objeto Adaptador para leer datos de la Base de datos
Dim cmdExec As New OleDbCommand ' objeto comando para ejecutar sentencias sql
Dim dtDatos As New DataTable ' datatable para recibir los datos de la base de datos
Dim sbQuery As New StringBuilder ' StringBuilder para armar cadenas
Try
Dim con As OleDbConnection

'realizamos la conexión
con = ConexionBD.CONECTAR
cmdExec = con.CreateCommand
cmdExec.Connection = con

sbQuery.Append("SELECT IDFuncionario, ")
sbQuery.Append("Nombres,")
sbQuery.Append("Paterno,")
sbQuery.Append("Materno, ")
sbQuery.Append("Identidad ")
sbQuery.Append("FROM Funcionarios ")
cmdExec.CommandText = sbQuery.ToString

daDatos = New OleDbDataAdapter(cmdExec)
daDatos.Fill(dtDatos)

Dim CRReporte As New CrystalDecisions.CrystalReports.Engine.ReportDocument
'asigno el reporte
CRReporte = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
CRReporte.Load("C:\MiProg\Reportes\FichaPersonal.rpt")
CRReporte.SetDataSource(dtDatos)

Dim miReporte As New VerReporte()
miReporte.VisualizaReporte.ReportSource = CRReporte

Catch ex As Exception
MessageBox.Show("excepcion: " & ex.Message, "Mostrando Reporte")
End Try


y me sale el siguiente error:

Se produjo una excepcion en el inicializador de tipo de 'CrystalDecisions.CrystalReports.Engine.ReportDocument'

Oscar dijo...

como puedo hacerlo en c#

Unknown dijo...

Hola Tanky,

En tu caso revisaria si la ruta del reporte esta correcta.

Verifica que las referencias tambien esten bien y se hayan perdido.

Saludos,

Unknown dijo...

Oscar,

En c# es igual solo que kla sintaxis cambia:
dim mi_variable as String

En C# seria.
String Mi_variable;

Puedes utilizar una de las paginas de conversores de codigo que hay en la web para ello.

Saludos,

José Luis Ochoa Suvilla dijo...

Que tal Roberto mirs estoy tratando de ocupar tu explicacion y a la hora que le doy en el boton imprimir me sale un mensaje de que no se pudo mostrar el reporte, seguramente algo estoy haciendo mal porque soy nuevo en VB y queri avr si podrias ayudarme, ademas necesito poner en el reporte una imagen que esta en una carpeta compartida en la red mi codigo es el sigueinte espero puedas ayudarme .
Public Class FFoto
Private Sub BImprimir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BImprimir.Click
Dim oCnn As New SqlConnection ' Objeto de conexion a la base de datos
Dim daDatos As New SqlDataAdapter ' Objeto Adaptador para leer datos de la Base de datos
Dim cmdExec As New SqlCommand ' objeto comando para ejecutar sentencias sql
Dim dtDatos As New DataTable ' datatable para recibir los datos de la base de datos
Dim sbQuery As New StringBuilder ' StringBuilder para armar cadenas
Try

oCnn.ConnectionString = "DATA SOURCE = 192.168.2.209;INITIAL CATALOG = GESTORIA; USER ID = SA;PASSWORD = YESSICA"
oCnn.Open()
cmdExec = oCnn.CreateCommand
cmdExec.Connection = oCnn

sbQuery.Append("SELECT F.PERMISOFOLIO,F.FOLIOFINIQUITO,F.ELABORO,F.REVISO,P.PROPIETARIO,P.PPRANCHO,P.EJIDOLOCALIDAD,R.CULTIVOS FROM TBLFINIQUITOSAMP AS F INNER JOIN TBLPERMISOSAMP AS P ON P.PERMISOFOLIO = F.PERMISOFOLIO INNER JOIN TBLAFECTACION4 AS A ON A.PERMISOFOLIO = F.PERMISOFOLIO INNER JOIN TBLPRECIOS AS R ON R.CLAVE = A.AFECTACION WHERE F.FOLIOFINIQUITO = '5108' ")
cmdExec.CommandText = sbQuery.ToString
daDatos = New SqlDataAdapter(cmdExec)
daDatos.Fill(dtDatos)

ImageToByte(Image.FromFile("\\192.168.2.209\fotos\BLOQUE4\retendido\2853.JPG"))

Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument
' Asigno el reporte
CrReport = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
CrReport.Load(Application.StartupPath & "\crFoto.rpt")
CrReport.SetDataSource(dtDatos)

CrystalReportViewer1.ReportSource = CrReport

Catch ex As Exception
MessageBox.Show("excepcion: " & ex.Message, "Mostrando Reporte")
End Try
End Sub

Public Function ImageToByte(ByVal pImagen As Image) As Byte()
Dim mImage() As Byte
Try
If Not IsNothing(pImagen) Then
Dim ms As New System.IO.MemoryStream
pImagen.Save(ms, pImagen.RawFormat)
mImage = ms.GetBuffer
ms.Close()
Return mImage
End If
Catch
End Try
End Function
End Class

Unknown dijo...

Hola Jose Luis,

Debes colocar el archivo del reporte, o sea el .rpt en el directorio bin/debug o bin/release dependiendo de como estes ejecutando tu aplicacion.

Saludos,

Juan Leder dijo...

BUEN APORTE BROTHER.. MUY BIEN DETALLADO. ME SIRVIO DE MUCHO.

Juan Leder dijo...

BUEN APORTE BROTHER.. MUY BIEN DETALLADO. ME SIRVIO DE MUCHO.

Oscar Eduardo Alvarado dijo...

Hola Roberto, Tengo una duda, el tutor esta bien, no lo he probado pero se que funcionara, ahora mi duda es la siguiente, como puedo hacer en caso de que en mi consulta me devuelva datos null(sin datos), tengo una tabla persona donde algunos datos son opcionales y se llenaran como nulos, como manejaria esto en crystal report para poner en ves de ese campo un texto q me diga algo como "no tiene o no existe". espero me puedas ayudar

Unknown dijo...

Hola Oscar Eduardo,

En relacion a los campos nulos Crystal reports si te fijas en las propiedades de una caja de Texto, te coloca una cadena vacia, si tu quieres colocar valores diferebntes es escribirlos en esa propiedad.

Saludos,

Oscar Eduardo Alvarado dijo...

Gracias por responder Roberto, tengo otra duda, en el tutor dice que debemos arrastrar un cotrol de tipo CrystalReportViewer1, mi duda es donde lo agrego, pues para que este control aparesca tiene que estar en un formulario aparte, pero el codigo CrystalReportViewer1.ReportSource = CReport se muestra en el boton imprimir, y en el formulario que muestra como ejemplo, no ai lugar para el control CrystalReportViewer1. donde se mostraria el reporte, probe poniendo el reporte en el debug pero presiono el boton imprimir y no aparece nada, se termina por cerrar la aplicacion. espero se entienda mi duda.

Anónimo dijo...

Eh probado todo, y sin ningún tipo de problemas (me sirvió para refrescar la memoria), lo que no he podido refrescar es que no me muestra los valores cuando están ubicados en el detail, pero si los ubico en el page header si. Como justamente traigo varios registros, la idea es que estén en el detail para que se vayan repitiendo cuantos registros traiga la consulta. Gracias y excelente aporte. Saludos.

Anónimo dijo...

Reformulo mi consulta, me di cuenta que me trae una hoja por cada registro que devuelve mi consulta, mostrando la primera vacía.
Ejemplo:
Una consulta que devuelve 10 registro, el reporte me queda generado con 11 paginas, donde la primera esta vacía.
Alguien me puede ayudar? Gracias.

Unknown dijo...

Hola,

Por lo expones, es posible que hayas colocado los datos en el pie de pagina del reporte no en la seccion de detalle, de alli que cada regstro salga en uan pagina diferente.

Saludos,

Anónimo dijo...

Muy bueno, gracias, claro, conciso, y util.

Jose Angel dijo...

Muchas gracias, tu ejemplo es excelente

Humberto dijo...

Tengo solo una gran duda y es que se utilizar un poco c#, y este codigo no es en c#, alguien sabe como seria en c# por favor.
el ejemplo esta buenisimo pero como seria en c#

Unknown dijo...

Hola Humberto

Es igual, los objetos son los mismos, solo debes utilizar la sintaxis de C#.

Saludos,

Anónimo dijo...

hola roberto!! si se tiene un proyecto por capas donde se tiene las entidades (como dataset) por codigo como hariamos el reporte?,

Igualmente si utilizo Entity framework como evito hacer llamado a la base de datos si ya con las 2 metodologias anteriores se hace conexion y llamado a las tablas.

estoy desarrollando en c# ya que despues de pasarme de vb6 a vs .net es mejor con c# el vb .net pasará a la historia!! (creo yo) pero igual si tienes o sabes de algun codigo te agradeceria, (bien sea en vb o c# ya tratare de traducirlo con un pagina que convierte los codigos) o fuente.

greg_dorian@yahoo.com

Unknown dijo...

Hola Greg_dorian

Si utilizas EF o N-Tier, es igual el dataset es solo para obtener la estructura del reporte y poder dibujarlo.

Otra cosa cuando tu estas dibujando el reporte al indicar cual es la fuente de datos puedes indicar que es un objeto o clase, alli seleccionas tu clase que puede ser de tu modelo de clases o del modelo de clases de Entity framework, lo demas es igual despues de haber indicado de donde puede dibujar el reporte.

Saludos,

Anónimo dijo...

Hola, use tu codigo como ejemplo para mi sistema de captura de juntas en una escuela, pero me marca un error en el codigo en esta linea

CrystalReportViewer1.ReportSource=reporteimpresion

en la parte crystalreportviewer1

soy nuevo en el visual 2010 y no entiendo como imprimir y me intereza aprender puedes ayudarme te lo agradeceria un monton. GRACIAS

josesgonzal@hotmail.com

Unknown dijo...

Hola Jose,

Debes colocar el nombre del reporte como lo hayas creado en tu solucion de .net, igual que en el ejemplo.

Saludos,

Anónimo dijo...

Hola, use tu codigo como ejemplo para mi sistema de captura de juntas en una escuela, pero me marca un error en el codigo en esta linea

CrystalReportViewer1.ReportSource=reporteimpresion

en la parte crystalreportviewer1

soy nuevo en el visual 2010 y no entiendo como imprimir y me intereza aprender puedes ayudarme te lo agradeceria un monton. GRACIAS

josesgonzal@hotmail.com

Neyder Angarita dijo...

Por fin encontre algo que si sirvio (y)

Claudhinonet dijo...

Hola, buen Trabajo, actualmente estoy buscando como integrar el crystal report designer en un windows form de tal manera que pueda manupular el diseño del rpt en tiempo de ejecucion algien tiene alguna idea? se que existe un control llamado Embeddable cRystal Reports designer control pero no me sirve en Vb.net 2008

Anónimo dijo...

Saludos,
segui las indicaciones y me da el error "No se ha podido cargar el informe", tambien me da este error si realizo el paso corto.
si hay datos (me filtra 7 registros). le puse interrupciones y sale el mensaje antes de ejecutar estas lineas.
Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument()
CrReport = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
CrReport.Load("\CrystalReport3.rpt")
CrReport.SetDataSource(dtDatos)

CrystalReportViewer1.ReportSource = CrReport
Gracias de antemano por la ayuda.
Saludos,

Unknown dijo...

Gracias por proporcionar el articulo. muy bueno. ya solucione mi problema el cual "no podia cargar el informe".
la ruta del rpt habia que especificarla correctamente.

Saludos,

moncho dijo...

saludos, despues de unos problemitas pude desplegar el reporte, pero solo me muestra un dato, meti el dtdatos a un datagrid y ahi si me muestra todos los datos, pero en el reporte solo me muestra 1, porque sera?

Unknown dijo...

Hola,

Los datos lso colocastes en las secciones del cuerpo del reporte?

Si tu le pasas el DataTable de los datos al reporte no tiene problema los despliega en el cuerpo de acuerdo al numero de registros que le pases en el datatble.

Saludos,

moncho dijo...

gracias por responder, asi es los puse en la seccion 3 del reporte que se llama detalles, agregue el nombre de todas las columnas en la seccion 2 que es el encabezado de pagina y tampoco me lo muestra, solo me muestra el encabezado de informe y un solo registro por hoja, me acabo de dar cuenta que me genera un reporte de 44 paginas y en cada pagina solo muestra un registro, osea me muestra 44 registros cuando en realidad son mas de 1000, cabe mencionar que estoy usando visual studio 2010 con su sp1 y sqlserver 2012

moncho dijo...

lo logre, es raro, lo que pasa es que en principio no me cargaba el informe, leyendo note que habia que meter el CrystalReport2.rpt en la carpeta bin\debug del proyecto, cuando hice eso ya me cargo el reporte, pero despues de eso le hice algunas modificaciones al reporte desde visual para corregirlo, pero el que estaba en bin\debug nunca lo modifique, ahora que le meti el nuevo reporte ya modificado me funciono de maravilla, lo que pasa es el que habia metido al principio no estaba actualizado y simpre me lo cargaga mal, esta un poco raro y engorrozo en asunto, pero bueno lo importante es que ya funciono, muchas gracias

Cristian Torres dijo...

Muy buen articulo solo 2 consultas amigo.

1- Si quisiera filtrar los datos del reporte lo aria como se hace normalmente con el command
Dim cmd As New SqlCommand("Selec * from tabla where campo=@cam", conn)
cmd.Parameters.AddWithValue("@cam", textbox.text)

2- Si para el reporte se necesitan 2 o mas tablas en el dataset tendría que crear por cada tabla un datatable y si las tablas estan relacionadas tendría que crear las relaciones también?

Cristian Torres dijo...

Muy buen articulo solo 2 consultas amigo.

1- Si quisiera filtrar los datos del reporte lo aria como se hace normalmente con el command
Dim cmd As New SqlCommand("Selec * from tabla where campo=@cam", conn)
cmd.Parameters.AddWithValue("@cam", textbox.text)

2- Si para el reporte se necesitan 2 o mas tablas en el dataset tendría que crear por cada tabla un datatable y si las tablas estan relacionadas tendría que crear las relaciones también?

Unknown dijo...

Hola Cristian

1. Si, de esa manera puedes filtrar el resultado del reporte

2. Si., debes colocar varias datatable en 1 dataset, las relaciones no son necesarias pues tu las haces por la consulta o por integridad de la base de datos.

Saludos,

Unknown dijo...
Este comentario ha sido eliminado por el autor.
Unknown dijo...

Muy interesante el tutorial, el problema es cuando quiero mostrar un reporte tipo maestro detalle con dos tablas, la cabecera es una tabla y su detalle es otra tabla, y estas dos tablas las tengo en un dataset no tipado, cuando paso este dataset como datasource para mi objeto.rpt en tiempo de ejecucion me pide usuario y contraseña para la tabla de mi dataset tipado y no me muestra nada en el reporte, como podria hacer para solucionar esto?? le agradecería muchísimo que me brinde una ayuda

Unknown dijo...

Hola Gallen

Eso es una propiedad de ReportViewer, solo debes colocarla a false, creo que se llama Autenticate o algo parecido.

Saludos,

Unknown dijo...

Hola Roberto, muchas gracias por tu respuesta pero no encuentro ninguna propiedad parecida en mi objeto CristalReportViewer, cuando establezco como datasource a una de las tablas de mi dataset(en vez del dataset) no me pide autenticación y si me muestra el reporte pero solo la parte correspondiente a la tabla(si es la primera tabla me muestra el maestro si es la segunda me muestra el detalle) pero yo necesito que el reporte me muestre ambos. OJO: mi dataset tipado consta de una sola tabla en donde he agregado todos los campos que quiero agregar a mi reporte(mi dataset no tipado es el que contiene las dos tablas que me devuelve un stored procedure). De antemano te agradezco tu ayuda.

Norimaki88 dijo...

EXCELENTE POST, SOLO TENGO UN INCONVENIENTE ESTOY TRATANDO DE ADAPTAR UN Store Procedure en lugar del StringBuilder..
pero no logro hacerlo por favor necesito ayuda... graciass

beto dijo...

hola robert me podrias ayudar me indica que falta instanciar un objeto al igual que a Juan Manuel

Logon failed. Details: crdb_adoplus : Object reference not set to an instance of an object. Error in File C:\DOCUME~1\jmanuel\LOCALS~1\Temp\CrystalReport3 {75A6E5BB-8816-4F32-95BE-56C413245172}.rpt: Unable to connect: incorrect log on parameters.

mi código es:

Partial Class trailer
Inherits System.Web.UI.Page
'Public Conn As String = ConfigurationManager.ConnectionStrings("donaldsonConnectionString").ConnectionString
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

Dim oCnn As New OleDbConnection ' Objeto de conexion a la base de datos
Dim daDatos As New OleDbDataAdapter ' Objeto Adaptador para leer datos de la Base de datos
Dim cmdExec As New OleDbCommand ' objeto comando para ejecutar sentencias sql
Dim dtDatos As New DataTable ' datatable para recibir los datos de la base de datos
Dim sbQuery As New StringBuilder ' StringBuilder para armar cadenas
'Dim cmdExec As New
Try
oCnn.ConnectionString = "Data Source=sfodwdev01;Initial Catalog=OracleRPT;User ID=webDev;Password=web$QL2008"
oCnn.Open()
cmdExec = oCnn.CreateCommand
cmdExec.Connection = oCnn
sbQuery.Append("SELECT * ")
sbQuery.Append("FROM trailer")

cmdExec.CommandText = sbQuery.ToString
daDatos = New OleDbDataAdapter(cmdExec)
daDatos.Fill(dtDatos)

Dim reporte As New CrystalDecisions.CrystalReports.Engine.ReportDocument
' Asigno el reporte
reporte = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
reporte.Load(Context.Server.MapPath("trailer.rpt"))
reporte.SetDataSource(dtDatos)

CrystalReportViewer1.ReportSource = reporte
Catch ex As Exception
'MessageBox.Show("excepcion: " & ex.Message, "Mostrando Reporte")
End Try

me podrías ayudar a identificar que estoy haciendo mal por favor
de antemano muchas gracias

beto dijo...

hola robert me podrias ayudar me indica que falta instanciar un objeto al igual que a Juan Manuel

Logon failed. Details: crdb_adoplus : Object reference not set to an instance of an object. Error in File C:\DOCUME~1\jmanuel\LOCALS~1\Temp\CrystalReport3 {75A6E5BB-8816-4F32-95BE-56C413245172}.rpt: Unable to connect: incorrect log on parameters.

mi código es:

Partial Class trailer
Inherits System.Web.UI.Page
'Public Conn As String = ConfigurationManager.ConnectionStrings("donaldsonConnectionString").ConnectionString
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

Dim oCnn As New OleDbConnection ' Objeto de conexion a la base de datos
Dim daDatos As New OleDbDataAdapter ' Objeto Adaptador para leer datos de la Base de datos
Dim cmdExec As New OleDbCommand ' objeto comando para ejecutar sentencias sql
Dim dtDatos As New DataTable ' datatable para recibir los datos de la base de datos
Dim sbQuery As New StringBuilder ' StringBuilder para armar cadenas
'Dim cmdExec As New
Try
oCnn.ConnectionString = "Data Source=sfodwdev01;Initial Catalog=OracleRPT;User ID=webDev;Password=web$QL2008"
oCnn.Open()
cmdExec = oCnn.CreateCommand
cmdExec.Connection = oCnn
sbQuery.Append("SELECT * ")
sbQuery.Append("FROM trailer")

cmdExec.CommandText = sbQuery.ToString
daDatos = New OleDbDataAdapter(cmdExec)
daDatos.Fill(dtDatos)

Dim reporte As New CrystalDecisions.CrystalReports.Engine.ReportDocument
' Asigno el reporte
reporte = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
reporte.Load(Context.Server.MapPath("trailer.rpt"))
reporte.SetDataSource(dtDatos)

CrystalReportViewer1.ReportSource = reporte
Catch ex As Exception
'MessageBox.Show("excepcion: " & ex.Message, "Mostrando Reporte")
End Try

me podrías ayudar a identificar que estoy haciendo mal por favor
de antemano muchas gracias

Unknown dijo...

hola

verificaste que la ruta del reportes es correcta?

Y si hay datos en el dataset que le pasas al reporte?

Saludos,

beto dijo...

Hola Robert la ruta esta bien lo que observe es que al momento de querer abrir la conexión es donde marca el error pero los datos de la conexión están correctos.

Unknown dijo...

Hola beto

La cadena de conexión en el web.config o en el App.config, si la esta devolviendo? porque si el connectionstring del objeto Connection es nulo da ese error.

Saludos,

beto dijo...

Hola Robert.
fijate que al examinar el error en la parte de la cena de conexión me marca un nulo (a esta la invoco desde el web.config) la instrucción que uso es:

Public Conn As String = ConfigurationManager.ConnectionStrings("donaldsonConnectionString").ConnectionString

Unknown dijo...

Hola

verifica si en el web.config el nombre de la entrada en la sección esta correcta y se llama igual a como la tienes en el código.

Saludos,

Anónimo dijo...

No se que tan viejo es el post esto funcionaria para aplicacion de escritroio en c#?

Unknown dijo...

Hola

El post funciona para web y para Windows.

Saludos,

Anónimo dijo...

Peculiar article, exactly what I needed.
Also see my page: free iphone 5

Nolberto dijo...

hola, tengo una clase en la cual hay una funcion que me devuelve un datatable,
Public Function distrito() As DataTable
Try
conectado()
cmd = New NpgsqlCommand("func_dist")
cmd.CommandType = CommandType.StoredProcedure
cmd.Connection = cnn
If cmd.ExecuteNonQuery Then
Dim dt As New DataTable
Dim da As New NpgsqlDataAdapter(cmd)
da.Fill(dt)
Return dt
Else
Return Nothing
End If
Catch ex As Exception
MsgBox(ex.Message)
Finally
desconectado()
End Try
Return Nothing
End Function

en el boton imprimir colo este codigo.

Try
Dim func As New funciones

Dim ds As New dsdistrito
Dim dt As New DataTable
dt = func.distrito


Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument

CrReport = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
CrReport.Load(Application.StartupPath & "\reportes\rptdistrito.rpt")

CrReport.SetDataSource(dt)

CrystalReportViewer1.ReportSource = CrReport
Catch ex As Exception
MessageBox.Show("excepcion: " & ex.Message, "Mostrando Reporte")
End Try

pero me da error, que estoy haciendo mal. el datatable del xsd tiene los campos que devuelve la funcion en el datatable.

Unknown dijo...

Hola Nolberto,

No indicas cual es el error, si es que no encuentra el reporte debes verificar la ruta que armas para indicarf donde se encuentra el .rpt, y verificar si realmente existe y el .rpt se encuentra en esa ruta, por lo general debes en las propiedades del rpt indicar que se copie al momento de compilar, es posible que no se este copiando el .rpt a la ruta.

Saludos,

«Más antiguas ‹Antiguas   1 – 200 de 219   Más recientes› Más nuevas»