¿Cómo hacer un informe sin usar Crystal Reports?

Gran expertos mi saludo y agradecerte tu ayuda tan urgente, estoy haciendo un proyectito de visual basic 2005, qe se conecta a mysql 5, tengo mis forms, ahora quiero hacer mis reportes no se si esta version viene el datareport como basic 6.0 creo qe no, la idea es qe no quiero hacerlo con cristal porqe casi nunca lo use, pero aqui encontre el control reportwiever no si es del mismo cristal report o es otro individual para hacerlo.

1 Respuesta

Respuesta
1
Huy!, mira la vdd si se puede hacer con el ReportViewer, y yo los se hacer inlcuso sin la llamada al servidor de reportes de ReportingServices, es decir, todo queda en tu aplicacion, pero es mucha talacha, te puedo pasar un ejemplo que tengo en VB.net para que lo revises, mi correo es [email protected]
muchas gracias experto por tu ayuda este es mi email: [email protected], haber si me envias ese ejemplito qe tienes muchas gracias
Espero te sirva, analizalo muy bien, no se entiende a la primera, dimelo a mi, pero con la actitud adecuada se logran las cosas, si tienes alguna duda hazmelo saber, no tengo mucho tiempo libre pero seguro te podré responder asi como aquellos que les sirva esta información.
Ejemplo reporte con clases y objetos como origen de datos:
Creas un Nuevo Proyecto del Tipo Biblioteca de Clases en el cual vas a generar tantas clases como necesites, para un solo reporte se necesitas 2 clases, la primer clase es la que contendrá los campos de un solo registro es decir, cada registro de tu consulta lo convertirás en un nuevo objeto de esta clase, y mediante sus propiedades públicas de dicha clase iras diseñando el informe, aquí tienes el ejemplo de la primera clase:
Namespace clasesReportes
    Public Class cRegCatalogo
        Private _Id As Integer
        Private _DCorta As String
        Private _DLarga As String
        Private _Nombre As String
        Public Property ID() As Integer
            Get
                Return _Id
            End Get
            Set(ByVal value As Integer)
                _Id = value
            End Set
        End Property
        Public Property DCorta() As String
            Get
                Return _DCorta
            End Get
            Set(ByVal value As String)
                _DCorta = value
            End Set
        End Property
        Public Property DLarga() As String
            Get
                Return _DLarga
            End Get
            Set(ByVal value As String)
                _DLarga = value
            End Set
        End Property
        Public Property Nombre() As String
            Get
                Return _Nombre
            End Get
            Set(ByVal value As String)
                _Nombre = value
            End Set
        End Property
    End Class
End Namespace

Como podrás notar, es una clase que solo contiene propiedades públicas con sus respectivos bloques de set y get, la cantidad de propiedades públicas la determina el número de campos que contiene tu registro, con campos, me refiero a las columnas. Espero no tengas problemas con esto de las clases (de ser así te recomiendo que te leas algo sobre esto porque se te dificultara mas).
Yo tengo una clase base que tiene las variables que utilizo en todos mis reportes y es esta:
Imports System.Data.SqlClient
Namespace clasesReportes
    Public Class ClaseBaseReportes
        Friend strConexion As String
        Friend sqlConx As New SqlConnection
        Friend lstrConnString As String
        Friend lsqlCmd As New SqlCommand
        Friend lsqlAdapter As SqlDataAdapter
        Friend lsqlDataTable As New DataTable
        Friend lstrSelectCmd As String
        Friend lsqlDataRow As DataRow
    End Class
End Namespace

