Informes Crystal Reports Fecha: 10/Feb/2005 (09/02/2005)
|
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 [email protected]
Espacios de nombres usados en el código de este artículo:
System.Data.OleDb
CrystalDesisions.CrystalReports.Engine
Fichero con el código de ejemplo: TheKin_proReportes.zip - 44 KB