Informes Crystal Reports

Fecha: 10/Feb/2005 (09/02/2005)
Autor: Juan Gabriel Castillo Turrubiates jgcastillo@uat.edu.mx

 


     En esta ocasión veremos la manera de mostrar un reporte sencillo. La apariencia final de nuestra aplicación será la siguiente:

 

Al presionar el botón Imprimir, se abrirá la siguiente pantalla:

Nuestro proyecto de llama proReportes, y deberá quedar organizado de la siguiente manera:

Utilizamos una base de datos llamada dbPrac.mdb, la cual contiene una tabla llamada CAT_CLIENTES. En el archivo adjunto viene tal base de datos. Por adelantado te digo que esta conformada (la tabla) de la siguiente manera:

 
Campo Tipo Descripción
ID_CLIENTE TEXTO Campo llave
PATERNO Texto Apellido paterno
MATERNO Texto Apellido materno
NOMBRE Texto Nombre
RFC Texto RFC
DIRECCION Texto Dirección
TELEFONO Texto Telefono
LIM_CRED Doble Límite de crédito

Al formulario frmCatClientes, le agregamos 8 TextBox y 8 Label, con las siguientes características:

Objeto(nombre) Tipo Propiedad Valor
txtID_CLIENTE TextBox Text (vacío)
txtPATERNO TextBox Text (vacío)
txtMATERNO TextBox Text (vacío)
txtNOMBRE TextBox Text (vacío)
txtRFC TextBox Text (vacío)
txtDIRECCION TextBox Text (vacío)
txtTELEFONO TextBox Text (vacío)
txtLIM_CRED TextBox Text (vacío)
lblID_CLIENTE Label Text Clave
lblPATERNO Label Text Paterno:
lblMATERNO Label Text Materno:
lblNOMBRE Label Text Nombre:
lblRFC Label Text RFC
lblDIRECCION Label Text Dirección:
lblTELEFONO Label Text Teléfono:
lblLIM_CRED Label TExt Límite de crédito
Images ImageList
barBotones ToolBar

Agrega imágenes al ImageList y botones al ToolBar (que se parezcan a las arriba mostradas). En el archivo adjunto incluiré las imágenes (en realidad son iconos) que utilice para este ejemplo. 

Agrega también un MainMenu como se muestra:

Al formulario frmReportes, agrega un CrystalReportViewer y ponle como nombre crvReportes, y el la propiedad Dock del Viewer selecciona Fill. El formulario debe quedar como se muestra:

Ahora agregaremos un DataSet, este nos servirá para enlazar nuestro reporte con los datos. Pon mucha atención a lo que a continuación se muestra:

1. Agrega un nuevo elemento(DataSet ):

Aparece algo como lo siguiente:

2. Selecciona Explorador de Servidores.

3. Con el botón derecho del mouse, sobre Conexiones de datos, selecciona Agregar conexión...

4. Conéctate a la base de datos de Access:

5. Después de lo anterior, aparece (más o menos) así el Explorador de servidores:

6. Expande la conexión (tal como se muestra en la figura) y arrastra la tabla CAT_CLIENTES como se muestra:

7. Cierra el Explorador de servidores, graba los cambios y ¡listo!, terminamos el DataSet.

Ahora crearemos nuestro reporte:

1. Agrega un nuevo elemento al proyecto (CrystalReports ). Pon el nombre rptCatClientes y presiona Abrir:

2. Selecciona Mediante el asistente de informes y presiona Aceptar:

3. Expande como se muestra a continuación:

4. Selecciona la tabla CAT_CLIENTES y presiona el botón Insertar tabla. Presiona Siguiente.

5. Agrega todos los campos (con el botón Agregar). Ve a la casilla Estilo, escribe el título del reporte (Catalogo de Clientes) y presiona Finalizar.

Ahora vamos a programar ...

Código:

Primero el código de clsMain:


Public Class clsMain
    ''Esta es la cadena de conexión
    ''Es necesaria para obtener conectividad con la base de datos
    Public CnnStr As String = _
            "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=..\Data\dbPrac.mdb;" & _
            "Persist Security Info=False "
End Class

Después del código del formulario (frmCatClientes):

