La mayoría de las veces que trabajamos con Visual Basic .Net y Crystal Report, solemos conectarnos a SQL Server u Oracle como fuente de datos, debido a que tienen integración con el IDE de Visual Studio, para facilitar la creación de los mismos.
Cuando hablamos de motores como PostgreSQL, MySQL, Firebird, Teradata y otros, no tenemos la integración del IDE con el servidor de base de datos, esto hace que no podamos crear tan sencillamente los reportes como los hacemos como con los otros motores, pero no lo hace imposible, sólo se debe seguir unos pasos distintos, que también sirve para los 2 primeros motores mencionados anteriormente.
Hoy haremos un ejemplo sencillo para mostrar un reporte con VB. Net y Crystal Report, haciendo la consulta de una tabla sencilla, devuelta desde el ResultSet de una función de PostgreSQL.
Creamos la BD con el siguiente Script:
1 2 3 4 5 | CREATE DATABASE "DevTroce" WITH OWNER = "postgres" ENCODING = 'UTF8' TEMPLATE = "postgres" TABLESPACE = pg_default; |
Con lo siguiente creariamos una tabla de usuarios por así decirlo a modo de ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | CREATE TABLE public."Usuarios" ( "CodUsuario" smallint NOT NULL PRIMARY KEY, "Nombres" varchar(30) NOT NULL, "Apellidos" varchar(30) NOT NULL, "WebFavorita" varchar(30), "Telefono" varchar(30) ) WITH ( OIDS = FALSE ) TABLESPACE pg_default; CREATE INDEX "IX_Usuarios_Nombres_Apellidos" ON public."Usuarios" ("Nombres", "Apellidos"); ALTER TABLE public."Usuarios" OWNER TO postgres; COMMENT ON TABLE public."Usuarios" IS 'Tabla de ejemplo para devtroce.com'; |
Aquí van los datos de ejemplos que usaré
1 2 3 4 5 6 7 | INSERT INTO "Usuarios" ("CodUsuario", "Nombres", "Apellidos", "WebFavorita", "Telefono") VALUES (1, 'Javier', 'Sosa', 'www.devtroce.com', '476323'), (2, 'Mariela', 'Schum', 'www.facebook.com', '43083-0'), (3, 'Jose', 'Martinez', NULL, '4837612'), (4, 'Mirella', 'Troche', 'www.orkut.com', '865558'), (5, 'Josefina ', 'Mongelos', 'www.google.com', ''), (6, 'Mirna ', 'Rivas', 'www.devtroce.com', '4350098'); |
La función (Stored Procedure en otros motores) que nos alimentará el reporte va así:
1 2 3 4 5 6 7 8 9 10 11 12 | CREATE OR REPLACE FUNCTION public."slc_usuarios"() RETURNS SETOF public."Usuarios" AS $$ select * from "Usuarios"; $$ LANGUAGE 'sql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER; ALTER FUNCTION public."Slc_Usuarios"() OWNER TO postgres; |
Ahora vamos a Visual Studio, creamos nuestro proyecto de Windows Form, agregamos una carpeta al proyecto llamada DataSet, dentro del cual agregaremos un Dataset o Conjunto de datos, así como muestra en la imagen, se llamará dsUsuarios.xsd
Una vez creado el dataset, en la superficie gris, hacemos click derecho -> Agregar -> DataTable. Al mismo le llamaremos dtUsuarios, sobre el cual volvemos a hacer click derecho -> Agregar -> Columna. Y vamos agregando uno a uno las columna que tendra la tabla igual a la BD, debemos recordar asignar correctamente los tipos de datos en las propiedades de las columnas del DataTable, quedaría así:
Lo siguiente es agregar la referencia de la .dll para conectarnos al PostgreSQL, lo haremos con el driver Npgsql, que es el proveedor de datos de PG para .net oficial de la comunidad. Este driver lo pueden descargar de aquí si no lo tienen.
Para agregarlo damos click derecho sobre el proyecto -> Agregar Referencia -> Examinar -> Seleccionamos estos archivos: Npgsql.dll, policy.2.0.Npgsql.dll, Mono.Security.dll, Aceptar.
Lo siguiente por hacer es agregar el Reporte de Crystal Report, para ello creamos una nueva carpeta llamada Reportes, y damos click derecho sobre ella -> Agregar -> Nuevo Elemento -> Crystal Reports. Cuando Aparezca el Wizard le asignamos reporte en blanco.
Una vez agregado y en el modo de diseño, sobre el explorador de campos, hacemos click derecho -> Asistente de Base de Datos -> Datos del Proyecto ->ADO.NET Datasets ->dtUsuarios, aquí elegimos nuestro dataset anteriormente creado, una vez hecho lo podremos ver en el explorador.
Una vez todo agregado al reporte quedaría así, deben entender que el diseño es minimalista sólo a modo de ejemplo, supongo que uds harán un diseño mucho mas bueno
Nos queda por agregar el contenedor de Reportes, eso logramos creando un formulario nuevo, llamado frmContenedorDeReportes, y dentro de él arrastramos el objeto CrystalReportViewer, el cual puede llamarse crvVisorReporte.
Código que necesitamos escribir es el siguiente, todo irá dentro del formulario principal, donde tenemos el logo y el boton que se verán en la imágen final para que puedan copiarlo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | Public Class frmPgReport 'Declarar Objeto de Conexion Dim cnConexion As Npgsql.NpgsqlConnection 'Objeto Comando Dim cmComando As Npgsql.NpgsqlCommand 'Declarar Variable para almacenar String de Conexion a la BD Dim ConnString As New System.Text.StringBuilder("") 'Construi la cadena de Conexion Private Sub CrearCadenaConexion() ConnString.Append("Host=;") ConnString.Append("Database=;") ConnString.Append("User ID=;") ConnString.Append("Password=;") ConnString.Append("Port=5432;") ConnString.Replace("", "127.0.0.1") ConnString.Replace("", "DevTroce") ConnString.Replace("", "postgres") ConnString.Replace("", "postgres") End Sub Private Sub CargarUsuarios() Try Me.Cursor = Cursors.WaitCursor 'Armar la cadena CrearCadenaConexion() 'Instanciar el objeto de conexion cnConexion = New Npgsql.NpgsqlConnection(Convert.ToString(ConnString)) 'instanciar comando cmComando = New Npgsql.NpgsqlCommand 'asignar comando With cmComando .Connection = cnConexion 'nombre de function a invocar .CommandText = "slc_usuarios" 'determinar el tipo de comando .CommandType = CommandType.StoredProcedure 'establezco timeout ilimitado xq estos querys tardar varios minutos en responder .CommandTimeout = 0 End With 'instancia del dataset .XSD -- en el namespace DataSet Using dsUsuarios As New dsUsuarios() 'Instanciar DataAdapter y asignacion de objeto command Using daUsuarios As New Npgsql.NpgsqlDataAdapter() With {.SelectCommand = cmComando} 'Abrir la conexion a la BD cnConexion.Open() 'Cargar Adaptador de datos daUsuarios.Fill(dsUsuarios, "dtUsuarios") 'Instancia del Reporte -- namespace CrystalReport Using rptUsuarios As New rptUsuarios() 'asignar dataset al reporte rptUsuarios.SetDataSource(dsUsuarios) 'instancia del contenedor de reportes Using frmContenedorDeReportes As New frmContenedorDeReportes() 'asignar reporte al contenedor frmContenedorDeReportes.crvVisorReporte.ReportSource = rptUsuarios 'mostrar Reporte frmContenedorDeReportes.ShowDialog() End Using 'destruir contenedor End Using 'destruir reporte End Using ' destruir dataadapter End Using 'destruir dataset Catch ex As Exception Throw ex Finally Me.Cursor = Cursors.Default 'cerrar y destruir la conexion cnConexion.Close() cnConexion.Dispose() End Try End Sub 'end CargarUsuarios Private Sub btnUsuarios_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUsuarios.Click Try CargarUsuarios() Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub End Class |
La conexión a la BD pueden ver mejores maneras de hacerlo, ésta es sólo una y bastante corta para no abordar mucho ese tema.
Articulos Relacionados:















en
en
en
Gracias por este material que me ha sido de mucha utilidad
Muchas gracias por fin una luz de los reportes con CR – VB .Net y PG, necesito ayuda por favor, estoy programando con estas herramientas, ya realice mi data reader, conectandomen a posftgresql y creo un selec con varias tablas, como hago la previsualizacion y la impresion del reportes el codigo que utilizo es:
para la conexion la funcion:
Public Shared Function get_data_reader(ByVal csql As String) As NpgsqlDataReader
‘Este método, devuelve un Objeto DataReader
Dim oconn As NpgsqlConnection
Dim ocmd As NpgsqlCommand
Dim odr As NpgsqlDataReader
oconn = obtener_conexion()
ocmd = obtener_comando(oconn)
ocmd.CommandText = csql
odr = ocmd.ExecuteReader(CommandBehavior.CloseConnection)
Return odr
End Function
Para llebar el data reader
csql = “select a.*, b.capacidad from ” + database.obtener_esquema + “.tb_programacion a ” _
+ “left join ” + database.obtener_esquema + “.tb_vehiculos b on a.placa = b.placa ”
odr = database.get_data_reader(csql)
Esto me funciona pero hasta ahy llego, estoy tratando de realizar la impresion con tu ejemplo, te agradeceria tu ayuda.
Mil Gracias
excelente trabajo. es lo que necesitaba. solo me queda una duda, como puedo por codigo modificar el valor de una etiqueta o formula que esta dentro de un reprote de crystal. para paramentros esto encontre y me funciona, pero al ser parametro y usar el drill me los vuelve a pedir entonces deseo simplemente pasarle el valor a una etiqueta o formula sencilla
Dim parameterField As ParameterField
parameterField = reporte.ParameterFields(“Parameter1″)
parameterField.CurrentValues.AddValue(
Javier, por ejemplo, para modificar el Titulo del reporte puedes usar la siguiente linea:
Report.SummaryInfo.ReportTitle = “Título del Reporte”
o para modificar una formula:
Report.RecordSelectionFormula = “{suministrados.nombre_entidad}=’Hidalgo’”
Private Sub Test()
Dim Report As New ReportDocument
Dim LstrReporte As String, txt_generar As String
LstrReporte = My.Application.Info.DirectoryPath
LstrReporte = LstrReporte & “ReporteTest.rpt”
txt_generar = “texto”
Report.Load(LstrReporte)
Report.SummaryInfo.ReportTitle = “Título del Reporte”
Report.RecordSelectionFormula = “{suministrados.nombre_entidad}=’” & txt_generar & “‘”
CrystalReportViewer1.ShowGroupTreeButton = False
CrystalReportViewer1.ReportSource = Report
CrystalReportViewer1.Refresh()
End Sub
Nos cuentas como te fue.
Videos de Crystal Reports y VS 2010
el ejemplo me funciona bien, pero no se como hacer si utiliza varias tablas, creo que mi problema esta en el momento de llenar el dataset.
Puedes agregar varias tablas al DataSet, un ejemplo de como agregar una Tabla es con el código siguiente:
dsUsuarios.Tables.Add(otroDataTable)
otroDataTable es una tabla que ya esta creada, solo se agrega al DataSet.
ya cree todas las tablas, es en esta parte lo que no se que poner
daINELEC.Fill(dsINELEC, “tipo_insumo”), ya que no es solo una tabla son varias
Prueba con una función similar a la siguiente:
Public Function agregarTabla_Dataset(ByVal PsNomTabla As String) As Boolean
Dim selectCMD As OleDbCommand, agregarTB_DA As OleDb.OleDbDataAdapter
Try
selectCMD = New OleDbCommand(“SELECT * FROM [" & PsNomTabla & "]“, objConn)
agregarTB_DA = New OleDbDataAdapter
agregarTB_DA.SelectCommand = selectCMD
agregarTB_DA.Fill(dataSetGeneral, PsNomTabla)
Catch ex As Exception
Throw New Exception(“Error: (” & PsNomTabla & “). ” & ex.Message)
Return False
End Try
Return True
End Function
el ejemplo me funciona bien, pero no se como hacer si utiliza varias tablas, creo que mi problema esta en el momento de llenar el dataset
Y como hago cuando deseo pasarle parametros desde visual.????? me podrian facilitar un claro ejemplo por favor se los agradeceria..
Hola Rossana! que bueno ver a una paraguaya
Feliz Bicentenario!!
Si usarás una función como esta:
Que recibe como parametro de entrada el codigo del usuario, podés enviarle desde VB lo siguiente:
Con pasarle parametros desde alguna pantalla de tu sistema a los query’s de la bd ya lo resolverias..
Muchas gracias por tu ayuda! voy a probar..
Otra consulta, como sería cuando quiero mostrar en el reporte un dato que está en un texbox del formulario? Ej. Quiero mostrar el usuario que actualmente va a imprimir el reporte, tengo ese dato pero como le paso directo al reporte?.
Saludos
Rossana
El tutorial esta muy bueno, y eso de los DataSet mejor.
En la siguiente liga encontre algunos videos de como crear reportes usando Crystal Reports y Visual Studio 2010.
La BD esta en Access, pero puede servir para aquellos que empiezan a utilizar CR. Algo basico espero que sean utiles.
Esta es la liga:
Vayan a la carpeta Publico\CrystalReports
@william Crystal Report para visual studio 2010, esta en beta la version integrada, no asi la separada, puedes usarlo por separado o descargar gratuitamente la beta desde aqui http://www.businessobjects.com/jump/xi/crvs2010/d…
Hola esta bueno el tutorial pero el problema q tengo es q indican q apartir de la version 2010 de Visual Studio Crystal Report no viene adjunto y q se tiene q descargarlo por separado e hize eso pero no puedo integrarlo con Visual Studio no se si alguien tiene algun link o guia donde puedo consultar para integrar Crystal Report en Visual Studio 2010.
saludos y gracias
hola!!
un grupo de compañeros y yo estamos realizando un sistema que lea la huella digital en un scanner el problema es tiene que llevar reportes y
de eso la verdad no entendemos nada.
no se si me podrian ayudar con el codigo….
xfisssss!!
gracias
Hola @m@nd@, personalmente he trabajado con productos de NeuroTechnology para manipular huellas digitales, específicamente con Verifinger, puedes encontrar su producto aquí: http://www.neurotechnology.com/verifinger.html Puedes probar con ellos..
Se más especifica por favor, en que necesitas ayuda? en mostrar un reporte? en capturar la huella? en otra cosa?
Muy bueno GeekZero, pero tengo un problema.
Yo estoy desarrollando sobre vb.net 2005 y lo tengo subido a un hosting alquilado, luego de errores diversos por que no tenian subidas las dll del crystal (y ponerlas en el bin) me encuento con el siguiente error:
"An error has occurred while attempting to load the Crystal Reports runtime."
"Either the Crystal Reports registry key permissions are insufficient or the Crystal Reports runtime is not installed correctly."
"Please install the appropriate Crystal Reports redistributable (CRRedist*.msi) containing the correct version of the Crystal Reports runtime (x86, x64, or Itanium) required. Please go to http://www.businessobjects.com/support for more information. "
Y segun lo que lei en los foros, hay que instalar el *.msi en el servidor (dado que esta alquilado, no me dan esa autorizacion).
Es asi?.
Hay alguna solucion para poder usar el CR?. Yo lo implemente con el VB4/5/6 y ahora estoy probando con el report viewer y no es lo mismo.
Gracias.
Hola Heruvy, definitivamente necesitas el runtime, de aquí los puedes descargar los .msi para la versión y arquitectura que estes usando: CRRedist
Con respecto a tu hosting, si tienes permisos de instalación nomás podrías hacerlo, es un hosting virtualizado donde tiene todo el acceso o el modo tradicional nada mas? En todo caso puedes ponerte en contacto con tu hosting para que te instalen los paquetes que te faltan, los cuales inicialmente no deberían tener costo ya que los runtimes son gratuitos..
help
estoy desarrollando un sys en web desde C# con sql y desplegando en apache tomcat sobre WXP
y no he tenido mayor inconveninte hasta llgad alos reportes en Crystal Reports me sale el siguiente mensaje :
Error 7 The return type 'CrystalDecisions.Web.CrystalReportViewer' of the method 'CrystalDecisions.Web.CrystalReportViewer ASP.rpt_webform1_aspx::__BuildControlCrystalReportViewer()' is not supported. c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Filesweba65ff6e75678ef49App_Web_vgtcypxt.0.cs 16707566 1 Web
y no puedo incluir el reporte en la solucion
PF ayudaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Por favor, siguelo en un solo hilo: http://www.devtroce.com/2010/01/11/desplegar-asp-…
Hola nuevamente Ozkar911, te he respondido en tu comentario anterior, lo hare mas detallado esta vez, si lo anterior no te ha cerrado del todo.
En el ejemplo que he puesto arriba si te fijas, el reporte se alimenta de un procedimiento almacenado, o mejor llamado en postgreSQL: una funcion con el nombre slc_usuarios().
Si te fijas bien esa funcion dentro tiene una instruccion SQL:
<pre lang="plsql">Select * from usuarios;</pre>
y devuelve todos lo registros de esa tabla. Luego la aplicacion mapea sus campos tal cual la funcion, por ende tal cual la tabla.
Si desea puedes cambiar el query SQL de la funcion, por ejemplo asi:
<pre lang="plsql">Select tabla1.Campo1, tabla1.Campo2, tabla2.Campo3, tabla2.Campo4 from tabla1 join tabla2 on tabla1.Campo1 = tabla2.Campo1</pre>
Asi tendras varias columnas de varias tablas, y luego el DataTable del VB lo mapeas segun la cantidad y tipos de datos que devuelve tu nueva funcion.
Finalmente organizas tu reporte con el nuevo DataTable que acabas de mapear.
Se comprende mejor ahora? avisame que tal te va y si dudas algo, simplemente vuelve a preguntar, que no es molestia alguna compartir.
Muy buen ejemplo, Gracias!..
Pero si quisiera mostrar un reporte que contenga datos de varias tablas ?
Muy buen ejemplo, gracias..
Pero, si quiero mostrar un reporte que contenga datos de varias tablas relacionadas que debo hacer??
Eso es relativamente sencillo Ozkar911, inicialmente tienes 2 maneras de hacerlo:
Dentro del DataSet puedes crear varios DataTable que se relacionen entre si.
La opcion que mas me gusta, puedes crear un Procedimiento Almacenado que devuelva los valores que necesitas con los JOIN correspondientes en el SELECT SQL, y el mapeo del DataTable lo haces de acuerdo a tu SP en vez de la tabla.
<div>Comentanos que tal te ha ido
</div>
HOLA, DESDE TU COMENTARIO YA PASO MUCHO TIEMPO PERO TENGO UNA DUDA, COMO HAGO EL MAPEO DE MI LOS DATATABLE
Carmen, no esta completo tu mensaje, podrías volver a escribirlo?
como se hace eso de mantenimiento????
Aqui pueden encontrar para descargar la versin oficial del sitio
http://www.sap.com/solutions/sapbusinessobjects/s…
El express tambien trae normalmente el CR Express.. si no lo ven vayan a panel de control –> Agregar o quitar programas –> buscar Visual Studio –> y seleccionar el modo mantenimiento para agregar las nuevas funciones..
ami tampoco me aparece, aunque la verdad solo tengo instalado el visual basic 2008 express y no se que tengo que hacer para eliminarlo y descargarme el visual studio que parece ser si tiene lo del reporte y crystal
Fijate si estabas en la seccion "Reporting" en la zona izquierda. Si aun asi no aparece es porque cuando hiciste la instalacion del Visual Studio, no seleccionaste instalar el Crystal, lo mas seguro es que lo solucionarias cargando tu disco de instalación de nuevo, y seleccionar mantenimiento –> agregar nuevas caracteristicas –> ahi buscas el reporteado y listo.. sin con eso no funciona pasame mas detalles y vermos que hacer..
Hola oye esta super tu ejemplo, mi problema es que no me aparece la plantilla de crystal report y no se por que?, espero que puedas ayudarme en ese aspecto