Como siguiente paso tenemos que Generar una clase que nos permitirá realizar la respectiva consulta a la Base de Datos para traer los registros que necesitemos y como te darás cuenta se hereda de la clase de arriba, eso solo es para evitarme la fatiga de repetir las mismas variables en cada clase como esta.
Ejemplo:
Imports System.Data.SqlClient
Namespace clasesReportes
    Public Class cDsCatalogo Inherits ClaseBaseReportes
        Private _Tabla As String
        Private _nombre As String
        Private lstCatalogo As List(Of cRegCatalogo)
        Public Sub New(ByVal strTabla As String, ByVal nombre As String)
            _Tabla = strTabla
            _nombre = nombre
        End Sub
        Public Function GetCatalogo() As List(Of cRegCatalogo)
            Dim lRegCatalogo As cRegCatalogo
            Try
                lstCatalogo = New List(Of cRegCatalogo)
                lstrConnString = strConexion
                sqlConx.ConnectionString = lstrConnString
                sqlConx.Open()
                lstrSelectCmd = "SELECT * FROM " & _Tabla & " WHERE SitReg='A'"
                lsqlAdapter = New SqlDataAdapter(lstrSelectCmd, sqlConx)
                lsqlAdapter.Fill(lsqlDataTable)
                If lsqlDataTable.Rows.Count > 0 Then
                    For Each lsqlDataRow In lsqlDataTable.Rows
                        lRegCatalogo = New cRegCatalogo
                        With lRegCatalogo
                            .ID = IIf(IsDBNull(lsqlDataRow("ID")), "", lsqlDataRow("ID"))
                            .DCorta = IIf(IsDBNull(lsqlDataRow("DCorta")), "", lsqlDataRow("DCorta"))
                            .DLarga = IIf(IsDBNull(lsqlDataRow("DLarga")), "", lsqlDataRow("DLarga"))
                            .Nombre = _nombre
                        End With
                        lstCatalogo.Add(lRegCatalogo)
                    Next
                End If
            Catch ex As Exception
                MsgBox(ex.Message)
                'Throw ex
            Finally
                If sqlConx.State = ConnectionState.Open Then
                    sqlConx.Close()
                End If
            End Try
            Return lstCatalogo
        End Function
    End Class
End Namespace

Como te podrás dar cuenta lo que hace la clase de arriba es realizar una consulta dentro de una función y a su vez recorre todos los resultados y por cada registro crea un nuevo objeto de la primera clase y una vez asignadas con un valor todas sus propiedades públicas, agrega ese objeto a una lista de objetos (List donde T es el tipo de dato, y el tipo de dato es el de tu primer clase).
Cuando tienes estas dos clases, le das un clic derecho al proyecto (en la ventana explorador de soluciones), limpias la solución y la vuelves a generar, si no te marca ningún error ve al menú datos y le das clic en la opción Agregar Nuevo Origen de Datos, y marcas la opción Objeto, le das siguiente y si todo lo anterior esta correcto, deberás ver los espacios de nombre que tienes en tu proyecto y todas las referencias, etc. etc. etc., como siguiente paso deberás elegir la clase que tiene definidas tus propiedades públicas, ya que ésta se convertirá en tu origen de datos le das siguiente y finalizar.
Ahora ya estás listo para diseñar el informe, esto se hace como en Reporting Services pero con algún par de limitaciones de las que ya te estaras danto cuenta, agregas un nuevo archivo del tipo informe, ya que estés en el diseño del informe, veras que tu origen de datos es tu propia clase si te preguntas y cómo demonios trae datos si solo está definiendo los campos de cada registro, ahhh, yo me hice la misma pregunta no desesperes, Arrastra campos, dale formato y haz lo que tengas que hacer con el diseño una vez que ya lo tienes agrega un Formulario en tu proyecto, y en él un control ReportViewer, el cual lo ligaras a tu informe diseñado por medio de un triangulito que aparece en la parte superior derecha del control, una vez hecho esto, en el evento load de tu form tener este código:
Dim objDsCCausaCancela As New cDsCatalogo("Jur.CEstatus", "Estatus")
objDsCCausaCancela.strConexion = Conex
Me.cRegCatalogoBindingSource.DataSource = objDsCCausaCancela.GetCatalogo()
Me. ReportViewer1. RefreshReport()

Y como te daras cuenta lo unico que se hace es en la Propiedad DataSource del BindingSource, que se crea automaticamente al ligar el informe con el ReportViewer, es asignar la funcion que reliza la consulta la cual devuelve un listado de objetos, que analogicamente es como una Tabla, solo que cada registro esta compuesto por un objeto y a su vez estos objetos contenidos en una Listgado generico, el cual se utiliza como origen de datos, por medio del BindingSource, eso es todo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas