Você está na página 1de 7

Crear Reportes con Visual Basic .

Net, PostgreSQL y Crystal Report


La mayora 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 integracin con el IDE de Visual Studio, para facilitar la creacin de los mismos. Cuando hablamos de motores como PostgreSQL, MySQL, Firebird, Teradata y otros, no tenemos la integracin 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, slo se debe seguir unos pasos distintos, que tambin 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 funcin de PostgreSQL. Creamos la BD con el siguiente Script:
1 CREATE DATABASE "DevTroce" WITH 2 OWNER = "postgres" 3 ENCODING = 'UTF8' 4 TEMPLATE = "postgres" 5 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


INSERT INTO "Usuarios" ("CodUsuario", "Nombres", "Apellidos", 1 "WebFavorita", "Telefono") VALUES 2 (1, 'Javier', 'Sosa', 'www.devtroce.com', '476323'), 3 (2, 'Mariela', 'Schum', 'www.facebook.com', '43083-0'), 4 (3, 'Jose', 'Martinez', NULL, '4837612'), 5 (4, 'Mirella', 'Troche', 'www.orkut.com', '865558'), 6 (5, 'Josefina ', 'Mongelos', 'www.google.com', ''), 7 (6, 'Mirna ', 'Rivas', 'www.devtroce.com', '4350098');

La funcin (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, quedara 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 diseo, 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 quedara as, deben entender que el diseo es minimalista slo a modo de ejemplo, supongo que uds harn un diseo 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. Cdigo que necesitamos escribir es el siguiente, todo ir dentro del formulario principal, donde tenemos el logo y el boton que se vern en la imgen final para que puedan copiarlo.
1 Public Class frmPgReport 2 'Declarar Objeto de Conexion 3 Dim cnConexion As Npgsql.NpgsqlConnection 4 'Objeto Comando 5 Dim cmComando As Npgsql.NpgsqlCommand 6 'Declarar Variable para almacenar String de Conexion a la BD 7 Dim ConnString As New System.Text.StringBuilder("") 8 9 'Construi la cadena de Conexion 10 Private Sub CrearCadenaConexion() 11 ConnString.Append("Host=;") 12 ConnString.Append("Database=;") 13 ConnString.Append("User ID=;") 14 ConnString.Append("Password=;") 15 ConnString.Append("Port=5432;") 16 ConnString.Replace("", "127.0.0.1") 17 ConnString.Replace("", "DevTroce") 18 ConnString.Replace("", "postgres") 19 ConnString.Replace("", "postgres") 20 End Sub 21 22 Private Sub CargarUsuarios() 23 Try 24 Me.Cursor = Cursors.WaitCursor 25 'Armar la cadena 26 CrearCadenaConexion() 27 'Instanciar el objeto de conexion 28 cnConexion = New 29 Npgsql.NpgsqlConnection(Convert.ToString(ConnString))

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

'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 conexin a la BD pueden ver mejores maneras de hacerlo, sta es slo una y bastante corta para no abordar mucho ese tema.

Você também pode gostar