Esta guía, incluyendo código fuente, muestra como utilizar los nuevos componentes de Crystal Report en Visual Studio 2005, para mostrar reportes. Para el caso de este ejemplo utilizo una base de datos SQL Server 2000 (funciona igual con SQL 2005), he creado un reporte que esta basado en un Stored Procedure, que espera recibir @CadWhere y @CadSubQuery. Adicionalmente el reporte de Crystal espera recibir 2 parámetros adicionales, para completar los titulos, estos parámetros se llaman: Mensaje (Titulo1) y EmpresaOEM (Titulo 2), En crystal habrán sido creados como ?Mensaje y ?EmpresaOEM.
Adicionalmente el código fuente debe permitirme cambiar mis reportes en tiempo de ejecución, asi como poder cambiar el Stored Procedure fuente del .rpt, ya que tengo un aplicación Web, con un Menú amplio de reportes y debo poder mostrar el que el usuario seleccione.
Para resolver todo esto, utilizaremos los controles CrystalReportSource, SqlDataSource y CrystalReportViewer, así:
1. Cree la pagina conectenedora asp.net y crea allí los controles: CrystalReportSource, SqlDataSource y CrystalReportViewer.
2. Ahora pasaremos los parámetros al Stored Procedure, para lo que utilizaremos el control SqlDataSource. Esta es la signatura del Procedure
PROCEDURE dbo.ViewPpal (@CadWhere nvarchar(1000), @CadSubQuery nvarchar(1000))
'Aqui está nuestro código en Visual Basic, ASP.NET.
Me.SqlDataSource1.ConnectionString = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=BdDemo;Data Source=LOCALHOST;
Me.SqlDataSource1.SelectCommand = "ViewPpal" 'Nombre del stored procedure
Me.SqlDataSource1.SelectParameters.Clear()
Me.SqlDataSource1.SelectParameters.Add("CadWhere","Valor del primer parámetro")
Me.SqlDataSource1.SelectParameters.Add("CadSubQuery","Valor del segundo parámetro")
Me.SqlDataSource1.DataBind()
3. Ahora pasaremos los 2 parámetros al reporte de Crystal, estos parámetros son ?Mensaje y ?EmpresaOEM
Dim Source As New CrystalDecisions.Web.DataSourceRef CrystalReportSource1.Report.FileName = "NombreReporte.rpt"
Source.TableName = "ViewPpal" 'Nombre del stored procedure
Source.DataSourceID = "SqlDataSource1" 'Aqui asocio el SqlDatasource. CrystalSource.Report.DataSources.Add(Source)
'Ahora crea los parámetros para el reporte.
Param1 = New CrystalDecisions.Web.Parameter
Param1.Name = "Mensaje"
Param1.DefaultValue = "Titulo del reporte"
CrystalReportSource1.Report.Parameters.Add(Param1)
Param1 = New CrystalDecisions.Web.Parameter
Param1.Name = "EmpresaOEM"
Param1.DefaultValue = "Empresa Mauricio"
CrystalReportSource1.Report.Parameters.Add(Param1)
'Finalmente asocio al CrystalReportViewer el control: CrystalReportSource1
Me.CrystalReportViewer1.ReportSourceID = "CrystalReportSource1" CrystalReportSource1.DataBind()
Listo, ahora ya puede ejecutar su reporte. Algunas NOTAS IMPORTANTES:
1. Control CrystalReportSource: Aunque puede en tiempo de diseño, definirse el DataSource y la colección de parámetros del reporte, para efectos de producción es mejor que estos 2 parámetros se creen por código fuente, en mi caso al ejecutarlo me aparece un mensaje de error al intentar sacar un reporte con un Store Procedure diferente al que esta por defecto en tiempo de diseño definido en CrystalReportDatasource.FileName
2. OJO: A los Stored procedures que esperan parámetros, no debe pasarse una cadena vacia "" ni en el Wizard ni en el código fuente, sino sale un mensaje de error. Cuando no se quieren pasar datos, debe pasársele un espacio en blanco " ".
3. Acerca de SQL Server: Con esta versión de aplicación puede, cambiar sin problemas de SQL 2000 a SQL 2005, es decir si tiene la misma base de datos en las 2 versiones, lo que me permite configurar mi aplicación sin dejarla en Hard Code a un solo motor. Igualmente puede colocarse la página Web en un sitio y la base de datos en cualquier otro computador, simplemente debe ajustar su cadena de conexión de SQL en el web.config de su aplicación y este código fuente le funcionará perfectamente. Ya lo he probado.
Si desea descargar los merge Modules de Crystal Report, haga clic aquí.
Si le ha sido útil, por deje su comentario.
Especialista en construcción de software. (Universidad de los Andes)
Bienvenidos, Desarrollo de software a la medida.
Ofrezco mi amplia experiencia y conocimiento para desarrollar soluciones de software: Windows y Web utilizando: Visual Basic .net, ASP.NET, SQL Server 2000/2005/2008, Windows Mobile, Android-Java, Crystal report, Xml, Vb 6.0, Google Maps, API Google, AJAX, etc.
Soy ingeniero de sistemas, director de varios proyectos exitosos de software, utilización de Uml y modelado orientado a objetos, así como Auditor interno certificado ISO 9001:2000. Desarrollo como Freelance para empresas y particulares. Si desea que desarolle su aplicación, con mucho gusto estaré atento para apoyarle. m.riveros130@egresados.uniandes.edu.co
Soy ingeniero de sistemas, director de varios proyectos exitosos de software, utilización de Uml y modelado orientado a objetos, así como Auditor interno certificado ISO 9001:2000. Desarrollo como Freelance para empresas y particulares. Si desea que desarolle su aplicación, con mucho gusto estaré atento para apoyarle. m.riveros130@egresados.uniandes.edu.co
martes 28 de julio de 2009
Suscribirse a:
Enviar comentarios (Atom)
Datos personales
- Mauricio.
- Bogotá, Colombia
- Especialista en Construcción de software. Universidad de los ANDES. m.riveros130@egresados.uniandes.edu.co
10 comentarios:
Muy interesante y se agradece..., todo me parece que me estaría funcionando lo que tu explicas, pero al momento de ejecutar me solicita los parametros del Procedure; osea el procedure necesita @Mes, @ano, etc y esos parametros se los pasos en los parametros de datasourse1 y a parte me solicita la conexión..., me da que tengo problemas con mi reporte que genere??
De igual forma se agradecé
1. Los parámetros a los Stored Procedures, debe pasarlos así:
Me.SqlDataSource1.SelectParameters.Add("Mes","10")
Me.SqlDataSource1.SelectParameters.Add("ano","2009")
No le coloque los simbolos de @.
2.La cadena de conexión se asigna en:
Me.SqlDataSource1.ConnectionString = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=BdDemo;Data Source=LOCALHOST;"
3. Sugiero que revise nuevamente todos los pasos, que indico para el paso de parámetros, de pronto algún detalle esta pasando por alto. Esta es una excelente forma de manejar reports con Procedures.
los valores se los estoy pasando en en variables session; session("MES")
de esta forma:
With Me.SqlDataSource1
.ConnectionString = ca.STRconn
.SelectCommand = "PERSPECTIVA_CANON_REPORTE_PAPELETA_TOTAL"
.SelectParameters.Clear()
.SelectParameters.Add("Mes", Session("Mes_Report"))
.SelectParameters.Add("Ano", Session("Ano_Report"))
.SelectParameters.Add("Empid", Session("Empresa"))
.SelectParameters.Add("Banca", Session("Banca"))
.SelectParameters.Add("Estado", "L")
.DataBind()
End With
Ahora la conexión que debemos realizar en la empresa es a través de Web.Service, por ende el string de conexión no lo puedo manipular. Y me pareciera como si el CrystalReportSource no pescara al SqlDataSource ya que cuando ejecuto, lo que me muestra es una pagina prevía diciendo que el procedure necesita los parametros y me los muestra los @Mes y texbox me da la opción de un check para dejarlo en blanco, si lleno los campos manualmente, luego me muestra una venta solicitando me la conexión a la base de datos con el SA y un cuadro para colocar la clave, si paso la clave finalemente me muestra el informe, por eso me da que no asocia el SqlDataSource, el cual según los pasos lo hice:
With sourse
.DataSourceID = "SqlDataSource1"
End With
Me.CrystalReportSource1.Report.DataSources.Add(sourse)
... a parte cuando coloco el sourse.Tablaname ="Procedure nombre" me da un error diciendo que la tabla no existe ??
Bueno te agradezco el hecho que me respondieras.
Sldos. y Gracias
Claro el error esta cuando hace:
sourse.Tablename ="NombreProcedure"
A veces alli se debe colocar el NombreProcedure;1, ejemplo:
sourse.Tablename="PERSPECTIVA_CANON_REPORTE_PAPELETA_TOTAL;1"
Para saber si debe o no adicionar ;1 haga:
1. Abra el reporte con su Crystal Report
2. Seleccione del menú Database la opcion 'Set Datasource location...'
3. Alli debajo de Propiedades se muestra el nombre de su Procedure con o sin ; (Ver imágen: http://dybnua.blu.livefilestore.com/y1pk3p3QXqz8Za9P0_rGNkU4CeZX7u143oo6Iw7Xr3GLVZZEAGJiPNg-ihBe39xCVQGy0Q3QdawLE3E_IKyPxR0Eubqwaa7nhly/VerNombreTablaCrystal.PNG)
Ese es nombre que debe establecer en la propiedad sourse.Tablename.
Mauricio se agradece tu ayuda, ahora me esta funcionando.
Suerte
Daniel
Es un ejemplo interesante.
Por mi parte necesito ayuda con lo siguiente:
tengo una base de datos en MySQL, una aplicación con asp.net y reportes con Crystal reports. Los reportes están muy bien, excepto cuando lo subo a la red interna, o sea, desde otra máquina puedo acceder a la aplicación y a la base de datos, pero cuando quiero ver los reportes me sale el siguiente error:
La conexión no es posible. Detalles: IM002:[Microsoft][Administrador de controladores ODBC] No se encuentra el nombre del origen de datos y no se especificó ningún controlador predeterminado Error en archivo C:\.......\rcostos6 {5DFC7431-9C86-4C85-A520-56DD59121E5A}.rpt: No se puede conectar: parámetros de conexión incorrectos.
ya probé opciones con:
'CrystalReportSource1.ReportDocument.DataSourceConn(ections.Item(0).SetConnection("", "", False))
'CrystalReportSource1.ReportDocument.DataSourceConn(ections.Item(0).SetLogon("UId", "PW"))
'CrystalReportSource1.ReportDocument.SetDatabaseLogon("USER","PASSWORD","SERVIDOR","Base de datos")
por favor necesito saber donde falla.
Gracias por la respuesta.
Hola... Tania Conde, yo primero buscaríaa la fuente del error, le suguiero lo siguiente:
1. Ejecuta los reportes .rpt, desde la máquina de donde no le funcionan, pero abriendo solo los archivos .rpt, para validar que el usuario y password de conexion a MySQL si le funcionan, no sea que este utilizando un usuario MySQL con permisos para conexion en el PC local y no desde un PC remoto.
2. Propar el codigo de la aplicación: Si es posible hacer un reporte de ejemplo pero utilizando Microsoft SQL Server, desde la máquina donde originalmente esta MySQL, luego mueve ese reporte y ejecuta la aplicacion en la otra maquina donde le funciona... si tampoco funciona con MSQL Server, sigfinica que es un error del codigo fuente, pero si le funciona perfecto... es un problema Crystal - MySQL.
Muchas gracias por la respuesta.
Bueno, todo anda bien, inclusive (por un momento) mostraba los reportes que tengo después de haber hecho y rehecho la conexión entre asp.net-mysql-crystalreports mediante ODBC... :D francamente, probé de varias formas esa conexión y cuando funcionó, intenté repetirla con los demás reportes... y no lo logré, volví al reporte que si se mostraba, lo revisé y nuevamente está sin conectarse...
No termino de entender esta conexión. Todo está bien y funciona, simplemente necesito entender como funciona la conexión entre: asp.net 2008, MySQL, CrystalReports con ODBC...
Gracias por su atención.
Muchas gracias por la respuesta.
Bueno, todo anda bien, inclusive (por un momento) mostraba los reportes que tengo después de haber hecho y rehecho la conexión entre asp.net-mysql-crystalreports mediante ODBC... :D francamente, probé de varias formas esa conexión y cuando funcionó, intenté repetirla con los demás reportes... y no lo logré, volví al reporte que si se mostraba, lo revisé y nuevamente está sin conectarse...
No termino de entender esta conexión. Todo está bien y funciona, simplemente necesito entender como funciona la conexión entre: asp.net 2008, MySQL, CrystalReports con ODBC...
Gracias por su atención.
Saludos Amigo, Gracias por el aporte, Pero el problema que yo tengo es que no le hace caso a la conexion que le indico, y siempre me esta pidiendo que indique el usuario y password. Gracias.
Publicar un comentario en la entrada