''Programador: JUAN GABRIEL CASTILLO TURRUBIATES(poner tu nombre)
'' las instrucciones Imports, van antes de cualquier otra instrucción
Imports System.Data.OleDb
Imports CrystalDecisions.CrystalReports.Engine
Public Class frmCatClientes
    Inherits System.Windows.Forms.Form
    ''una instancia a la clase clsMain
    Dim miClsMain As New clsMain()
    ''Declaramos una conexión
    Dim cnnCatClientes As New OleDbConnection(miClsMain.CnnStr)
    ''Declaramos un Comando
    Dim cmdCatClientes As New OleDbCommand("SELECT * " & _
                            "FROM CAT_CLIENTES", cnnCatClientes)
    ''Declaramos un Data Adapter
    Dim daCatClientes As New OleDbDataAdapter(cmdCatClientes)
    ''Un DataSet
    Dim dsCatClientes As New DataSet()
    ''''y por último, el importantísimo Command Builder
    Dim cbCatClientes As New OleDbCommandBuilder(daCatClientes)
    Private Sub frmCatClientes_Load(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles MyBase.Load
        Inicializar()
        HabilitaBotones(True)
        HabilitaCaptura(False)
    End Sub
    Private Sub Imprimir()
        Try
            'Código para mostrar el reporte
            'Lo primero que hacemos es declarar una instancia
            'del data set dsRepCatClientes
            Dim mi_dsRepCatclientes As New dsRepCatClientes()
            'Lo llenamos con el contenido de la tabla CAT_CLIENTES
            daCatClientes.Fill(mi_dsRepCatclientes, "CAT_CLIENTES")
            'Declaramos una instancia del Reporte
            Dim mi_rptCatClientes As New rptCatClientes()
            'Le indicamos al reporte que tome los datos
            'del DataSet
            mi_rptCatClientes.SetDataSource(mi_dsRepCatclientes)
            'Delcaramos una instancia del formulario frmReprotes
            Dim miForma As New frmReportes()
            'Le indicamos que debe mostrar mi_rptCatClientes
            miForma.crvReportes.ReportSource = mi_rptCatClientes
            'que muestre el titulo "Reporte de Clientes"
            miForma.Text = "Reporte de Clientes"
            'Mostramos el formulario (el cual contiene el reporte)
            miForma.Show()
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Imprimir", _
            MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
    Private Function BuscarRegistro(ByVal prmPos As Integer) As Integer
        'Código para buscar un registro
        'Recibe como parámetro la posición actual en el DataSet
        'para, en el caso de no encontrar el registro solicitado,
        'regresar la posición del registro antes de iniciar.
        'Lo que hace este procedimiento es
        'regresar la posición en la que se encuentra el registro
        'solicitado, en caso de no encontrarlo, regresa la posición
        'antes de iniciar la búsqueda
        Try
            Dim dvCatClientes As DataView = _
                    New DataView(dsCatClientes.Tables(0), "", _
                    "ID_CLIENTE", DataViewRowState.CurrentRows)
            'Declaramos varID_CLIENTE
            Dim varID_CLIENTE As String = ""
            'Preguntamos la clave del cliente que se desea buscar
            varID_CLIENTE = InputBox("Introduce la clave a buscar", "Buscar")
            If Not varID_CLIENTE = "" Then
                'Regresamos el index del cliente encontrado
                Return dvCatClientes.Find(varID_CLIENTE)
                Exit Function
            Else
                'Si no se especificó el cliente, regresamos la
                'posición (index) del cliente original(prmPos)
                MessageBox.Show("La búsqueda no se puede realizar", _
                "Información del sistema", MessageBoxButtons.OK, _
                MessageBoxIcon.Information)
                Return prmPos
                Exit Function
            End If
        Catch ex As Exception
            'En caso de error, suponiendo que no se encontró el cliente,
            'regresamos la posición original del cliente(prmPos)
            MessageBox.Show(ex.Message, "Error", _
            MessageBoxButtons.OK, MessageBoxIcon.Error)
            Return prmPos
            Exit Function
        End Try
    End Function
    Private Sub Actualizar()
        Try
            dsCatClientes.Clear() 'Limpiar el DataSet
            daCatClientes.Fill(dsCatClientes, "CAT_CLIENTES")
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Información del sistema", _
            MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
    Private Sub Inicializar()
        Try
            With cnnCatClientes
                ''Verificamos el estado de la conexión
                If .State = 1 Then 'si esta abierta
                    .Close()    'cerramos
                End If
                .Open() '' abrimos la conexión
            End With
            ''Cargamos el DataSet Con los datos de La tabla
            daCatClientes.Fill(dsCatClientes, "CAT_CLIENTES")
            ''Enlazamos los Objetos
            txtID_CLIENTE.DataBindings.Add("Text", dsCatClientes, _
                "CAT_CLIENTES.ID_CLIENTE")
            txtPATERNO.DataBindings.Add("Text", dsCatClientes, _
                "CAT_CLIENTES.PATERNO")
            txtMATERNO.DataBindings.Add("Text", dsCatClientes, _
                "CAT_CLIENTES.MATERNO")
            txtNOMBRE.DataBindings.Add("Text", dsCatClientes, _
                "CAT_CLIENTES.NOMBRE")
            txtRFC.DataBindings.Add("Text", dsCatClientes, _
                "CAT_CLIENTES.RFC")
            txtDIRECCION.DataBindings.Add("Text", dsCatClientes, _
                "CAT_CLIENTES.DIRECCION")
            txtTELEFONO.DataBindings.Add("Text", dsCatClientes, _
                "CAT_CLIENTES.TELEFONO")
            txtLIM_CRED.DataBindings.Add("Text", dsCatClientes, _
                "CAT_CLIENTES.LIM_CRED")
        Catch ex As Exception
            ''Esto ocurriría solo en el caso de que ocurra un error
            MessageBox.Show(ex.Message, "Info del Sistema", _
            MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub
    Private Sub Grabar()
        Try
            'Indicamos que termine la edición actual
            Me.BindingContext(dsCatClientes, _
            "CAT_CLIENTES").EndCurrentEdit()
            'Actializamos la Base de datos
            daCatClientes.Update(dsCatClientes, "CAT_CLIENTES")
            HabilitaBotones(True)
            HabilitaCaptura(False)
        Catch ex As Exception
            MsgBox(ex.Source & "; " & ex.Message, _
            MsgBoxStyle.OKOnly, "Ocurrió un error")
        End Try
    End Sub
    Private Sub Nuevo()
        Try
            'Indicamos que termine la edición actual
            Me.BindingContext(dsCatClientes, _
            "CAT_CLIENTES").EndCurrentEdit()
            'Preparamos al DataSet para aceptar un Registro nuevo
            Me.BindingContext(dsCatClientes, "CAT_CLIENTES").AddNew()
            HabilitaBotones(False)
            HabilitaCaptura(True)
        Catch ex As Exception
            MsgBox(ex.Source & "; " & ex.Message)
        End Try
    End Sub
    Private Sub Eliminar()
        ''Este procedimiento es el encargado de eliminar un registro.
        ''Lo que hacemos es obtener la posición en la que nos encontramos
        ''Y después eliminamos el registro que se encuentra en esa posición
        ''Otra manera de eliminar seria ejecutar una instrucción SQL que
        ''elimine el registro (de acuerdo con la ID_CLIENTE)
        ''y después ejecutar el procedimiento Inicializar.
        Dim Resp As String
        Try
            Resp = MsgBox("¿Esta seguro de eliminar el registro? " & _
            vbCrLf & "Nota: Eliminar registros puede perjudicar " & _
            "la ejecución.", MsgBoxStyle.OKCancel, "Eliminar Registro")
            If Resp = vbOK Then
                Dim Registro As Integer
                Registro = Me.BindingContext(dsCatClientes, _
                    "CAT_CLIENTES").Position
                Me.BindingContext(dsCatClientes, _
                    "CAT_CLIENTES").EndCurrentEdit()
                Me.BindingContext(dsCatClientes, _
                    "CAT_CLIENTES").RemoveAt(Registro)
                daCatClientes.Update(dsCatClientes, "CAT_CLIENTES")
                Me.BindingContext(dsCatClientes, _
                    "CAT_CLIENTES").Position = 0
            End If
        Catch ex As Exception
            MsgBox(ex.Source & "; " & ex.Message, _
            MsgBoxStyle.OKOnly, "Ocurrió un error")
        End Try
    End Sub
    Private Sub Cancelar()
        Try
            'Cancelamos
            Me.BindingContext(dsCatClientes, _
                "CAT_CLIENTES").CancelCurrentEdit()
            HabilitaBotones(True)
            HabilitaCaptura(False)
        Catch ex As Exception
            MsgBox(ex.Source & "; " & ex.Message, _
            MsgBoxStyle.OKOnly, "Ocurrió un error")
        End Try
    End Sub
    Private Sub HabilitaBotones(ByVal Habilitar As Boolean)
        btnInicio.Enabled = Habilitar
        btnAnterior.Enabled = Habilitar
        btnSiguiente.Enabled = Habilitar
        btnFinal.Enabled = Habilitar
        btnNuevo.Enabled = Habilitar
        mnuNuevo.Enabled = Habilitar
        btnModificar.Enabled = Habilitar
        mnuModificar.Enabled = Habilitar
        btnEliminar.Enabled = Habilitar
        mnuEliminar.Enabled = Habilitar
        btnBuscar.Enabled = Habilitar
        mnuBuscar.Enabled = Habilitar
        btnActualizar.Enabled = Habilitar
        btnImprimir.Enabled = Habilitar
        btnGrabar.Enabled = Not Habilitar
        mnuGrabar.Enabled = Not Habilitar
        btnCancelar.Enabled = Not Habilitar
        mnuCancelar.Enabled = Not Habilitar
        btnSalir.Enabled = Habilitar
        mnuSalir.Enabled = Habilitar
    End Sub
    Private Sub HabilitaCaptura(ByVal Habilitar As Boolean)
        txtID_CLIENTE.Enabled = Habilitar
        txtPATERNO.Enabled = Habilitar
        txtMATERNO.Enabled = Habilitar
        txtNOMBRE.Enabled = Habilitar
        txtRFC.Enabled = Habilitar
        txtDIRECCION.Enabled = Habilitar
        txtTELEFONO.Enabled = Habilitar
        txtLIM_CRED.Enabled = Habilitar
    End Sub
    Private Sub barBotones_ButtonClick(ByVal sender As System.Object, _
    ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) _
    Handles barBotones.ButtonClick
        Select Case barBotones.Buttons.IndexOf(e.Button)
            Case Is = 0
                Try
                    Me.BindingContext(dsCatClientes, "CAT_CLIENTES").Position = 0
                Catch ex As Exception
                    MsgBox(ex.Source & "; " & ex.Message)
                End Try
            Case Is = 1
                Try
                    Me.BindingContext(dsCatClientes, "CAT_CLIENTES").Position -= 1
                Catch ex As Exception
                    MsgBox(EX.Source & "; " & EX.Message)
                End Try
            Case Is = 2
                Try
                    Me.BindingContext(dsCatClientes, "CAT_CLIENTES").Position += 1
                Catch ex As Exception
                    MsgBox(EX.Source & "; " & EX.Message)
                End Try
            Case Is = 3
                Try
                    Me.BindingContext(dsCatClientes, "CAT_CLIENTES").Position = _
                    Me.BindingContext(dsCatClientes, "CAT_CLIENTES").Count - 1
                Catch ex As Exception
                    MsgBox(EX.Source & "; " & EX.Message)
                End Try
            Case Is = 6
                Nuevo()
            Case Is = 7
                'Modificar
                HabilitaBotones(False)
                HabilitaCaptura(True)
            Case Is = 8
                Eliminar()
            Case Is = 9
                'Buscar registro
                Me.BindingContext(dsCatClientes, "CAT_CLIENTES").Position = _
                BuscarRegistro(Me.BindingContext(dsCatClientes, "CAT_CLIENTES").Position)
            Case Is = 10
                Actualizar()
            Case Is = 11
                Imprimir()
            Case Is = 12
                Grabar()
            Case Is = 13
                Cancelar()
            Case Is = 14
                'Salir(cerrar el formulario)
                Me.Close()
        End Select
    End Sub
End Class

Cualquier duda o comentario, mandame un mail a jgcastillo@uat.edu.mx

Espacios de nombres usados en el código de este artículo:

System.Data.OleDb
CrystalDesisions.CrystalReports.Engine

 


ir al índice

Fichero con el código de ejemplo: TheKin_proReportes.zip - 44 KB